<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

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

    Selenium WebDriver之JavaScript

    WebDriver提供了方法來同步/異步執(zhí)行JavaScript代碼,這是因為JavaScript可以完成一些WebDriver本身所不能完成的功能,從而讓WebDriver更加靈活和強大。
      本文中所提到的都是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時間,如果頁面加載一直不能完成的話,那么代碼也會一直等待。當然你也可以為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è)定等待時間的目的。有興趣的同學可以研究一下。
      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呢,答案是肯定的,有興趣的同學可以深入研究一下。

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

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

    導航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费观看大片毛片| 猫咪社区免费资源在线观看 | 久久国产免费观看精品3| 狠狠亚洲狠狠欧洲2019| 国产精品黄页免费高清在线观看| 国产zzjjzzjj视频全免费 | 美女免费精品高清毛片在线视| 波多野结衣久久高清免费 | 亚洲人成网站在线观看播放青青| av无码免费一区二区三区| 亚洲春色另类小说| 永久免费av无码不卡在线观看 | 涩涩色中文综合亚洲| 全免费a级毛片免费看不卡| 亚洲av无码成人精品区一本二本| 国产成人在线观看免费网站| 色网站在线免费观看| 亚洲熟妇无码八AV在线播放| 成全高清在线观看免费| 亚洲国产成人久久99精品| 成年美女黄网站色大免费视频| 国产一区二区三区亚洲综合| 中文字幕亚洲一区二区va在线| 久久大香伊焦在人线免费| 亚洲Av高清一区二区三区| 国产精品jizz在线观看免费| 精品国产污污免费网站入口在线| 亚洲av片劲爆在线观看| 成全视频免费高清| 一区二区3区免费视频| 久久久久亚洲AV无码网站| 韩国二级毛片免费播放| 两个人看www免费视频| 亚洲人成77777在线观看网| 亚洲AV无码专区日韩| 99在线观看精品免费99| 国产亚洲福利精品一区二区| 亚洲av无码不卡一区二区三区| 成人无码区免费视频观看 | 最近中文字幕mv免费高清在线| 亚洲av综合av一区二区三区|