2010-07-13 23 views
1

正如我在其他問題中所說的,我爲開源瀏覽器自動化框架(Selenium WebDriver)做出了貢獻,並且在IE中遇到困難。該框架使用用C++編寫的外部進程,而不是瀏覽器幫助對象(BHO)。使用Windows消息(WM_LBUTTONDOWN和WM_LBUTTONUP)生成元素點擊,而不是通過COM進行模擬點擊。這個設計決定的理由可以在項目的wiki here中找到。如何確定何時會通過單擊鼠標並等待事件來生成BeforeNavigate2?

爲了確定導航是否已經開始,驅動程序代碼被附加到DWebBrowserEvents2 :: BeforeNavigate2事件。然而,在點擊消息發送到IE窗口後,SendMessage返回(指示IE消息循環已處理消息)和BeforeNavigate2何時觸發之間存在一些延遲。我想我可以使用attachEvent將回調函數附加到HTML元素的onclick事件中,並等待處理,但我不確定這是否與BeforeNavigate2事件同步。

如果在任意時間內未調用Windows Sleep()函數,如何在發送由Windows消息模擬的鼠標單擊之後等待BeforeNavigate2事件?

回答

0

導航代碼是全部異步的,所以你可以做的就是接收DWBE2 :: BeforeNavigate2並等待它啓動。你不必睡覺,讓你的消息循環運行。

有沒有辦法告訴它發生之前會發生什麼。有很多簡單的例子,比如「它是一個<a>標籤,但是有幾乎所有的瀏覽IE的方式。一個例子是把一個onclick處理程序放在一個隨機元素上,然後用setTimeout()來瀏覽一些瀏覽器偷偷摸摸的方式,或基於隨機數導航另一種方式是嵌入xml文件與xsl樣式表與CDATA塊在頂部,其中包含JavaScript通過document.write()更改window.location(嚴重彈出 - 攔截器必須處理這種情況下)。

所以,基本上,你不能沒有做了很多分析了前期的告訴(即解析HTML,JavaScript的,等等)。

+0

是的,但問題是,你不能依賴BeforeNavigate2射擊。考慮點擊的元素不是鏈接,而是div,這對於瀏覽器自動化框架來說並不少見。我所希望的是,我可以事先確定是否會導航,然後等待事件發生。可悲的是,這似乎不可能。我目前正在IHTMLElement上試驗attachEvent,以確保知道DOM何時處理了點擊,但我的事件處理程序沒有被調用。 – JimEvans 2010-07-14 18:22:32

+0

有沒有辦法告訴。我可以註冊一個onclick處理程序,它使用setTimeout()在任意時間段後瀏覽瀏覽器。在事實之前告訴事情的唯一方法是完全解析和分析HTML和JavaScript,或者創造一個時間機器。 – 2010-07-14 22:07:52

0

如何讓你的在導航2事件沉沒事件發生之前,和進程發送等待事件的點擊消息(以及其他一些安全超時)?

它似乎沒有包含在你的描述中,爲什麼你想等待,如果導航成功後點擊後的下一個動作只會發生 - 也許應該可以由用戶配置?

+0

同樣,您不能依賴點擊生成導航。這可能是因爲點擊只是運行JavaScript函數來操縱DOM(在許多JS小部件框架中很常見)。您將等待每次點擊不會產生導航的整個超時時間。等待行爲的基本原理是,自動腳本在導航點擊後的下一個操作可能會定位到目標頁面,因此我們必須等待導航完成後才能繼續。 – JimEvans 2010-10-13 11:00:57

+0

我認爲在自動化腳本中會有一些方法來指定等待頁面加載,或者將腳本分成幾個部分,以便在新加載的頁面上運行的腳本由於頁面加載而觸發而不是由於到上一頁。對我來說,這似乎應該是在腳本中做出的一些決定,而不是留給click命令的設計。 – 2010-10-13 19:49:47