C# Web 浏览器文档完成事件触发两次
本文关键字:两次 事件 浏览器 Web 文档 | 更新日期: 2023-09-27 17:56:17
我正在创建一个 c# 窗口表单应用程序,用户可以在其中注册到我的网站。该程序旨在简化从桌面进行多次注册的过程。我有 2 个事件用于注册过程。
第一个事件 :
private void textBox5_TextChanged(object sender, EventArgs e)
{
if (textBox5.Text.Length == 4)
{
// users to enter captcha in this field
button5.Text = "&Copy " + Convert.ToString( listBox2.Items.Count) + " Id";
registerPost();
textBox5.Clear(); //clear the captcha for loading next captcha
}
}
第二项活动:
private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
validation();
captcha();
}
现在,验证方法包含几个逻辑:
private void validation()
{
if (webBrowser2.DocumentTitle.Contains("Referral via Email"))
{
HtmlElementCollection classButton = webBrowser2.Document.All;
foreach (HtmlElement element in classButton)
{
if (element.GetAttribute("className") == "cta-join-btn")
{
element.InvokeMember("click");
}
}
}
else if (webBrowser2.DocumentText.Contains("Security Code does not match."))
{
label9.Text = "&Status : Wrong Captcha";
}
else if (webBrowser2.DocumentText.Contains("exceeded"))
{
label9.Text = "&Status : Exceeded";
if (listBox1.SelectedIndex < listBox1.Items.Count - 1)
{
listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
}
webBrowser2.Navigate(textBox4.Text);
}
else if (webBrowser2.DocumentText.Contains("Oops, you took too long to fill up this field. A new code has been generated for you."))
{
label9.Text = "&Status : Captcha Expired";
}
else if (webBrowser2.DocumentText.Contains("Username is taken."))
{
label9.Text = "&Status : UserName Exist";
textBox3.Text = generateRandomID(Convert.ToInt32(textBox6.Text));
}
else if (webBrowser2.DocumentText.Contains("The email address you entered is already linked to an existing mig33 account! Please enter a different email address."))
{
label9.Text = "&Status : Email Exist";
if (listBox1.SelectedIndex < listBox1.Items.Count - 1)
{
listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
}
webBrowser2.Navigate(textBox4.Text);
}
else if (webBrowser2.DocumentTitle.Contains("Success")) //problem area
{
writeText();
label9.Text = "&Status : Success!!!";
textBox3.Text = generateRandomID(Convert.ToInt32(textBox6.Text));
if (listBox1.SelectedIndex < listBox1.Items.Count - 1)
{
listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
}
webBrowser2.Navigate(textBox4.Text);
}
}
在我的程序中有两个列表框,其中列表框包含显示在每个文档完成事件的执行期间创建的ID和密码,第二个列表框包含必须在Web浏览器控件中打开的注册链接。
除了 validation() 方法中的条件成功之外,一切都工作正常。
当程序执行并且用户启动注册过程时,如果用户成功创建 ID,列表框项将触发两次。 可能是因为 如果用户成功注册,他会被重定向到另一个页面,从而引起文档完成事件的复杂性。
我在某处错过了一些东西,尝试了很多,任何帮助将不胜感激。
@ sauk, 文档事件在无法正确完成时将保持交互状态,以便您可以使用
private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// check event state is complete or interactive
if (webBrowser2.ReadyState != WebBrowserReadyState.Complete)
return;
validation();
captcha();
}
你的函数(validation() 和 CAPTCHA()) 只会在文档完成事件完成时调用。 否则它不会调用你的函数