91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Selenium JavascriptExecutor 詳解

發布時間:2020-06-29 20:45:59 來源:網絡 閱讀:9716 作者:13161670059 欄目:軟件技術

    資源推薦:

    視頻資源: 軟件測試相關系列視頻

     社區資源: 自動化測試交流群


    

    介紹

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

		//示例一    使用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代碼的。



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江北区| 彩票| 灌阳县| 滨海县| 苍溪县| 汤原县| 错那县| 景洪市| 惠东县| 安国市| 全州县| 绥芬河市| 卓资县| 越西县| 翁牛特旗| 屯昌县| 吉安市| 康乐县| 青州市| 安宁市| 出国| 临高县| 子长县| 大连市| 铜梁县| 龙陵县| 白玉县| 黄平县| 开阳县| 安溪县| 南昌市| 阳高县| 昌都县| 镇康县| 枞阳县| 区。| 佛山市| 金华市| 广丰县| 仁怀市| 革吉县|