【开源自动化测试疑难FAQ】【WebDriver】WebDriver启动时白屏挂起问题解决方法(二)

       WebDriver启动的时候很容易无限挂起,直到外围框架设定的超时时间达到而退出运行,给测试运行带来很大的困扰。上一篇文档WebDriver启动时白屏挂起问题解决方法(一)给出的解决方案只是能够部分地解决工具问题,但有时候这种hang死会发生在timeouts().pageLoadTimeout()发生作用之前。也就是说,这需要更为彻底的方法去解决这个问题,我想到最简单的方式是用独立的守护线程去看守,具体代码如下:

	private final int DRIVER_STATUS_TEST_TIMES = 2;
	private final int DRIVER_START_TIMEOUT = 30000;

	/**
	 * Description: start webdirver</BR>
	 * 内容描述:启动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</BR>
	 * 内容描述:默认选择IE模式创建WebDriver实例。
	 */
	protected void startWebDriver() {
		startWebDriver("ie");
	}

	/**
	 * Description: start webdirver after capabilities settings completed.</BR>
	 * 内容描述:在做好配置之后创建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.</BR>
	 * 内容描述:创建并且判断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!");
			}
		}
	}
       这里只是部分代码,其余部分不再罗列,有需要观摩者,可以去 github上面去看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值