如何确定何时通过鼠标单击生成BeforeNavigate2并等待事件?

时间:2010-07-13 15:32:01

标签: internet-explorer automation

正如我在其他问题中所说,我正在为开源浏览器自动化框架(Selenium WebDriver)做出贡献,并且在IE上遇到困难。该框架使用用C ++编写的外部进程,而不是浏览器助手对象(BHO)。单击元素是使用Windows消息(WM_LBUTTONDOWN和WM_LBUTTONUP)生成的,而不是通过COM模拟的单击。可以在项目的wiki here中找到此设计决策的理由。

为了确定导航是否已启动,驱动程序代码将附加到DWebBrowserEvents2 :: BeforeNavigate2事件。然而,在将Click消息发送到IE窗口之后,SendMessage返回(指示IE消息循环已处理消息)和BeforeNavigate2触发之间存在一些延迟。我想我可以使用attachEvent将回调函数附加到HTML元素的onclick事件并等待处理它,但我不确定它是否与BeforeNavigate2事件同步。

如果不调用Windows Sleep()函数一段时间,在发送由Windows消息模拟的鼠标单击后如何等待BeforeNavigate2事件?

2 个答案:

答案 0 :(得分:0)

导航代码都是异步的,所以你所能做的就是接收DWBE2 :: BeforeNavigate2并等待它开火。你不必睡觉,只需让你的消息循环运行。

没有办法告诉它发生之前会发生什么。有很多简单的情况,例如“它是<a>标签,但是有几乎无限多种方式来导航IE。一个例子将onclick处理程序放在随机元素上然后使用setTimeout()以偷偷摸摸的方式浏览浏览器,或者根据随机数导航。另一种方法是使用xsl样式表嵌入xml文件,顶部有一个CDATA块,其中包含更改窗口的javascript。通过document.write()定位(严重弹出窗口阻止程序必须处理这种情况)。

所以,基本上,如果不事先进行大量分析(即解析HTML,javascript等),你就无法分辨。

答案 1 :(得分:0)

如何让您的BeforeNavigate2事件接收器引发一个事件,并且发送单击消息的进程等待事件(以及其他一些安全超时)?

如果导航成功,只有在点击后的下一个操作发生时,您的描述中似乎没有涵盖您想要等待的原因 - 也许这应该由用户配置?