代码如下。
我正在尝试导航到网站并阅读信息,问题是导航不起作用,唯一被调用的事件是导航并且打印的 Url 为空,其他事件从未被调用。
我缺少什么?我必须使用 Form 类才能导航吗?我不能从控制台应用程序以编程方式使用它吗?
请帮忙。
class WebNavigator
{
private readonly WebBrowser webBrowser;
public WebNavigator()
{
webBrowser = new WebBrowser
{
AllowNavigation = true
};
webBrowser.Navigated += webBrowser_Navigated;
webBrowser.Navigating += webBrowser_Navigating;
webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;
}
// Navigates to the given URL if it is valid.
public void Navigate(string address)
{
if (String.IsNullOrEmpty(address)) return;
if (address.Equals("about:blank")) return;
if (!address.StartsWith("http://") &&
!address.StartsWith("https://"))
{
address = "http://" + address;
}
try
{
Trace.TraceInformation("Navigate to {0}", address);
webBrowser.Navigate(new Uri(address));
}
catch (System.UriFormatException)
{
Trace.TraceError("Error");
return;
}
}
// Occurs when the WebBrowser control has navigated to a new document and has begun loading it.
private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
Trace.TraceInformation("Navigated to {0}", webBrowser.Url);
}
// Occurs before the WebBrowser control navigates to a new document.
private void webBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
Trace.TraceInformation("Navigating to {0}", webBrowser.Url);
}
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var wb = sender as WebBrowser;
Trace.TraceInformation("DocumentCompleted {0}", wb.Url);
}
}
我会利用等待/异步.
Usage:
static async void DoWork()
{
var html = await GetHtmlAsync("http://www.google.com/");
}
实用方法
static Task<string> GetHtmlAsync(string url)
{
var tcs = new TaskCompletionSource<string>();
var thread = new Thread(() =>
{
WebBrowser wb = new WebBrowser();
WebBrowserDocumentCompletedEventHandler documentCompleted = null;
documentCompleted = async (o, s) =>
{
wb.DocumentCompleted -= documentCompleted;
await Task.Delay(2000); //Run JS a few seconds more
tcs.TrySetResult(wb.DocumentText);
wb.Dispose();
Application.ExitThread();
};
wb.ScriptErrorsSuppressed = true;
wb.DocumentCompleted += documentCompleted;
wb.Navigate(url);
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return tcs.Task;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)