2016-03-10 44 views
2

首先我想描述我的問題的動機。在開始執行javascript之前,有沒有辦法轉換HtmlUnit加載的頁面?

我有一個複雜的網頁來測試硒+ HtmlUnit,它啓動不同的JavaScript腳本。我描述的問題應該是相當普遍的。

頁面上有一個按鈕,jQuery在加載頁面後綁定點擊回調(click event handler)。有一個明確的Wait(這是一個Selenium術語)使按鈕在測試代碼中可點擊。所以只要按鈕變成可點擊的,它就會被Selenium點擊。但是,通常情況下,這發生在jQuery設法將按鈕事件處理程序附加到按鈕之前。在這種情況下,Selenium測試失敗。

我想要做的是在頁面開始執行javascript之前預處理由HtmlUnit訪問的網頁,在頁面的開始處注入一些<script>myownscript()</script>(以便它在該頁面上的任何其他腳本之前執行)。然後,我將能夠知道,控制Selenium測試代碼中的某些條件,何時發生了點擊事件處理程序的附加事件(我是如何做到的,取決於應用程序的細節)。如果我讓Selenium點擊按鈕,那麼點擊事件處理程序的存在將得到保證,並且測試將按計劃繼續進行 - 由於缺少點擊事件處理程序而沒有錯誤。

讓我們分開這個想法是好還是壞(當然,在嘗試單擊有問題的按鈕之前,在Selenium測試代碼中引入了足夠大的延遲,但是隨後測試的總體持續時間可能會有問題,因爲我描述的問題存在於正在測試的應用程序的許多頁面上)。 Selenium/HtmlUnit中是否有一些鉤子允許預處理從服務器獲取的頁面,如我所述,在JavaScript開始在頁面上執行之前注入腳本?

+0

我還不清楚你的目的是什麼。正如你所提到的,你應該添加等待元素。添加Wait很容易。 – Buaban

+0

@Buaban我試圖編輯問題以使其更清晰。 –

回答

1

在這種情況下,您可以使用JavaScriptExecutor。您可以在String script中添加一個函數來執行任何您想要的操作。

WebElement button = driver.findElement(By.id("my-button")); 
JavascriptExecutor jsExe = ((JavascriptExecutor) driver); 
String script = "console.log(arguments[0].id); return arguments[0].id"; 
Object oj = jsExe.executeScript(script, button); 
String txt = oj.toString(); 
System.out.println(txt); 

如果要使用setTimeout()等aycn,請注意,它會立即返回。在我的回答中看到一個異步方法的例子:method execute_script don't wait end of script to return value with selenium in python

+0

您確定以這種方式執行的腳本會在嵌入頁面的任何其他JavaScript代碼之前執行**嗎?在我看來,沒有。 –

+0

不,它不會在應用程序中的JS之前執行。但是,您可以使用它在應用程序上添加和執行JavaScript。所以你可以添加方法來驗證按鈕的狀態或控制任何對象。 – Buaban

+0

謝謝,我意識到這種可能性(輪詢直到點擊事件處理程序變得可用),但是這個輪詢是我希望通過在頁面上運行任何其他javascript之前注入並執行javascript來避免的。這個想法是,這個注入的javascript在點擊事件處理程序綁定到按鈕後在頁面上添加了另一個元素,並且在測試代碼中,我等待直到這個新元素變爲可用,並顯式等待。不需要輪詢。 –

相關問題