Mar*_*gus 14 c# automation webbrowser-control c#-2.0
在开始写这个问题之前,我试图解决以下问题
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
Run Code Online (Sandbox Code Playgroud)
问题是,如果网页上存在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
}
Run Code Online (Sandbox Code Playgroud)
至少现在,我的500万黑客似乎工作正常.
也许我真的没有查询谷歌或MSDN,但我找不到:"如何在C#中使用webbrowser控件DocumentCompleted事件?"
备注:在学习了很多关于webcontrol之后,我发现它确实是FuNKY的东西.
即使您检测到文档已完成,在大多数情况下它也不会永远保持这样.页面更新可以通过多种方式完成 - 帧刷新,类似请求的ajax或服务器端推送(需要一些支持异步通信的控件并具有html或JavaScript互操作).还有一些iframe永远不会加载,所以永远等待它们并不是最好的选择.
我最终使用:
if (e.Url != wb.Url)
Run Code Online (Sandbox Code Playgroud)
Yuk*_*uki 14
您可能也想知道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
}
}
Run Code Online (Sandbox Code Playgroud)