public static User registerUser()
{
Uri test = new Uri("https://www.example.com/signup");
HtmlDocument testdoc = runBrowserThread(test);
string tosend = "test";
User user = new User();
user.apikey = tosend;
return user;
}
public static HtmlDocument runBrowserThread(Uri url)
{
HtmlDocument value = null;
var th = new Thread(() =>
{
var br = new WebBrowser();
br.DocumentCompleted += browser_DocumentCompleted;
br.Navigate(url);
value = br.Document;
Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
th.Join(8000);
return value;
}
static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var br = sender as WebBrowser;
if (br.Url == e.Url)
{
Console.WriteLine("Natigated to {0}", e.Url);
Console.WriteLine(br.Document.Body.InnerHtml);
System.Console.ReadLine();
Application.ExitThread(); // Stops the thread
}
}
我正在尝试扫描此页面,虽然它确实获得了 HTML,但它不会将其传递回函数调用,而是发回 null(我认为这是后处理)。
我怎样才能使新线程传回其结果?
你的方法有几个问题。
- 你不是等到网页被导航,我的意思是直到
Navigated
事件。因此,在此之前,文档可能为空。 - 您将在 8 秒后退出,如果页面加载时间超过 8 秒,您将无法获得文档。
- 如果未正确加载文档,则会使线程保持活动状态。
- 我想
WebBrowser
控件将无法按预期工作,除非您将其添加到表单中并显示它(它需要在屏幕上可见)。
等。。
不要混淆事情。您的目标不能是使用 WebBrowser
.如果只需要从网页下载字符串,请使用 HttpClient.GetStringAsync。
一旦你得到页面作为字符串格式,如果你想操作html,使用HtmlAgilityPack。
改用 WaitN 而不是默认浏览器模型。有点问题,但现在可以正常工作。
using (var browser = new FireFox("https://www.example.com/signup"))
{
browser.GoTo("https://example.com/signup");
browser.WaitForComplete();
}