要收集網頁上的信息,我可以使用WebBrowser.Navigated
事件。如何調用WebBrowser導航瀏覽多個網址?
首先,導航到的網址:
WebBrowser wbCourseOverview = new WebBrowser();
wbCourseOverview.ScriptErrorsSuppressed = true;
wbCourseOverview.Navigate(url);
wbCourseOverview.Navigated += wbCourseOverview_Navigated;
然後處理網頁時Navigated
叫做:
void wbCourseOverview_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
//Find the control and invoke "Click" event...
}
困難的部分是當我嘗試去通過URL的字符串數組。
foreach (var u in courseUrls)
{
WebBrowser wbCourseOverview = new WebBrowser();
wbCourseOverview.ScriptErrorsSuppressed = true;
wbCourseOverview.Navigate(u);
wbCourseOverview.Navigated += wbCourseOverview_Navigated;
}
這裏,因爲頁面加載需要時間,所以從未達到wbCourseOverview_Navigated
。
我試着在C#5中使用async
await
。任務和基於事件的異步模式(EAP)可在here中找到。另一個例子可以在The Task-based Asynchronous Pattern中找到。
問題是WebClient
有異步方法,如DownloadDataAsync
和DownloadStringAsync
。但WebBrowser
中沒有NavigateAsync
。
任何專家都可以給我一些建議嗎?謝謝。
在StackOverflow中有一個帖子(here)。但是,有沒有人知道如何在其答案中實現該strut
?
再次更新。
在another post here in StackOverflow建議,
public static Task WhenDocumentCompleted(this WebBrowser browser)
{
var tcs = new TaskCompletionSource<bool>();
browser.DocumentCompleted += (s, args) => tcs.SetResult(true);
return tcs.Task;
}
所以我必須:
foreach (var c in courseBriefs)
{
wbCourseOverview.Navigate(c.Url);
await wbCourseOverview.WhenDocumentCompleted();
}
它看起來不錯,直到我的網頁瀏覽器訪問的第二個URL。
嘗試在任務完成時將任務轉換爲最終狀態。
我知道我必須作出了foreach
循環中一個錯誤。因爲DocumentCompleted
事件在循環到第二輪時未被提升。在foreach
循環中編寫這個await
的正確方法是什麼?
您是否試圖從WebBrowser控件中刮取HTML?如果是這樣,這是一個非常低效的方法,因爲通過加載所有圖像,JavaScript和插件有很多開銷。您可以自己處理HTTP請求,然後在響應中執行一些操作。 – 2013-04-10 18:26:02
如果您閱讀了鏈接的文章,那麼您應該可以使用'Navigate()','Navigated'和'TaskCompletionSource'自己構建'NavigateAsync()'。 – svick 2013-04-10 19:32:53
@CameronTinker,我不僅需要HTML。我想要的是在一些DOM控件上調用Click事件。所以我不會只使用'DownloadStringTaskAsyc'。 – Blaise 2013-04-12 16:30:04