C# 如何在.NET中等待HtmleElement出现在WebBrowser中

C# 如何在.NET中等待HtmleElement出现在WebBrowser中,c#,.net,vb.net,webbrowser-control,C#,.net,Vb.net,Webbrowser Control,我的Windows窗体中有一个WebBrowser控件,可以导航到网站。WebBrowser1.DocumentCompleted事件激发了5次,但仍有一些脚本随后执行。我必须等待一个特定的元素出现之前,我可以考虑页面是完全加载。我试过这个: 而WebBrowser1.Document.GetElementById(“用户名”)什么都不是 Application.DoEvents() 结束时 但它似乎冻结了页面上的脚本(页面甚至告诉我它处于脱机状态)。如果你想帮忙,你可以用VB或C语言给我答案

我的Windows窗体中有一个WebBrowser控件,可以导航到网站。
WebBrowser1.DocumentCompleted
事件激发了5次,但仍有一些脚本随后执行。我必须等待一个特定的元素出现之前,我可以考虑页面是完全加载。我试过这个:

而WebBrowser1.Document.GetElementById(“用户名”)什么都不是
Application.DoEvents()
结束时
但它似乎冻结了页面上的脚本(页面甚至告诉我它处于脱机状态)。如果你想帮忙,你可以用VB或C语言给我答案

编辑:我现在使用一种方法,使用计时器每100毫秒检查一次元素是否出现。

请注意(几乎)任何使用
Application.DoEvents()
的解决方案都是糟糕的解决方案<代码>DoEvents()不应用于保持用户界面的响应性。如果你觉得你需要使用它,那么你很可能是做错了什么。请参阅:

相反,请检查内部
文档是否已完成
。它将告诉您网页是否已完全加载(但这并不考虑异步/延迟的Javascript代码)

私有子WebBrowser1\u DocumentCompleted(发件人作为对象,e作为WebBrowserDocumentCompletedEventArgs)处理WebBrowser1.DocumentCompleted
如果WebBrowser1.ReadyState=WebBrowserReadyState.Complete,则
“做点什么。
如果结束
端接头
请注意(几乎)任何使用
Application.DoEvents()
的解决方案都是糟糕的解决方案<代码>DoEvents()不应用于保持用户界面的响应性。如果你觉得你需要使用它,那么你很可能是做错了什么。请参阅:

相反,请检查内部
文档是否已完成
。它将告诉您网页是否已完全加载(但这并不考虑异步/延迟的Javascript代码)

私有子WebBrowser1\u DocumentCompleted(发件人作为对象,e作为WebBrowserDocumentCompletedEventArgs)处理WebBrowser1.DocumentCompleted
如果WebBrowser1.ReadyState=WebBrowserReadyState.Complete,则
“做点什么。
如果结束
端接头

在哪个事件中运行此代码,是在页面加载期间吗?@Yogeshhenoy我有一个计数器,我在WebBrowser1.DocumentCompleted中执行此代码,在第五次触发时在哪个事件中运行此代码,是在页面加载期间吗?@Yogeshhenoy我有一个计数器,我在WebBrowser1.DocumentCompleted中执行此代码,在第五次使用firesOk时,我认为脚本被延迟了,因为元素正好出现在
ReadyState
Complete
之后(如果我在'Do stuff'后面放一个消息框,它将在我单击“Ok”之后出现)。所以现在我将保留计时器方法。@paulolol:是的,恐怕没有更好的方法,因为网页可以动态更改。在这种情况下,我也使用计时器,通过
DocumentCompleted
事件处理程序启动计时器,并在找到元素时停止计时器。
Windows.Forms.Timer
是一个基于窗口消息的低优先级计时器,最小分辨率约为50毫秒。对于这种情况,仅运行几秒钟不会真正影响性能。因此我认为脚本延迟,因为元素正好出现在
ReadyState
完成之后(如果我在“Do stuff”后面放一个MessageBox,它将在我单击“Ok”之后出现)。所以现在我将保留计时器方法。@paulolol:是的,恐怕没有更好的方法,因为网页可以动态更改。在这种情况下,我也使用计时器,通过
DocumentCompleted
事件处理程序启动计时器,并在找到元素时停止计时器。
Windows.Forms.Timer
是一个基于窗口消息的低优先级计时器,其最小分辨率约为50毫秒。在这种情况下,仅运行几秒钟不会真正影响性能。