WebBrowserDocumentCompletedEventHandler不要等待Ajax异步完成

时间:2014-05-09 20:12:11

标签: c# javascript ajax iframe webbrowser-control

在阅读Dianyang Wu articlethis优秀帖子后,我设法构建了一个小的.net应用程序(几乎是来自Wu源代码的C& P)来自动化测试(让我们称之为protoTestApp )。我的最终目标是打开十几个小窗口,每个窗口模拟一个与Web应用程序交互的不同用户来强调它。

它在某种程度上有效但在我登录网络应用程序后(让它称之为InternalTestSubject)它会调用外部网址(让我们称之为ExternalTestSubject)并将其注入其内容一个iFrame。这个特殊的外部URL是另一个Web应用程序,它查找父窗口以获取一些参数。直接打开ExternalTestSubject不是一个选项。

我的问题出在我的protoTestApp上我想与ExternalTestSubject进行交互(通过id找到一个按钮,点击它等)但是在我的CompletedEvent处理程序中,iFrame仍然是空的。

WebBrowser显示两个Web应用程序已满载并正常工作,因此我认为处理程序只是不等待iFrame内容加载,因为它是由Ajax异步调用完成的。

有任何建议来完成吗?

2 个答案:

答案 0 :(得分:1)

我想我已经在您关联的the answer中对此进行了解释(并在another related answer中详细介绍)。 AJAX页面是非确定的,因此没有通用的方法。

使用定期异步轮询来查看页面的当前HTML快照或DOM以进行更改,链接的帖子说明了如何执行此操作。您可以以相同的方式轮询框架的内容。

答案 1 :(得分:0)

我可以想象框架报告准备就绪,但实际上并没有。例如,框架包含框架,您无法通过使用DocumentCompleted事件来了解是否所有这些框架都已加载。

简而言之:使用框架加载外部资源并进行测试不是一个好方法。即使您使用计时器手动检查加载状态。但是根据安全考虑,访问DOM会有很多问题。

我有两条建议:

  1. 创建一个WebBrowser实例并在其中打开外部测试主题。您将很有可能知道文档(及其框架)是否已完全加载。您仍然可以完全控制访问WebBrowser或Cookie的任何元素或点击元素或更改元素。

  2. 使用Selenium等第3个工具作为测试驱动程序。


  3. 更新1:

    由于提问者不需要任何第三个工具,我建议让内部测试对象定期查询目标帧的加载完整性。可以检查可能的代码document.readyState == 'complete'

    据我所知,由于外部测试主题是作为框架嵌入的,出于安全考虑,您可能无法访问框架的DOM。换句话说,除非先更改Web浏览器控件的安全设置,否则不能执行鼠标单击等操作。