在开始写这个问题之前,我试图解决以下问题
// 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 中读取未完成的数据并且自然会失败。
但突然在写这个问题“如果”怪物启发了我,我解决了我试图解决的问题。由于我在谷歌上失败了,我想把它贴在这里会很好。
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
}
至少现在,我的 5m hack 似乎运行良好。
也许我在查询 google 或 MSDN 时真的失败了,但我找不到:“如何在 C# 中使用 webbrowser 控制 DocumentCompleted 事件?”
备注:在学习了很多关于webcontrol的知识后,我发现它做了Funky的东西。
即使您检测到文档已完成,在大多数情况下,它也不会永远保持这种状态。页面更新可以通过多种方式完成 - 帧刷新、类似请求的 ajax 或服务器端推送(您需要有一些支持异步通信并具有 html 或 JavaScript 互操作的控件)。还有一些 iframe 永远不会加载,所以永远等待它们不是最好的主意。
我最终使用:
if (e.Url != wb.Url)