首页 > 解决方案 > C# 在抓取之前等待网页加载

问题描述

我正在尝试制作一个登录另一个 Web 应用程序的 Windows 窗体应用程序,导航几个步骤(单击)直到它到达特定页面,然后抓取一些信息(名称和地址)。

问题是我正在使用 DocumentCompletedEventHandler 以便在执行导航到下一页的代码之前加载页面(以便到达最终网页)。

当它触发时,DocumentCompletedEventHandler 会触发多次。

当我到达登录页面时,它会输入凭据,然后输入消息“页面已加载!” 多次出现。我按回车,它又出现了。然后它导航到下一页,在那个新页面上我遇到了同样的问题。

我怎样才能让 DocumentCompletedEventHandler 只触发一次而不是多次?

    private void loadEvent(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        MessageBox.Show("Page loaded!");
    }


    private void loadLogin(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        var inputElements = webBrowser1.Document.GetElementsByTagName("input");
        foreach (HtmlElement i in inputElements)
        {
            if (i.GetAttribute("name").Equals("utilizator"))
            {
                i.InnerText = textBox1.Text;
            }
            if (i.GetAttribute("name").Equals("parola"))
            {
                i.Focus();
                i.InnerText = textBox2.Text;
            }
        }

        var buttonElements = webBrowser1.Document.GetElementsByTagName("input");
        foreach (HtmlElement b in buttonElements)
        {
            if (b.GetAttribute("name").Equals("Intra"))
            {
                b.InvokeMember("Click");
            }
        }
       webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(loadEvent);


        var inputElements1 = webBrowser1.Document.GetElementsByTagName("input");
        foreach (HtmlElement i1 in inputElements1)
        {
            if (i1.GetAttribute("id").Equals("headerqstext"))
            {
                i1.Focus();
                i1.InnerText = textBox3.Text;
            }
        }

        var buttonElements1 = webBrowser1.Document.GetElementsByTagName("button");
        foreach (HtmlElement b1 in buttonElements1)
        {
            if (b1.GetAttribute("title").Equals("Caută"))
            {
                b1.InvokeMember("Click");
            }
        }
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(loadEvent);

    }


    private void Button1_Click(object sender, EventArgs e)
    {
        webBrowser1.Navigate("http://10.1.104.23/ecris_cdms/");
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(loadLogin);
    }

}

}

标签: c#winformsevent-handling

解决方案


尝试这个 :)

Uri last = null;
private void CompleteResponse(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (!(last != null && last != e.Url))
        return;
    //your code here
}

推荐阅读