假设此方法适用于网络浏览器中的 HTML 页面:
bool semaphoreForDocCompletedEvent;
private void button12_Click(object sender, EventArgs e)
{
checkBox1.Checked = false; //unchecked if the NAvigating event is fired and Checked after DocumentCompleted is fired, only to have a visual reference on the Form
HtmlDocument doc = Program.wb.Document;
HtmlElement ele = doc.GetElementById("menuTable");
foreach (HtmlElement sub in ele.All)
{
if (sub.GetAttribute("href").Contains("something"))
{
ele = sub;
break;
}
}
//PHASE 1: clicking on a Web link to navigate to a page that contains other buttons and links object obj = ele.DomElement;
System.Reflection.MethodInfo mi = obj.GetType().GetMethod("click");
mi.Invoke(obj, new object[0]);
//PHASE 2: Waiting for document completed in order to be sure the document is fully loaded
semaphoreForDocCompletedEvent = WaitForDocumentCompleted();
if (!semaphoreForDocCompletedEvent)
throw new Exception("casino in giro!");
ele = doc.GetElementByI("button1").FirstChild.FirstChild.FirstChild.NextSibling;
//PHASE 3: clicking on a Web button to open a form
obj = ele.DomElement;
mi = obj.GetType().GetMethod("click");
mi.Invoke(obj, new object[0]);
//PHASE 4: displaying a modal MEssageBox that annoy the user a lot
if (checkBox1.Checked == false)
MessageBox.Show("non c'è stato document completed");
checkBox1.Checked = false;
//PHASE 5: submitting the form (that does not need any imput to be filled in)
ele = doc.GetElementById("planet");
ele = ele.FirstChild.NextSibling.NextSibling;
obj = ele.DomElement;
mi = obj.GetType().GetMethod("submit");
mi.Invoke(obj, new object[0]);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Program.toBox = Program.wb.Document.Body.InnerHtml.ToString();
if (Program.wb.ReadyState == WebBrowserReadyState.Complete)
{
checkBox1.Checked = true;
IsBusy = false;
}
}
private bool WaitForDocumentCompleted()
{
while (IsBusy)
{
Application.DoEvents();
Thread.SpinWait(1000);
}
return true;
}
我需要理解为什么这段代码在显示消息框时运行得像一个魅力,而在注释掉时则不然。
我的疑问可以通过以下问题来恢复:
1)当消息框是程序的一部分和不是程序的一部分时,代码的流程如何?我的意思是代码是否被阻止直到用户按下“确定”?
2) 我在上面用数字 3 表示的阶段在页面中触发了一些 javascript,这些 javascript 不会发出导航事件(因此没有 DocumentCompleted),但可以访问一些隐藏的 HTML,如果不单击 A 标记,则无法访问这些 HTML。实际上,它只是更改标签的 InnerHtml,在其中创建一个 FORM。
3)我尝试为第4阶段实现几个解决方案,如此处所示的消息框,ThreadSleep(),SpinWait(),甚至一个for循环搞乱了一切,但所有这些解决方案似乎都不让Web浏览器继续进行在屏幕上可视化表单。即使用户非常快地按下“确定”并关闭它,也只有消息框将其显示到屏幕上。
4)我需要找到一个不涉及外部(用户)输入(例如要关闭的消息框)的解决方案,以便等待表单完全加载在屏幕上,但没有事件来提供帮助。
评估案例的更多数据:
- 我编写的代码非常适合这个目标,我尝试将其分成 3 个按钮来手动管理时间,效果很好。
- 完成的文档不能用于代码拆分之间的切换,因为大约有 300 个页面是自动化的,每个页面可以有 10-15 个方法来自动化它们,如果不建立一个永无止境的事件处理程序,就不可能为所有这些页面管理一个事件处理程序切换结构体。如果可能的话我会尽量避免。
- 我发现其他用户的一些有趣的问题如下,但没有适合我的情况的解决方案:
带有 WebBrowser.IsBusy 或 ReadyState 的 InvalidCastException (VB .NET) https://stackoverflow.com/questions/1912678/invalidcastexception-with-webbrowser-isbusy-or-readystate-vb-net
检测 AJAX 何时更改 Web 浏览器中 DIV 中的 HTML https://stackoverflow.com/questions/1454451/detect-when-ajax-changes-html-in-a-div-in-webbrowser
http://www.techtalkz.com/vb-net/374234-vb-net-webbrowser-control-how-capture-javascript-events-statusbar-changed-mouseclick-etc.html http://www.techtalkz.com/vb-net/374234-vb-net-webbrowser-control-how-capture-javascript-events-statusbar-changed-mouseclick-etc.html
有人可以帮我吗?
抱歉,这是我的第一个帖子,希望我已经说清楚了。塔克斯