JS注入操作頁面對象


在用selenium webdriver 編寫web頁面的自動化測試代碼時,有時對頁面對象的操作需要通過js語句去執行,selenium本身就支持執行js,我們在代碼中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScriptexecuteAsyncScript這兩個方法了,其中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腳本觸發了”百度一下“按鈕,進行搜索動作。
 

 在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()方法去操作對象。或許是沒有研究透,需要更深入的了解。下期文章再更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM