只要在這里面把需要執行的 js 寫好就可以了,不過問題也就來了:
1、executeScript 執行 js 時應該是一個閉包的環境,所以這里面 var 定義的變量是局部變量,不可能是全局對象,使用此變量的方法都要在這一個 executeScript 里面寫好全部代碼。2、一個 executeScript 只能 返回一個Object,如果你要做同一個測試,返回一個 JSON 對象中的多個值,難道要同一段代碼復制好幾遍嗎? 這樣當然不是個好的解決方案,所以我們可以利用 window 實現全局變量,這樣可以將一個復雜的 executeScript 分解為多個簡單的 executeScript 了。3、executeScript 的返回值是 Object,在 API 中有詳細的描述 Object 與 js 值的對應關系,但注意可是不能直接返回 JSON 對象的。
js 返回 HTML element, Object 可以轉換為一個 WebElementjs 返回 decimal,Object 可以轉換為一個 Doublejs 返回 non-decimal number, Object 可以轉換為一個 Longjs 返回 boolean, Object 可以轉換為一個 Booleanjs 返回 其他對象, Object 可以轉換為一個 Stringjs 返回 array, Object 可以轉換為一個 List<Object>.js 沒有返回值 或 返回 null, executeScript 的返回值就是 null詳細情況建議大家直接參閱 API 文檔 package lesson2;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import org.openqa.selenium.By;import org.openqa.selenium.JavascriptExecutor;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.WebDriverWait;public class ExampleJs { static WebDriver driver; @BeforeClass public static void init() { System.out.println("init..."); // 如果你的 FireFox 沒有安裝在默認目錄,那么必須在程序中設置 System.setProperty("webdriver.firefox.bin", "D://Program Files//Mozilla Firefox//firefox.exe"); // 創建一個 FireFox 的瀏覽器實例 driver = new FirefoxDriver(); } @Test public void test() { // 讓瀏覽器訪問 zTree Demo driver.get("http://www.ztree.me/v3/demo/cn/core/standardData.html"); // 等待 zTree 初始化完畢,Timeout 設置10秒 (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { WebElement element = driver.findElement(By.id("treeDemo")); return element.findElement(By.tagName("a")) != null; } }); System.out.println("start...javascript");// String name =(String) ((JavascriptExecutor)driver).executeScript("return $.fn.zTree.getZTreeObj('treeDemo').getNodes()[0].name;");// Long rootCount = (Long) ((JavascriptExecutor)driver).executeScript("return $.fn.zTree.getZTreeObj('treeDemo').getNodes().length;"); //直接 var 定義得到的對象并不是全局對象,這么執行會出錯的// ((JavascriptExecutor)driver).executeScript("var zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');");// String name =(String) ((JavascriptExecutor)driver).executeScript("return zTreeObj.getNodes()[0].name;");// Long rootCount = (Long) ((JavascriptExecutor)driver).executeScript("return zTreeObj.getNodes().length;"); //利用 window 實現全局對象 ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');"); String name =(String) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.getNodes()[0].name;"); Long rootCount = (Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.getNodes().length;"); // 顯示js 的結果 System.out.println("treeObj[0].name = " + name); System.out.println("root nodes count = " + rootCount); } @AfterClass public static void destory() { System.out.println("destory..."); //關閉瀏覽器 driver.quit(); }}附錄: Selenium 的 java API文檔: http://selenium.googlecode.com/svn/trunk/docs/api/java/index.html?index-all.html新聞熱點
疑難解答