c#浏览器.ReadyState不会在DocumentCompleted事件中达到完整状态

本文关键字:状态 事件 DocumentCompleted ReadyState 浏览器 | 更新日期: 2023-09-27 18:15:53

我的小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循环,但然后,在导航()命令后,它进入第二个循环,从来没有出来过。怎么会?我已经在调试模式下检查了一遍又一遍,检查了每一步。

我肯定可以听取你的建议来更好地组织这个项目。xD

c#浏览器.ReadyState不会在DocumentCompleted事件中达到完整状态

两年了,我不知道它会有帮助!!但对于其他人来说,主线程正忙于你的while循环所以浏览器对象不能做任何事情,你需要实现这个

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

或使用
Application.DoEvents()
,这将使你的主线程循环一次,并使web浏览器对象加载它的资源,如javascript文件