上面的文档给出的解决方案只是能够部分地解决工具问题,但有时候这种hang死会发生在timeouts().pageLoadTimeout()发生作用之前。也就是说,这需要更为彻底的方法去解决这个问题,我想到最简单的方式是用独立的守护线程去看守,具体代码如下:
[html] view plaincopyprint?private final int DRIVER_STATUS_TEST_TIMES = 2; private final int DRIVER_START_TIMEOUT = 30000; /** * Description: start webdirver * 内容描述:启动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 * 内容描述:默认选择IE模式创建WebDriver实例。 */ protected void startWebDriver() { startWebDriver("ie"); } /** * Description: start webdirver after capabilities settings completed. * 内容描述:在做好配置之后创建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. * 内容描述:创建并且判断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设定超时时间 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!"); } } } |