qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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中判斷頁面元素是否存在,然后再將結果返回給Webdriver的Java代碼。
            頁面元素
            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. 結尾
            JavaScript在WebDriver中還可以做很多事情,但這還不是全部。比如,我們是否可以編寫代碼來監視在整個Webdrvier測試代碼運行過程是否產生過JavaScriptError呢,答案是肯定的,有興趣的同學可以深入研究一下。

          posted on 2014-12-22 23:57 順其自然EVO 閱讀(618) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 高邑县| 惠州市| 金湖县| 林州市| 嘉祥县| 石城县| 磐石市| 沐川县| 邵阳市| 枣强县| 夏津县| 宣威市| 巩留县| 普兰店市| 清原| 宁晋县| 朔州市| 繁峙县| 兴安盟| 大厂| 乡城县| 资源县| 临颍县| 梅河口市| 文水县| 新丰县| 利川市| 东辽县| 德钦县| 沁水县| 宣恩县| 香河县| 东源县| 崇礼县| 原阳县| 渝北区| 神木县| 黔西| 桦甸市| 多伦县| 九江市|