【问题标题】:C# Wait for Web Page to Load Before ScrapingC# 在抓取之前等待网页加载
【发布时间】:2019-08-06 09:21:11
【问题描述】:

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

问题是我使用 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);
    }

}

}

【问题讨论】:

  • 看看硒
  • DocumentCompleted 事件也会针对 iframe 引发。您可以检查 e.Url 来识别它们。
  • 我试图在没有硒的情况下做到这一点,但无论如何我可能会在那里结束。谢谢巴里

标签: c# winforms event-handling


【解决方案1】:

试试这个:)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多