自动化测试析疑——WebDriver启动时白屏挂起问题解决方法

WebDriver启动的时候很容易无限挂起,直到外围框架设定的超时时间达到而退出运行,给测试运行带来很大的困扰。而实际上WebDriver有一组timeout的设置方法,启动时的挂起属于页面加载的范畴,所以可以考虑用timeouts().pageLoadTimeout()来重新启动一个有效的实例来执行测试。

  Java代码:

* Description: catch page load timeout Exception and restart a new session.
* 内容描述:通过页面跳转是否超时来测试WebDriver启动时是否发生挂死异常。
*
* @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.
* 内容描述:循环一定次数测试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.
* 内容描述:在做好配置之后创建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
* 内容描述:启动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.
* 内容描述:选择在本机执行,有人工干预,无需杀掉浏览器进程。
*
* @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死会发生在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!");
}
}
}

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2025-01-23 11:53:14

自动化测试析疑——WebDriver启动时白屏挂起问题解决方法的相关文章

Android的App启动时白屏的问题解决办法

Android的App启动时白屏的问题解决办法 在手机上调试后第一次启动后会等待很长时间白屏, 设置style样式,给activity加上设置的样式,完美解决 参考一下下面的代码.就可以解决(亲测好用) <style name="SplashTheme" parent="AppBaseTheme"> <!-- 将splash图片设置在这,这样这张图片取代白屏 --> <item name="android:windowBack

eclipse启动时一闪关闭的问题解决方法

1.右键点 eclipse.exe 复制为快捷捷. 2.再右键点快捷按钮eclipse.exe,选择属性,参考如下方式配置"目标"  代码如下 复制代码 D:/eclipse/eclipse.exe -vm "C:/jdk1.6.0/bin/javaw.exe" -data D:/java91 第一个参数是eclipse.exe的位置,第二个参数是配置JDK,第三个参数是配置你的ECLIPSE工作空间 eclipse在window下使用就是找虐,已删除

Android app启动时黑屏或者白屏的原因及解决办法_Android

1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背景图Theme 通过设置一张背景图. 当程序启动时,首先显示这张背景图,避免出现黑屏 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name=&qu

Android app启动时黑屏或者白屏的原因及解决办法

1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背景图Theme 通过设置一张背景图. 当程序启动时,首先显示这张背景图,避免出现黑屏 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name=&qu

Win8.1系统重启或快速启动时蓝屏怎么办?

Win8.1系统重启或快速启动时蓝屏怎么办?   具体步骤: 1.进入RECOVERY环境(就是自动修复失败之后蓝色底的那个页面),高级选项菜单,打开命令提示符; 2.输入: c:windowssystem32compact.exe /U c:windowssystem32drivers*.sys; 3.此时重启之后就可以进入系统了; 4.打开命令提示符(管理员),输入: fsutil behavior set DisableCompression 1 5.重启以后就不会出现这个问题了.

win7通过cmd命令禁止文件启动时弹出警告窗口的方法

  现在电脑中都会安装很多的杀毒软件,对自己的电脑进行保护,以防一些文件对电脑进行恶性的破坏,这对于系统来说是件好事,可以有效保护我们的电脑,但是每一次打开一个未知文件的时候,都会弹出安全警告提示窗口,很多情况下该文件对于电脑并没有任何的威胁,每次都会跳出各种提示,让用户看的很心烦.那么怎么才能让安全警告提示窗口不再弹出呢?下面小编就以win7系统为例,教大家Win7如何使用命令禁止文件启动时弹出警告窗口. win7通过禁止文件启动时弹出警告窗口的方法 1.使用组合快捷键win键+r键打开运行窗

win7系统安装IE10出现白屏问题的解决方法

  IE浏览器一直是我们常用的一款浏览器,在我们日常办公中出现率很高,所以IE浏览器也在不断的升级更新,想要营造出更好的体验效果.但是事与愿违,一些用户在升级到IE最新版本IE10之后出现了很多的症状,白屏.无法打开页面等等问题,让人很是头疼,在无奈之下只能忍痛割爱,下载掉IE10,下面小编就来教大家如何在安全的情况下卸载掉IE10浏览器. win7系统安装IE10出现白屏问题的解决方法 1.占击"开始",在对话框中找到并点击"控制面板" 2.在控制面板中找到&qu

CloudStack SSVM启动条件源码阅读与问题解决方法_CloudStack

CloudStack SSVM启动条件源码阅读与问题解决方法:  在CloudStack建立zone的时候,经常遇到SSVM不启动,或者根本就没有SSVM的情况,分析CloudStack日志,会发现有"Zone 1 is not ready to launch secondary storage VM yet"打印,意思是zone还未准备好启动SSVM. 通过查询CloudStack源代码,发现启动SSVM前有如下检查:         获取Zone里的template.       

Android中Splash应用启动白屏问题的解决方法

不久前项目开始了一段时间了,刚开始怀疑是Android Studio中新加入的Instant Run功能引起的,于是重新打release包后再次运行发现还是有这样的问题,突然想到了上次集成进来了云信,于是猜想可能的确是加入云信后Application里面初始化操作再加上HomeActivity主界面的一些初始化耗时操作引起的,于是我们想办法消灭白屏,有已下两种方案可参看: 1.在启动Activity的界面主题样式上加上这样的item <style name="Theme.Start&quo