如何在c#的WebBrowser_DocumentCompleted中做多个动作

本文关键字:DocumentCompleted WebBrowser | 更新日期: 2023-09-27 18:10:07

所以,我在c#中使用webBrowser创建一个机器人,加载在文本框中输入的网站。当网站加载,我需要机器人点击一个特定的锚文本。之后,当加载一个新页面时,我需要单击另一个锚文本等等,直到出现一个表单来填写详细信息。我还需要向用户显示captcha,他/她可以填写并提交,以便页面可以继续到下一页。

我需要的是调用不同的方法,每次浏览器导航到下一页和加载完成。我已经成功地创建了一个WebBrowser_DocumentCompleted,但它会被一遍又一遍地调用,因为我想访问的页面上存在相同的超链接。但是,在那个页面上,我需要点击一个按钮。

我这样做是为了获得链接并访问它。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        // Select the html element by inner text of anchor and click on it
        HtmlElementCollection elc = this.webBrowser1.Document.GetElementsByTagName("a");
        foreach (HtmlElement el in elc)                
        {
            if (el.InnerText == null || el.InnerText.Equals("Matching text"))
            {
                el.InvokeMember("click");
            }
        }
    }

在此之后,已经匹配inretext链接被点击和页面加载。页面有相同的锚文本,它被加载一次又一次。但是,我需要点击另一个按钮,然后转到下一页。

所以,如果你有任何我可以使用的方法,那就太棒了。欢迎任何帮助!

注:我是c#和。net的初学者

如何在c#的WebBrowser_DocumentCompleted中做多个动作

你看到的行为是正常的,我认为你正在加载的页面有一些iframe或嵌入的内容,并且对于每个加载的DocumentCompleted将被触发(它与有一个链接到页面无关,一个链接不做任何事情,直到它被点击)。

你必须根据WebBrowserDocumentCompletedEventArgs传递给这些函数的Url参数采取行动,这样你就可以为每个具体的页面执行所需的行动,就像这样:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    switch(e.Url.ToString())
    {
        case "http://myfakeserver.com/mypageone.htm":
            //Do whetever you want to do
            break;
        case "http://myfakeserver.com/mypagetwo.htm":
           //Do more stuff
           break;
    }
}

希望有帮助。

编辑:

好了,现在我知道你需要什么了。

这很简单,只要检查你是否已经在那一页。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // Select the html element by inner text of anchor and click on it
    HtmlElementCollection elc = this.webBrowser1.Document.GetElementsByTagName("a");
    foreach (HtmlElement el in elc)                
    {
        var hRef = el.GetAttribute("href");
        if(string.IsNullOrWhitespace(hRef))
          continue;
        var lnkUri = new Uri(hRef);
        //If the link points to this page, ignore it
        if(lnkUri.Segments[lnkUri.Segments.Length - 1] == e.Url.Segments[e.Url.Segments.Length - 1])
            continue;
        if ((el.InnerText == null || el.InnerText.Equals("Matching text"))
        {
            el.InvokeMember("click");
        }
    }
}

注意在这个例子中,我只是检查url的最后一部分,所以如果你有不同的路径,有相同的页面名称,它会失败,你必须适应你的需要,这取决于如何在href上写的uri,你可以做一个完整的检查的url。

相关文章:
  • 没有找到相关文章