【问题标题】:How to wait for an HtmlElement to appear in a WebBrowser in .NET如何等待 HtmlElement 出现在 .NET 的 WebBrowser 中
【发布时间】:2017-11-04 13:47:41
【问题描述】:

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

While WebBrowser1.Document.GetElementById("username") Is Nothing
    Application.DoEvents()
End While

但它似乎冻结了页面上的脚本(页面甚至告诉我它处于离线状态)。如果你想帮忙,你可以用 VB 或 C# 给我你的答案。

编辑:我现在使用的方法是使用 Timer 每 100 毫秒检查一次元素是否出现。

【问题讨论】:

  • 您在哪个事件中运行此代码,是在页面加载期间吗?
  • @YogeshHShenoy 我有一个计数器,我在 WebBrowser1.DocumentCompleted 中执行此代码,在它第五次触发时

标签: c# .net vb.net webbrowser-control


【解决方案1】:

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

请检查DocumentCompleted 内的WebBrowser.ReadyState property。它会告诉您网页是否已完全加载(但 NOT 会考虑异步/延迟的 Javascript 代码)。

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
        'Do stuff.
    End If
End Sub

【讨论】:

  • 好吧,所以我认为脚本被延迟了,因为元素出现在 ReadyStateComplete 之后(如果我在 'Do stuff 之后放置一个 MessageBox,它会在我点击后出现“行”)。所以现在我将保留 Timer 方法。
  • @paulolol :是的,恐怕在这种情况下没有更好的方法,因为网页可以动态更改。对于这样的情况,我也使用计时器,将它们启动DocumentCompleted 事件处理程序并在找到元素时停止它们。 Windows.Forms.Timer 是一个基于窗口消息的低优先级定时器,最小分辨率约为 50 毫秒。对于这种情况,您只运行它几秒钟并不会真正影响性能。
猜你喜欢
  • 2012-01-26
  • 2011-01-30
  • 2011-10-11
  • 2016-01-01
  • 2012-01-22
  • 2011-02-25
  • 2011-04-17
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多