qileilove

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

          自動化測試析疑——WebDriver啟動時白屏掛起問題解決方法

          WebDriver啟動的時候很容易無限掛起,直到外圍框架設(shè)定的超時時間達(dá)到而退出運行,給測試運行帶來很大的困擾。而實際上WebDriver有一組timeout的設(shè)置方法,啟動時的掛起屬于頁面加載的范疇,所以可以考慮用timeouts().pageLoadTimeout()來重新啟動一個有效的實例來執(zhí)行測試。

            Java代碼:

          * Description: catch page load timeout Exception and restart a new session.
          * 內(nèi)容描述:通過頁面跳轉(zhuǎn)是否超時來測試WebDriver啟動時是否發(fā)生掛死異常。
          *
          * @param driver RemoteWebDriver object.
          * @param browser the browser mode.
          * @param testUrl the url used to navigate by the driver.get method.
          * @throws Exception
          */
          private boolean hasLoadPageSucceeded(RemoteWebDriver driver, String browser, String testUrl) throws Exception {
          try {
          driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
          driver.get(testUrl);
          return true;
          } catch (TimeoutException te) {
          LOG.error("******************本次啟動WebDriver異常掛起******************");
          setBuildEnvChoice(browser);
          driverObjectInitalize();
          return false;
          }
          }
          /**
          * Description: catch page load timeout Exception and restart a new session.
          * 內(nèi)容描述:循環(huán)一定次數(shù)測試WebDriver啟動是否掛死。
          *
          * @param driver RemoteWebDriver object.
          * @param browser the browser mode.
          * @param testUrl the url used to navigate by the driver.get method.
          * @param repeatTimes retry times.
          * @throws Exception
          */
          private void driverStatusTest(RemoteWebDriver driver, String browser, String testUrl, int repeatTimes) throws Exception {
          int index = 0;
          boolean suspended = true;
          while (index < repeatTimes && suspended){
          suspended = !hasLoadPageSucceeded(driver, browser, testUrl);
          index ++;
          }
          if (index == repeatTimes && suspended){
          throw new RuntimeException("can not start webdriver successfully, it's suspended!");
          }
          }
          /**
          * Description: start webdirver after capability settings completed.
          * 內(nèi)容描述:在做好配置之后創(chuàng)建WebDriver實例。
          *
          * @throws Exception
          */
          private String driverObjectInitalize() throws Exception{
          if (USE_DRIVERSERVER){//是否使用IEDirverServer
          driver = new RemoteWebDriver(service.getUrl(), capability);
          return service.getUrl().toString();
          }else{
          URL url = new URL("http://localhost:" + server.getPort() + "/wd/hub");
          driver = new RemoteWebDriver(url, capability);
          return "http://localhost:" + server.getPort() + "/wd/hub";
          }
          }
          /**
          * Description: start webdirver
          * 內(nèi)容描述:啟動WebDriver實例。
          *
          * @param browser the browser mode
          * @throws RuntimeException
          */
          protected void startWebDriver(String browser) {
          try {
          setBrowserMode(browser);
          String url = driverObjectInitalize();//about:blank is useless on some machines.
          driverStatusTest(driver, browser, url, 2);
          driver.manage().timeouts().implicitlyWait(maxWaitfor, TimeUnit.SECONDS);
          driver.manage().timeouts().setScriptTimeout(maxWaitfor, TimeUnit.SECONDS);
          driver.manage().timeouts().pageLoadTimeout(maxLoadTime, TimeUnit.SECONDS);
          } catch (Exception e) {
          LOG.error(e);
          throw new RuntimeException(e);
          }
          }
          /**
          * Description: set browser mode on local machines: do not close browsers already opened.
          * 內(nèi)容描述:選擇在本機執(zhí)行,有人工干預(yù),無需殺掉瀏覽器進程。
          *
          * @throws Exception
          */
          private void setBrowserMode(String browser) throws Exception{
          if (browser.toLowerCase().contains("ie") || browser.toLowerCase().contains("internetexplorer")) {
          capability = DesiredCapabilities.internetExplorer();
          } else if (browser.toLowerCase().contains("ff") || browser.toLowerCase().contains("firefox")) {
          capability = DesiredCapabilities.firefox();
          } else if (browser.toLowerCase().contains("chrome")) {
          capability = DesiredCapabilities.chrome();
          } else if (browser.toLowerCase().contains("safari")) {
          capability = DesiredCapabilities.safari();
          } else if (browser.toLowerCase().contains("opera")) {
          capability = DesiredCapabilities.opera();
          } else if (browser.toLowerCase().contains("htmlunit")) {
          capability = DesiredCapabilities.htmlUnit();
          } else {
          throw new IllegalArgumentException("you are using wrong mode of browser paltform!");
          }
          }


          上面的文檔給出的解決方案只是能夠部分地解決工具問題,但有時候這種hang死會發(fā)生在timeouts().pageLoadTimeout()發(fā)生作用之前。也就是說,這需要更為徹底的方法去解決這個問題,我想到最簡單的方式是用獨立的守護線程去看守,具體代碼如下:

          [html] view plaincopyprint?private final int DRIVER_STATUS_TEST_TIMES = 2;
          private final int DRIVER_START_TIMEOUT = 30000;
          /**
          * Description: start webdirver
          * 內(nèi)容描述:啟動WebDriver實例。
          *
          * @param browserMode the browser mode
          */
          private void startWebDriver(String browserMode){
          try {
          setBuildEnvChoice(browserMode);
          initalizeWebDriver(DRIVER_START_TIMEOUT);
          //the address "about:blank" is sometimes useless.
          ensureWebDriverStatus(browserMode, getServerAddress(), DRIVER_STATUS_TEST_TIMES);
          setPageLoadTimeout(maxLoadTime);
          setElementLocateTimeout(maxWaitfor);
          setScriptingTimeout(maxWaitfor);
          actionDriver = new Actions(driver);
          ASSERT = new StarNewAssertion(driver, LOG_ABS, className, logger, devidor);
          pass("webdriver new instance created");
          } catch (Exception e) {
          LOG.error(e);
          throw new RuntimeException(e);
          }
          }
          /**
          * Description: start webdirver using browser iexplore
          * 內(nèi)容描述:默認(rèn)選擇IE模式創(chuàng)建WebDriver實例。
          */
          protected void startWebDriver() {
          startWebDriver("ie");
          }
          /**
          * Description: start webdirver after capabilities settings completed.
          * 內(nèi)容描述:在做好配置之后創(chuàng)建WebDriver實例。
          */
          private void initalizeWebDriver() {
          WebDriverListener listener = new WebDriverListener(LOG_ABS, className, logger, devidor);
          if (USE_DRIVERSERVER) {// 是否使用IEDirverServer
          driver = new EventFiringWebDriver(new RemoteWebDriver(service.getUrl(), capabilities)).register(listener);
          } else {
          try {
          URL url = new URL("http://localhost:" + server.getPort() + "/wd/hub");
          driver = new EventFiringWebDriver(new RemoteWebDriver(url, capabilities)).register(listener);
          } catch (MalformedURLException e) {
          throw new RuntimeException("illegal url!");
          }
          }
          }
          /**
          * Description: start and see if webdirver start successfully.
          * 內(nèi)容描述:創(chuàng)建并且判斷WebDriver實例是否啟動成功。
          *
          * @param timeout timeout for start webdriver.
          * @param redoCount retry times for start webdriver.
          * @throws Exception
          */
          private void initalizeWebDriver(long timeout, int redoCount) throws Exception {
          for (int i = 0; i < redoCount; i++) {
          Thread thread_start = new Thread(new Runnable() {
          public void run() {// 用一個獨立的線程啟動WebDriver
          initalizeWebDriver();
          }
          });
          thread_start.start();
          waitFor(thread_start, timeout);//為啟動WebDriver設(shè)定超時時間
          if (!thread_start.isAlive()) {
          return;
          } else {
          thread_start.interrupt();
          consoleError("start Webdriver failed 【" + i + "】 times!");
          }
          if (thread_start.isAlive() && i == redoCount){// 如果最終沒能啟動成功則拋出錯誤
          thread_start.interrupt();
          throw new RuntimeException("can not start webdriver, check your platform configurations!");
          }
          }
          }

          posted on 2013-04-09 10:42 順其自然EVO 閱讀(1391) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄管理方向

          <2013年4月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 夹江县| 富锦市| 南岸区| 海门市| 金秀| 莱阳市| 监利县| 蒙自县| 奉新县| 沈丘县| 延长县| 涞源县| 旌德县| 新蔡县| 新巴尔虎左旗| 乐清市| 西林县| 曲松县| 绥化市| 泸州市| 古丈县| 潢川县| 和平县| 连云港市| 都江堰市| 霍山县| 视频| 高雄市| 陆良县| 陆丰市| 岑巩县| 孝义市| 旺苍县| 泰州市| 资兴市| 望谟县| 察隅县| 九江县| 米脂县| 西乌珠穆沁旗| 金堂县|