在开始写这个问题之前,我试图解决以下问题
// 1. navigate to page // 2. wait until page is downloaded // 3. read and write some data from/to iframe // 4. submit (post) form
问题是,如果网页上存在iframe,则将触发DocumentCompleted事件,然后触发一次以上(在完成每个文档之后)。程序极有可能试图从DOM中读取未完成且自然发生的数据- 失败。
但是突然在写这个问题 “如果”的时候,怪物 激发了我,我解决了我试图解决的问题。由于我在Google上使用此工具失败,因此我认为将其发布在此处会很好。
private int iframe_counter = 1; // needs to be 1, to pass DCF test public bool isLazyMan = default(bool); /// <summary> /// LOCK to stop inspecting DOM before DCF /// </summary> public void waitPolice() { while (isLazyMan) Application.DoEvents(); } private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { if(!e.TargetFrameName.Equals("")) iframe_counter --; isLazyMan = true; } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (!((WebBrowser)sender).Document.Url.Equals(e.Url)) iframe_counter++; if (((WebBrowser)sender).Document.Window.Frames.Count <= iframe_counter) {//DCF test DocumentCompletedFully((WebBrowser)sender,e); isLazyMan = false; } } private void DocumentCompletedFully(WebBrowser sender, WebBrowserDocumentCompletedEventArgs e){ //code here }
至少就目前而言,我的500万骇客似乎还不错。
也许我在查询Google或MSDN时确实失败了,但是我找不到:“如何在C#中使用Webbrowser控件DocumentCompleted事件?”
备注: 在学习了很多有关webcontrol的知识之后,我发现它确实具有FuNKY的功能。
即使您检测到该文档已完成,在大多数情况下,它也不会永远保持下去。页面更新可以通过几种方式完成- 帧刷新,诸如请求之类的Ajax或服务器端推送(您需要具有一些支持异步通信并具有html或JavaScript互操作的控件)。另外,某些iframe也永远不会加载,因此永远等待它们不是最好的主意。
我最终使用:
if (e.Url != wb.Url)
您可能还想知道AJAX调用。
考虑使用此:
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { string url = e.Url.ToString(); if (!(url.StartsWith("http://") || url.StartsWith("https://"))) { // in AJAX } if (e.Url.AbsolutePath != this.webBrowser.Url.AbsolutePath) { // IFRAME } else { // REAL DOCUMENT COMPLETE } }