在用selenium webdriver 編寫web頁面的自動化測試代碼時,有時對頁面對象的操作需要通過js語句去執行,selenium本身就支持執行js,我們在代碼中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScript、executeAsyncScript這兩個方法了,其中executeScript是同步方法,用它執行js代碼會阻塞主線程執行,直到js代碼執行完畢;executeAsyncScript方法是異步方法,它不會阻塞主線程執行。
executeScript方法如果有返回值,有以下幾種情況:
- 如果返回一個頁面元素(document element), 這個方法就會返回一個WebElement
- 如果返回浮點數字,這個方法就返回一個double類型的數字
- 返回非浮點數字,方法返回Long類型數字
- 返回boolean類型,方法返回Boolean類型
- 如果返回一個數組,方法會返回一個List<Object>
- 其他情況,返回一個字符串
- 如果沒有返回值,此方法就會返回null
從javaScript代碼中返回數據,我們需要使用return關鍵字。基於返回值的類型,我們需要對executeScript() 方法進行轉型。對於帶小數點的值,使用Double類型,非小數值可以使用Long類型,布爾值可以使用Boolean類型,如果返回的是HTML節點, 可以使用 WebElement類型,文本值,可以使用String類型。如果返回的是對象列表,基於對象類型的任何值都可以。
為了驗證寫的js代碼是否正確,需要首先對其驗證,然后加入到腳本里去執行。firebug的console模塊就提供了這樣的一個調試功能,打開firebug,切換到console頁面,在右邊就可以輸入js腳本,點擊run就可以調試了。
例子:
1,打開baidu,
2,隨便輸入搜索內容
3,用firebug識別到“百度一下‘按鈕
4,在右邊輸入js代碼,document.getElementById("su").click();
或var s=document.getElementById('load');
s.click()
5,點擊run,你會發現js腳本觸發了”百度一下“按鈕,進行搜索動作。
s.click()
5,點擊run,你會發現js腳本觸發了”百度一下“按鈕,進行搜索動作。
在webdriver腳本中的使用形式:
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
1. 直接操作元素
jse.executeScript( "window.document.getElementById('jingshou').click()");
2、傳入element當着參數然后操作
WebElement element = driver.findElement(By.id("jingshou"));
jse.executeScript("arguments[0].click();", element); 也可以寫成這樣jse.executeScript("arguments[0].onclick=function(){alert('This is my alert!');}", element)
你也可以傳入多個參數,使用arguments[]下標來指定你要使用的參數,記住下標是從0開始的
代碼展示:
WebDriver driver = new FirefoxDriver(); try { driver.get("http://www.baidu.com"); //利用webdriver鍵入搜索關鍵字 //driver.findElement(By.id("kw")).sendKeys("yeetrack"); //利用js代碼鍵入搜索關鍵字 ((JavascriptExecutor)driver).executeScript("document.getElementById(\"kw\").value=\"yeetrack\""); //利用js代碼取出關鍵字 String keyword = (String) ((JavascriptExecutor)driver).executeScript("var input = document.getElementById(\"kw\").value;return input"); System.out.println(keyword); driver.findElement(By.id("su")).click(); TimeUnit.SECONDS.sleep(5); } catch (Exception e) { e.printStackTrace(); } finally { driver.quit(); }
但是目前好像不支持document.getElementByXpath()方法去操作對象。或許是沒有研究透,需要更深入的了解。下期文章再更新。
