如何在C#中使用WebBrowser控件DocumentCompleted事件?

在开始写这个问题之前,我试图解决以下问题

// 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

}

}

以上是 如何在C#中使用WebBrowser控件DocumentCompleted事件? 的全部内容, 来源链接: utcz.com/qa/425557.html

回到顶部