一尘不染

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

c#

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

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

阅读 691

收藏
2020-05-19

共1个答案

一尘不染

您可能还想知道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
    }
}
2020-05-19