Selenium JavascriptExecutor 詳解

Selenium JavascriptExecutor 詳解

    介紹javascript

        在Selenium IDE中咱們可使用runScript命令去執行js代碼片斷,以輔助完成一些Selenium不方便達成的任務,一樣,在WebDriver中咱們也可使用JavascriptExecutor工具類去完成js代碼執行,下面我就四點詳細闡述該工具的使用及工做原理。java

        

    本篇文章討論主題包括:web

        1. JavascriptExecutor執行js代碼的兩種方法介紹。數組

        2. JavascriptExecutor執行js代碼的兩種方法使用示例。app

        3. JavascriptExecutor執行js的原理。函數

        4. JavascriptExecutor經常使用案例。工具

 

    下面咱們依次對以上三個話題進行詳細講解!spa

    

    1. JavascriptExecutor執行js代碼的兩種方法介紹code

        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代碼的兩種方法使用示例。

//示例一 使用executeScript方法,在js代碼中獲取方法傳入的參數數組 //使用arguments索引方法中傳入的參數數組,並使用return將定義的函數體計算結果返回. //代碼中傳入3個參數,js語句中索引第二,三各參數。 JavascriptExecutor jsExec = (JavascriptExecutor)driver; String functionBody = "return arguments[1]+','+arguments[2]"; String returnRes = (String)jsExec.executeScript(functionBody, 1, "hello", "selenium"); System.out.println(returnRes); //示例二 使用executeAsyncScript方法,在js代碼中獲取方法傳入的參數數組,並經過調用callback方法返回函數體計算結果 //代碼中傳入3個參數,js語句中索引第二,三各參數。 //超時時間是爲callback方法調用而設置的,超時時間內沒有調用callback方法,默認會再等待設定的超時間,在此沒有返回則拋出異常。 driver.manage().timeouts().setScriptTimeout(2, TimeUnit.SECONDS); String script = "var res = arguments[0] + ',' + arguments[1]; " + "var callback = arguments[2];" + "callback()"; String returnVal = (String)driver.executeAsyncScript(script, "hello" , "selenium"); System.out.println(">>>" + returnVal);
 

        3. JavascriptExecutor執行js的原理。

 

        如何理解JavascriptExecutor如何運行js代碼,須要對javascript基礎有必定的認識,首先給你們羅列兩個javascript中三種定義和調用函數的示例,你們看完示例就不難理解webdriver是如何去運行javascript代碼了,同時也能消除(爲什麼在javascript中使用arguments來接收方法傳入的參數)的困惑。

第一種函數定義方式:
    function sum(a, b) { return a+b; } sum(2,3); //輸出5 第二種函數定義方式: var sum = new Function('a', 'b', 'return a+b;'); sum(2,3) //輸出5 第二種方式咱們能夠改寫爲: new Function('a', 'b', 'return arguments[0]+arguments[1]').apply(null,[1,2]); //輸出5
 

        固然函數的定義不限於以上三種寫法,咱們這裏重點講解第二種和第三種方法,相信你們在看到這兩種使用方式時,已經理解webdriver是如何調用js代碼了,但還會疑惑爲何會使用arguments來接收參數。

        咱們全部定義的function實質上是對Function類的實現,而Functions類的定義中arguments做爲局部變量,經過arguments索引接收全部參數,即便在方法定義中未指定的參數,你們來看下面的代碼示例:

 

function add(a) { var sum =0, len = arguments.length; for(var i=0; i<len; i++){ sum += arguments[i]; } return sum; } add(1,2,3,4); //10
 

        

        相信講到這裏你們應該很是清楚webdriver是如何去執行js代碼的原理了,事實上webdriver就是經過new Function方式定義匿名函數來運行javascript代碼的。

相關文章
相關標籤/搜索