【问题标题】:Winforms web browser control not firing document complete with AJAX web siteWinforms Web 浏览器控件未通过 AJAX 网站触发文档
【发布时间】:2011-01-29 04:23:19
【问题描述】:

VB.Net 桌面应用程序使用 IE 浏览器控件来浏览 Web。当正常页面加载时 document_complete 事件触发,我可以读取结果页面并从那里开始。我遇到的问题是我正在驱动的页面是用 AJAX 编写的,所以文档完成事件永远不会触发。此外,当您在通过 AJAX 加载新部分后查看页面源时,它并没有改变。人们是如何处理这个问题的?我有哪些选择?

【问题讨论】:

  • 视情况而定。你想做什么?
  • 另外,AJAX/Javascript/CSS/VBS/无论什么不修改源代码,它们都会修改 DOM
  • 当 DOM 被触发时,VB.Net 中是否会触发事件?

标签: html vb.net ajax automation webbrowser-control


【解决方案1】:

此解决方案可能会解决您的问题。 先决条件: AxwebBrowser 控件, 引用 mshtml.dll

将 axmshtml 调暗为 mshtml.HTMLDocument = YourAxWebBrowserControl.Document

Dim HTMLSource As String = axmshtml.body.innerHTML 'html 源代码,包括 DOM 更改

如果您知道要查找的内容,可以将上述代码放入计时器/循环中
并简单地监视页面源的更改。

【讨论】:

    【解决方案2】:

    如果 wb 是您的网络浏览器控件,则不要使用以下方法获取 HTML:

    wb.DocumentText
    

    使用:

    wb.Document.Body.InnerHtml
    

    这将为您提供更新的 html,反映 AJAX 更新。

    关于检测 AJAX 何时完成,对我而言,它似乎触发了 DocumentCompleted 事件。不知道为什么它对你不同。

    【讨论】:

      【解决方案3】:

      您需要使用HtmlDocument上的方法与网站中的Javascript代码进行交互。

      【讨论】:

      • 我在监控 VB.Net 中的另一个事件吗?你能举个例子吗?
      【解决方案4】:

      当某些 AJAX 脚本创建竞态条件时,我曾在 C# 中看到过这种行为。在这种情况下,将the defer attribute 添加到脚本标签会有所帮助。 YMMV。

      【讨论】:

      • 我认为你误解了这个问题。
      • 我无法编辑该网站 - 它不是我的。我只是在驱动控件并使用结果页面。
      【解决方案5】:

      不确定这是否可行。

      当 Ajax 调用完成时,向 URL 添加一个随机锚散列,如下所示:foo.html#23234 然后将您的代码添加到 NavigateComplete2 事件。

      http://msdn.microsoft.com/en-us/library/aa768334%28VS.85%29.aspx

      【讨论】:

      • 但是我怎么知道 AJAX 调用何时完成?有什么东西着火了吗?
      • 不确定您使用的是什么框架,但使用核心 api,您知道在 onreadystatechange 事件函数中加载已完成 onSumResponse() { if (xhReq.readyState != 4) { return; } var serverResponse = xhReq.responseText; ... } ... var xhReq = createXMLHttpRequest(); xhReq.open("GET", "sumGet.phtml?figure1=5&figure2=10", true); xhReq.onreadystatechange = onSumResponse; xhReq.send(null);参考:ajaxpatterns.org/XMLHttpRequest_Call
      【解决方案6】:

      我猜测您在 Windows 应用程序中加载的页面会执行 AJAX 调用,这似乎会刷新页面。在这种情况下,不会触发 document_complete 事件,因为不会刷新网页本身,而是刷新页面的部分

      我找到了a similar question 关于这个问题,在 VB.Net 中有一个接受的答案。

      【讨论】:

        【解决方案7】:

        您可以使用 ProgressChanged 事件,它似乎在 ajax 调用期间触发

        【讨论】:

          猜你喜欢
          • 2013-10-06
          • 2018-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          • 2016-09-18
          • 2011-06-17
          相关资源
          最近更新 更多