2011-08-24 56 views
1

我正在使用Selenium客戶端驅動程序2.4.0。當使用WebDriverBackedSelenium對象運行測試時,例如Selenium:如何在我的測試中注入Javascript變量?

 final FirefoxDriver driver = new FirefoxDriver(); 
    selenium = new WebDriverBackedSelenium(driver, baseUrl); 

我該如何在我的測試中注入一個Javascript數組,以保持跨不同頁面的範圍?也就是說,我想創建一個JS var「myArray」,當我打開「http://mydomain.com/page1.html」時我可以訪問它(使用selenium.getEval),但是當我打開一個不同的頁面時,我可以引用它(「http://mydomain.com/page2.html」)在同一個Selenium測試中。

謝謝, - 戴夫

回答

1

我不認爲這是可能開箱。

解決方法應該可行 - 在頁面中添加一些可以從JSON反序列化的庫(例如Dojo),使用它將數組定義加載到某個JavaScript變量,並在離開頁面之前將其返回,並將其存儲在範圍請求之外。

但我必須說你有一種奇怪的要求 - 正在做什麼?

+0

我想轉換使用Selenium全局JS變量「storedVars」來存儲全局信息的Selenium HTML測試。可悲的是,這是不可用的WebDriverBackedSelenium驅動程序。感謝您的回覆,但我不明白您的回覆。請提供一個使用「getEval」設置和檢索全局變量的示例。謝謝, - – Dave

+0

我直接使用WebDriver一段時間,所以我會提供ony這個「僞代碼」: String arrayJson =「[]」; selenium.getEval(「window.document.storedVars =」+ arrayJson) //做一些工作... // arrayJson = selenium.getEval(「window.dojo.toJson(window.document.storedVars)」) –

+0

如果你遠離正在測試的頁面,「window.document.storedVars」是否仍然保留其價值?這不適合我,這就是問題所在。我正在尋找一個JS變量,將持續不同的頁面。 – Dave

1

你可以用鑄造來做到這一點。執行JavaScript以返回數組。 JS數組只能包含一個類型,它必須是原始的。

例如,執行一個腳本,它返回一個字符串數組:

ArrayList<String> strings = (ArrayList<String>) js.executeScript(returnArrayOfStrings); 

如果您需要任何其他類型的數組,你可以從這些字符串構建它。例如,如果你需要WebElements的數組,設計你的JS返回的定位器,然後遍歷,查找元素,建設一個新的數組:

ArrayList<String> xpaths = (ArrayList<String>) js.executeScript(getLocators); 
    ArrayList<WebElement> elements = new ArrayList<WebElement>(); 
    for (String xpath: xpaths){ 
     element = driver.findElement(By.xpath(xpath)); 
     elements.add(element); 
    } 

你必須在Java中Array,所以你可以把它在內存中,當你的測試到不同的網頁,仍然引用了Java Array

,唯一的缺點是,如果你的JS數組客戶端上的改變,你的Java Array不會自動更新自身(jsexecuter唯一回報每次執行一次),但這並不是什麼大問題 - 不是直接引用Java Array,而是可以訪問它vi一個getter,它首先再次執行JS以獲得新的Array,您可以在將新的/更新的數組返回到您的測試代碼之前,用它來替換前一個,或合併它們等。

相關問題