c#webBrowser.ReadyState在DocumentCompleted事件中不会达到Complete状态?

时间:2016-11-02 14:21:11

标签: c#

我的小c#项目有问题。 我需要以某种方式浏览网站,在每个页面上执行一些简单的操作。我的解决方案就是这样:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

        var button = webBrowser1.Document.GetItemById("next_page_button");
        button.InvokeMember("click");
        webBrowser1.Refresh();

        //here's my ugly solution which works

        do {} while (webBrowser1.ReadyState!=WebBrowserReadyState.Complete);

        webBrowser1.Navigate("http://www.webtest.com/page3");
        webBrowser1.Refresh();

        //same method of waiting for loading, causes endless loop this time

        do {} while (webBrowser1.ReadyState!=WebBrowserReadyState.Complete);

        var images = webBrowser1.Document.GetElementsByTagName("img");
        //and then I do stuff with all them images..

所以基本上我的程序检测到webBrowser在第一次使用那个丑陋的while循环时加载了一个页面,但是然后,在navigate()命令之后它进入第二个循环并且永远不会出现它。怎么会? 我已经检查并在调试模式下仔细检查了所有内容,并完成了每一步。

我可以肯定地使用你的建议更好地组织这个程序。 xD

1 个答案:

答案 0 :(得分:0)

两年后,我不知道这会有所帮助!! 但是对于其他人,主线程正忙于while循环,因此webbrowser对象无法执行任何操作,您需要实现

webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler((object sender, WebBrowserDocumentCompletedEventArgs arg) => 
{ 
/// do anything you want with webbrowser document.
})

或使用
Application.DoEvents()
,这将使您的主线程循环一次,然后webbrowser对象加载它的资源,例如javascripts文件。