winform中使用webBrowser抽取页面中的一些数据。断点“webBrowser1_DocumentCompleted”发现,跑进来了好多次。
DocumentCompleted执行多次,跟踪发现ReadyState状态不一样,分别是Intercative和Complete。
而MSDN对这两种状态值的解释是:
- Complete该控件已完成新文档及其所有内容的加载;
- Interactive该控件已经加载足够的文档以允许有限的用户交互,比如单击已显示的超链接。
增加判断“ReadyState”之后继续,DocumentCompleted仍然执行了两次,但ReadyState状态一样都是Complete。再查原因。
MSDN对其解释是在多个的帧的情况下DocumentComplete获取触发多次。并非每个框架将触发此事件,但触发DownloadBegin事件的每个框架将触发相应的DocumentComplete事件。
最后webBrowser1_DocumentCompleted中的代码是:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { string BrowserUrl = webBrowser1.Url.ToString(); if (String.IsNullOrEmpty(BrowserUrl)) //检查未赋值或空值 return; if (BrowserUrl.Equals("about:blank")) //是否为空白页 return; if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) //状态为完成 return; if (e.Url.ToString() != BrowserUrl) //检查事件url和webBrowser的url return; if (webBrowser1.DocumentText == "") return; ... ... }
还有一点,就是窗体打开就加载webBrowser1,如放在 Form_Load 会使程序界面加载很慢,建议放在 Form_Shown中(每当窗体第一次显示时发生)。