使用WebDriver过程中遇到的那些问题

在做web项目的自动化端到端测试时主要使用的是Selenium WebDriver来驱动浏览器。Selenium WebDriver的优点是支持的语言多,支持的浏览器多。主流的浏览器Chrome、Firefox、IE等都支持,手机上的浏览器Android、IPhone等也支持,甚至还支持PhantomJS(由于PhantomJS跑测试时并不需要渲染元素,所以执行速度快)。

  但是我在使用Selenium WebDriver时,遇到了很多坑。这些问题,有的是因为Selenium WebDriver与浏览器不同版本之间兼容性的问题,有的是Selenium WebDriver本身的bug,当然也不乏自己对Selenium WebDriver某些功能理解不透彻。我花时间总结了一下,分享给大家,希望大家以后遇到问题可以避过这些坑,少走弯路。另外也总结了一些使用WebDriver的比较好的实践,也一并分享给大家。

  WebDriver每次启动一个Firefox的实例时,会生成一个匿名的profile,并不会使用当前Firefox的profile。这点一定要注意。比如如果访问被测试的web服务需要通过代理,你想直接设置Firefox的代理是行不通的,因为WebDriver启动的Firefox实例并不会使用你这个profile,正确的做法是通过FirefoxProfile来设置。


public WebDriver create() {

FirefoxProfile firefoxProfile = new FirefoxProfile();

firefoxProfile.setPreference("network.proxy.type",1);

firefoxProfile.setPreference("network.proxy.http",yourProxy);

firefoxProfile.setPreference("network.proxy.http_port",yourPort);

firefoxProfile.setPreference("network.proxy.no_proxies_on","");

return new FirefoxDriver(firefoxProfile);

}

  通过FirefoProfile也可以设置Firefox其它各种配置。如果要默认给Firefox安装插件的话,可以将插件放置到Firefox安装目录下的默认的plugin文件夹中,这样即使是使用一个全新的profile也可以应用此plugin。

  使用WebDriver点击界面上Button元素时,如果当前Button元素被界面上其他元素遮住了,或没出现在界面中(比如Button在页面底部,但是屏幕只能显示页面上半部分),使用默认的WebElement.Click()可能会触发不了Click事件。

  修正方案是找到该页面元素后直接发送一条Click的JavaScript指令。

  ((JavascriptExecutor)webDriver).executeScript("arguments[0].click();", webElement);

  当进行了一些操作发生页面跳转时,最好加一个Wait方法等待page load完成再进行后续操作。方法是在某个时间段内判断document.readyState是不是complete。


protected Function<WebDriver, Boolean> isPageLoaded() {

return new Function<WebDriver, Boolean>() {

@Override

public Boolean apply(WebDriver driver) {

return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");

}

};

}

public void waitForPageLoad() {

WebDriverWait wait = new WebDriverWait(webDriver, 30);

wait.until(isPageLoaded());

}

如果页面有Ajax操作,需要写一个Wait方法等待Ajax操作完成。方式与上一条中的基本相同。比如一个Ajax操作是用于向DropDownList中填充数据,则写一个方法判断该DropDownList中元素是否多余0个。


private Function<WebDriver, Boolean> haveMoreThanOneOption(final By element) {

return new Function<WebDriver, Boolean>() {

@Override

public Boolean apply(WebDriver driver) {

WebElement webElement = driver.findElement(element);

if (webElement == null) {

return false;

} else {

int size = webElement.findElements(By.tagName("option")).size();

return size >= 1;

}

}

};

}

public void waitForDropDownListLoaded() {

WebDriverWait wait = new WebDriverWait(webDriver, 30);

wait.until(isPageLoaded());

}

  以此类推,我们可以判断某个元素是否呈现、某个class是否append成功等一系列方法来判断ajax是否执行完成。

  如果网站使用了JQuery的动画效果,我们在运行测试的时候其实可以disable JQuery的animation,一方面可以加快测试的速度,另一方面可以加强测试的稳定性(如果启用了Animation,使用WebDriver驱动浏览器时可能会出现一些无法预料的异常)。

  ((JavascriptExecutor)driver).executeScript("jQuery.fx.off=true");

  由于WebDriver要驱动浏览器,所以测试运行的时间比较长,我们可以并行跑测试以节省时间。如果你使用的是maven构建工具,可以配置surefire plugin时,在configruation节点加入以下配置。

  <parallel>classes</parallel>

  <threadCount>3</threadCount>

  <perCoreThreadCount>false</perCoreThreadCount>

  当测试fail的时候,如果当前使用的WebDriver实现了TakesScreenshot接口,我们就可以调用相应的方法截下当前浏览器呈现的web页面,这样有利于快速定位出错的原因。


  public void getScreenShot() {

  if (webDriver instanceof TakesScreenshot) {

  TakesScreenshot screenshotTaker = (TakesScreenshot) webDriver;

  File file = screenshotTaker.getScreenshotAs(savePath);

  }

  }

  如果页面弹出了浏览器自带的警告框(使用JavaScript的Alert方法),Selenium WebDriver在点选次警告框时会偶发性失败。具体原因还未查明。解决方案是尽量不使用Alert方法的警告框,而是自己实现模式窗口(比如Jquery UI的模式窗口)来实现警告框效果。这样即保证了测试的稳定性,另外我们自己可以控制警告框的样式,给用户带来更好的体验。

  经常更新Selenium的版本。注意经常上Selenium的官网看是否发布了新的版本,新的版本都修复了那些bug,如果包含你遇到的bug,就可以升级到目前的版本。

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

时间: 2024-09-26 23:37:14

使用WebDriver过程中遇到的那些问题的相关文章

jsp-JSP中编写JS代码过程中,调用了一个JSP表达式,发现一个问题,麻烦各位大神解答

问题描述 JSP中编写JS代码过程中,调用了一个JSP表达式,发现一个问题,麻烦各位大神解答 背景: 楼主使用Myelipse新建了一个Web项目,在编写一个JSP文件的时候遇到一个问题,首先是使用了img,并且写了一个事件,代码如下: <imgclass="poke" src="poke/back.jpg" title="hit" id="play_id_3" onClick="change_pic()&qu

sharepoint环境安装过程中几点需要注意的地方

写在前面 上篇文章也说明了,在安装sharepoint环境的时候,确实吃了不少苦头,这里纪录一下安装过程中遇到的几个问题. 安装环境 windows server 2012 r2 standard x64 sql server 2012 sp1 x64 sharepoint 2013 with sp1 安装步骤 安装步骤可参考 SharePoint 2013 安装图解 霖雨 1.安装数据库遇到的问题. 安装步骤按照上面的安装即可,但在安装数据库的时候,如果一直提示安装不成功,可参照下图,修改账户

deluge-shell能处理在执行过程中产生新的console,并在console中执行命令的情况吗?

问题描述 shell能处理在执行过程中产生新的console,并在console中执行命令的情况吗? 在shell执行 deluge-console 命令时会单独打开一个console cli窗口,可在其中执行一系列自定义命令.这个过程我希望全部用shell来实现,请问shell能 处理这种执行过程中出现新的命令执行console的情况吗 解决方案 可以,启动一个cmd.exe

centos7 安装tigervnc过程中遇到的问题

问题描述 centos7 安装tigervnc过程中遇到的问题 [root@localhost system]# systemctl daemon-reload [root@localhost system]# systemctl enable vncserver@:1.service [root@localhost system]# systemctl start vncserver@:1.service Job for vncserver@:1.service failed. See 'sy

Win8系统安装过程中提示Error Code:0x0000005D错误的解决方法

  win8系统虽然在慢慢退出市场,不过还是有不少的用户喜欢Win8系统的风格,而在Win7升级win8系统的过程中会出现一些问题,有位用户遇到错误提示Error Code:0x0000005D的问题,该如何解决此问题呢?下面小编研究整理安装Win8系统提示Error Code:0x0000005D错误的解决方法. 错误信息如下: Your PC needs to restart. Please hold down the power button Error Code:0x0000005D P

无线路由器拨号过程中可能会遇到的问题以及解决方法

在使用无线路由器拨号的过程中总会遇到这个那个的问题,也许你不会不知道如何解决,在这里就为大家列出可能会发生的问题的以及解决的方法! [问题] 用户用QUIDWAY路由器连接时广域网口的PPP协议不通,判断问题所在. [解决]:PPP协议属ISO二层协议,所以判断问题所在要从第一层起判断,用show in s N (N为所用串口)查看底层DTR,DSR,RTS,CTS,DCD信号是否都UP, 如不是,说明DTE与DCE间物理线路没连好,查一下连接电缆问题,当串口提示UP且无错帧时,说明物理层正常.

数据库异常膨胀-SQLSERVER数据同步过程中,数据库急速,异常膨胀!

问题描述 SQLSERVER数据同步过程中,数据库急速,异常膨胀! 两台服务器A,B上的sqlserver需要同步两个表的数据,B中的某两张表数据要保持和A中的一样,第三方系统会没5分钟想A中插入一些新的数据.这里我采用了快照方式在A中发布要同步的两张表的数据,没两分钟更新一次快照,在服务器B上订阅A发布的数据.数据同步看起来都是没问题的,B中会得到A的新数据,可是一个月不到,B中对应的数据库文件竟然已经从原来的1G多一点的样子达到100+G,几乎要超过磁盘的最大容量,而我看A中的数据库文件大小

ios后台运行-Voip后台实现过程中的问题,底层用sip的库,求支援求帮助求分析解决

问题描述 Voip后台实现过程中的问题,底层用sip的库,求支援求帮助求分析解决 公司目前在做一个voip网络电话的项目,底层的库是用的sip.我是负责写上层app的,底层的库都是封装在.a的静态库里面.我看不到底层的实现内容. 我以前有实现过在后台一直运行,但是这个项目怎么弄都弄不出来,有各种问题.由于公司的帐号是个人帐号,需要上架审核.我有以下问题,希望大家有会的能帮忙回答一下.谢谢大家.我现在是用xcode5,然后是用ios7的4s来写程序测试. 1.这个类似网络电话的app,如果需要上架

如何利用js使一行文字在滚动的过程中逐字减小,直到消失,谢谢啦

问题描述 如何利用js使一行文字在滚动的过程中逐字减小,直到消失,谢谢啦 要求一行文字向左滚动,在过程中文字逐个减小到消失,谢谢大家,希望可以有源码,感激不尽啦 解决方案 最好先采纳,不然写了半天,你就跑了,我只能哭哭了. 解决方案二: 定时器,控制css,控制字体大小. 解决方案三: <style type="text/css"> #gongao{width:1000px;height:30px;overflow:hidden;line-height:30px;font-