如何在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的初学者
你看到的行为是正常的,我认为你正在加载的页面有一些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。