【发布时间】: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