Selenium WebDriver之JavaScript


   WebDriver提供了方法來同步/異步執行JavaScript代碼,這是因為JavaScript可以完成一些WebDriver本身所不能完成的功能,從而讓WebDriver更加靈活和強大。

本文中所提到的都是JAVA代碼。

 

1. WebDriver中如何執行JavaScript代碼

  JavaScript代碼總是以字符串的形式傳遞給WebDriver,不管你的JavaScript代碼是一行還是多行,WebDriver都可以用executeScript方法來執行字符串中包含的所有JavaScript代碼。

   WebDriver driver = new FirefoxDriver();

   JavascriptExecutor driver_js=(JavascriptExecutor)driver;

   String js = "alert(\"Hello World!\");";

   driver_js.executeScript( js);

 

2.同步執行JavaScript和異步執行JavaScript的區別

  • 同步執行:driver_js.executeScript( js)

         如果JavaScript代碼的執行時間較短,可以選擇同步執行,因為Webdriver會等待同步執行的結果,然后再運行其它的代碼。

  • 異步執行:driver_js.executeAsyncScript(js)

         如果JavaScript代碼的執行時間較長,可以選擇異步執行,因為Webdriver不會等待其執行結果,而是直接執行下面的代碼。

 

3. 用Javascript實現等待頁面加載的功能

    public void waitForPageLoad() {

          While(driver_js.executeScript("return document.readyState" ).equals ("complete")){

                Thread.sleep(500);

          }

    }

這樣做的缺點是,沒有設定timeout時間,如果頁面加載一直不能完成的話,那么代碼也會一直等待。當然你也可以為while循環設定循環次數,或者直接采用下面的代碼:

   protected Function<WebDriver, Boolean> isPageLoaded() {

        return new Function<WebDriver, Boolean>() {

            @Override

            public Boolean apply(WebDriver driver) {

                return ((JavascriptExecutor) driver).executeScript("returndocument.readyState").equals("complete");

            }

        };

    }

    public voidwaitForPageLoad() {

        WebDriverWait wait = new WebDriverWait(driver, 30);

       wait.until(isPageLoaded());

    }

 

需要指出的是單純的JavaScript是很難實現等待功能的,因為JavaScript的執行是不阻塞主線程的,你可以為指定代碼的執行設定等待時間,但是卻無法達到為其它WebDriver代碼設定等待時間的目的。有興趣的同學可以研究一下。

 

4. Javascrpt模擬點擊操作,並觸發相應事件

String js ="$(\"button.ui-multiselect.ui-widget\").trigger(\"focus\");"

                  +"$(\"button.ui-multiselect.ui-widget\").click();"

                  +"$(\"button.ui-multiselect.ui-widget\").trigger(\"open\");";

((JavascriptExecutor)driver).executeScript( js);

 

5. Javacript scrollbar的操作

 String js ="var obj = document.getElementsById(\“div_scroll\”);”

                +”obj.scrollTop= obj.scrollHeight/2;”

 ((JavascriptExecutor)driver).executeScript(js);

               

6. Javascript重寫confirm

String js ="window.confirm = function(msg){ return true;}”

((JavascriptExecutor)driver).executeScript( js);

通過執行上面的js,該頁面上所有的confirm將都不再彈出。

 

7. 動態載入jquery

並不是所有的網頁都引入了Jquery,如果我們要在這些網頁上執行Jquery代碼,就必須動態加載Jquery source文件

driver.get("file:///C:/test.html");

boolean flag =(boolean)(driver_js).executeScript("return typeof jQuery =='undefined'");

 if (flag)

 {

          driver_js.executeScript("var jq =document.createElement('script');"

                                + "jq.type ='text/javascript'; "

                                +"jq.src ='http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';"

                                +"document.getElementsByTagName('head')[0].appendChild(jq);");

          Thread.sleep(3000);

   }

 waiter.waitForPageLoad();

 driver_js.executeScript("$(\"input#testid\").val(\"test\");");

 

8. 判斷元素是否存在

可以通過下面的辦法來判斷頁面元素是否存在,但是缺點就是如果元素不存在,必須在拋出exception后才能知道,所以會消耗一定的時間(需要超時后才會拋出異常)。

   boolean ElementExist(By Locator){

        try{

             driver.findElement(Locator);

             return true;

        }

       catch(org.openqa.selenium.NoSuchElementException ex)

        {

            return false;

        }

  }

也許我們可以在JavaScript中判斷頁面元素是否存在,然后再將結果返回給WebdriverJava代碼。

  • 頁面元素

          String js =" if(document.getElementById("XXX")){ return true; } else{ return false; }”

          String result = ((JavascriptExecutor)driver).executeScript(js);               

        或者

  • 表單元素

          String js =" if(document.theForm.###){return true; } else{ return false; }”

          String result = ((JavascriptExecutor)driver).executeScript(js);

 

9. 結尾

    JavaScriptWebDriver中還可以做很多事情,但這還不是全部。比如,我們是否可以編寫代碼來監視在整個Webdrvier測試代碼運行過程是否產生過JavaScriptError呢,答案是肯定的,有興趣的同學可以深入研究一下。


免責聲明!

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



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