qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Selenium WebDriver之JavaScript

          WebDriver提供了方法來同步/異步執(zhí)行JavaScript代碼,這是因為JavaScript可以完成一些WebDriver本身所不能完成的功能,從而讓W(xué)ebDriver更加靈活和強大。
            本文中所提到的都是JAVA代碼。
            1. 在WebDriver中如何執(zhí)行JavaScript代碼
            JavaScript代碼總是以字符串的形式傳遞給WebDriver,不管你的JavaScript代碼是一行還是多行,WebDriver都可以用executeScript方法來執(zhí)行字符串中包含的所有JavaScript代碼。
            WebDriver driver = new FirefoxDriver();
            JavascriptExecutor driver_js=(JavascriptExecutor)driver;
            String js = "alert(\"Hello World!\");";
            driver_js.executeScript( js);
            2.同步執(zhí)行JavaScript和異步執(zhí)行JavaScript的區(qū)別
            同步執(zhí)行:driver_js.executeScript( js)
            如果JavaScript代碼的執(zhí)行時間較短,可以選擇同步執(zhí)行,因為Webdriver會等待同步執(zhí)行的結(jié)果,然后再運行其它的代碼。
            異步執(zhí)行:driver_js.executeAsyncScript(js)
            如果JavaScript代碼的執(zhí)行時間較長,可以選擇異步執(zhí)行,因為Webdriver不會等待其執(zhí)行結(jié)果,而是直接執(zhí)行下面的代碼。
            3. 用Javascript實現(xiàn)等待頁面加載的功能
            public void waitForPageLoad() {
            While(driver_js.executeScript("return document.readyState" ).equals ("complete")){
            Thread.sleep(500);
            }
            }
            這樣做的缺點是,沒有設(shè)定timeout時間,如果頁面加載一直不能完成的話,那么代碼也會一直等待。當(dāng)然你也可以為while循環(huán)設(shè)定循環(huán)次數(shù),或者直接采用下面的代碼:
          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是很難實現(xiàn)等待功能的,因為JavaScript的執(zhí)行是不阻塞主線程的,你可以為指定代碼的執(zhí)行設(shè)定等待時間,但是卻無法達到為其它WebDriver代碼設(shè)定等待時間的目的。有興趣的同學(xué)可以研究一下。
            4. Javascrpt模擬點擊操作,并觸發(fā)相應(yīng)事件
            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);
            通過執(zhí)行上面的js,該頁面上所有的confirm將都不再彈出。
            7. 動態(tài)載入jquery
            并不是所有的網(wǎng)頁都引入了Jquery,如果我們要在這些網(wǎng)頁上執(zhí)行Jquery代碼,就必須動態(tài)加載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中判斷頁面元素是否存在,然后再將結(jié)果返回給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. 結(jié)尾
            JavaScript在WebDriver中還可以做很多事情,但這還不是全部。比如,我們是否可以編寫代碼來監(jiān)視在整個Webdrvier測試代碼運行過程是否產(chǎn)生過JavaScriptError呢,答案是肯定的,有興趣的同學(xué)可以深入研究一下。

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

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 凤台县| 绥滨县| 宁南县| 宽甸| 昌黎县| 炎陵县| 万源市| 满洲里市| 云和县| 茌平县| 永新县| 信阳市| 乳山市| 青州市| 盐城市| 五台县| 富民县| 岳西县| 台东市| 汕头市| 长治县| 从江县| 黑河市| 黔西县| 滦平县| 陆良县| 洮南市| 铜梁县| 高邮市| 菏泽市| 申扎县| 柏乡县| 肇州县| 祁门县| 华安县| 东至县| 铜山县| 长宁区| 满洲里市| 遵化市| 天津市|