Selenium JavascriptExecutor 詳解
介紹
在Selenium IDE中我們可以使用runScript命令去執行js代碼片段,以輔助完成一些Selenium不方便達成的任務,同樣,在WebDriver中我們也可以使用JavascriptExecutor工具類去完成js代碼執行,下面我就四點詳細闡述該工具的使用及工作原理。
本篇文章討論主題包括:
1. JavascriptExecutor執行js代碼的兩種方法介紹。
2. JavascriptExecutor執行js代碼的兩種方法使用示例。
3. JavascriptExecutor執行js的原理。
4. JavascriptExecutor常用案例。
下面我們依次對以上三個話題進行詳細講解!
1. JavascriptExecutor執行js代碼的兩種方法介紹
Object executeScript(String script, Object... args);
Object executeAsyncScript(String script, Object... args);
executeScript方法接收兩個參數和一個返回值:
script,javascript代碼片段,這段js代碼片段是作為js函數的完整方法體,可以使用return語句作為函數的返回值。
args, 參數數組,參數數組用於將外部數據傳遞給script(js代碼片段),script中可以通過arguments[index]方式索引args數組中的參數;參數數據類型必須是以下幾種(number, boolean, String, WebElement, 或者以上數據類型的List集合),當然無參數可以保留為空。
返回值,返回值是由js代碼片段計算后通過return語句返回,返回值數據類型可以為(WebElement,Double,Long,Boolean,String,List或Map),沒有return語句,這里返回數據為null。
executeAsyncScript方法接收兩個參數和一個返回值:
script,javascript代碼片段,這段js代碼片段是作為js函數的完整方法體,與executeScript主要有兩點不同:
1. 此處的script必須在代碼結束時明確調用callback方法以通知webdriver該script執行結束;該callback方法是由webdriver注入到arguments數組中最后一個元素;可以通過arguments[arguments.length-1]獲取到,且可以使用該回調函數返回計算結果(只需要將放回結果作為回調函數的參數即可)
2. 該script執行會有超時時間,默認為60s,超時時間內未調用callback方法,JavascriptExecutor會拋出Timeout異常。
args, 規則同executeScript。
返回值,規則同executeScript
2. JavascriptExecutor執行js代碼的兩種方法使用示例。
3. JavascriptExecutor執行js的原理。
如何理解JavascriptExecutor如何運行js代碼,需要對javascript基礎有一定的認識,首先給大家羅列兩個javascript中三種定義和調用函數的示例,大家看完示例就不難理解webdriver是如何去運行javascript代碼了,同時也能消除(為何在javascript中使用arguments來接收方法傳入的參數)的困惑。
當然函數的定義不限於以上三種寫法,我們這里重點講解第二種和第三種方法,相信大家在看到這兩種使用方式時,已經理解webdriver是如何調用js代碼了,但還會疑惑為什么會使用arguments來接收參數。
我們所有定義的function實質上是對Function類的實現,而Functions類的定義中arguments作為局部變量,通過arguments索引接收所有參數,即使在方法定義中未指定的參數,大家來看下面的代碼示例:
相信講到這里大家應該非常清楚webdriver是如何去執行js代碼的原理了,事實上webdriver就是通過new Function方式定義匿名函數來運行javascript代碼的。