0

我在我的 Web 应用程序中使用 WebBrowser Control。在 DocumentCompleted 事件中,我希望我的字符串中有 DocumentText。我的 DocumentCompleted 事件如下所示。

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    string str = IEBrowser.DocumentText;
}

现在的问题是 DocumentText 我希望我没有在 DocumentCompleted 事件中得到它。我认为有一些 javascript 在 DocumentCompleted 事件之后执行操作。所以我改变我的代码是这样的。

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    Thread th = new Thread(new ThreadStart(startthread));
    th.Start();              
}

public void startthread()
{
   //To Wait untill WebBrowser run that javascript
   Thread.Sleep(5000);
   string str = IEBrowser.DocumentText; 
}

现在有了这段代码,我得到“指定的演员表无效。”。如何等待运行 WebBrowser 的线程?

4

2 回答 2

1

虽然我认为这不是一个好方法,但一种方法是:不要在 DocumentComplete 中处理它。做这样的事情:

  1. 做你需要做的任何事情......然后浏览器需要导航到一个url,然后(你可能需要检查语法,只需输入我的标题):

                IEBrowser.Navigate(url);
            bool flag = true;
            int times = 0;
            while (flag)
            {
                Sleep(500);
                Application.DoEvent();
    
                if (IEBrowser.ReadyState == WebBrowserReadyState.Complete)
                {
                    times ++;
                }
                else
                {
                    times = 0;
                }
    
                if (times >= 10)
                {
                    flag = false;
                }
            }
    
            string str = IEBrowser.DocumentText;
    

同样,这只是一个供您尝试的解决方法。取决于您的目的,这可以改进很多。但是我在许多刮削工作中都使用了与此类似的过程,并且效果很好。取决于页面,documentComplete 可能会被触发多次。

祝你好运

于 2012-10-11T17:36:00.270 回答
0

我不太确定您在这里做什么,但我可以向您保证,启动该线程不是正确的解决方案。

试试这个,因为 IEBrowser_DocumentCompleted 在我的经验中应该被调用几次......

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {     
if (IEBrowser.ReadyState = WebBrowserReadyState.Complete)         
     {
       //Do my stuff
     }
}

不知道这是否对你有用,但我过去已经取得了成功......

于 2012-10-11T17:18:18.433 回答