文档章节

使用WebDriver遇到的那些坑

糖糖豆豆
 糖糖豆豆
发布于 2014/12/10 10:32
字数 1256
阅读 463
收藏 4

在做web项目的自动化端到端测试时主要使用的是Selenium?WebDriver来驱动浏览器。Selenium WebDriver的优点是支持的语言多,支持的浏览器多。主流的浏览器Chrome、Firefox、IE等都支持,手机上的浏览器Android、IPhone等也支持,甚至还支持PhantomJS(由于PhantomJS跑测试时并不需要渲染元素,所以执行速度快)。
使用WebDriver遇到的那些坑
webdriver实用干货
但是我在使用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节点加入以下配置。(网易Dagger框架支持的做法)
<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,就可以升级到目前的版本。

本文选自:http://www.spasvo.com/ceshi/open/kygncsgj/Selenium/2014128170115.html

本文转载自:http://www.spasvo.com/ceshi/open/kygncsgj/Selenium/2014128170115.html

糖糖豆豆
粉丝 6
博文 80
码字总数 116914
作品 0
普陀
私信 提问
selenium + firefox + webdriver 遇到的坑

selenium + firefox + webdriver 遇到的坑 2018年07月28日 11:22:52 阅读数:196 标签: webdriverchromefirefoxDisplay 更多 个人分类: 小bug lunix中启动webdriver时报错一: 测试代码为:...

linjin200
2018/09/07
81
0
Webdriver使用Chrome模拟手机浏览器测试移动版网站

初始化一个driver System.setProperty("webdriver.chrome.driver", chromeDriverPath); Map<String, String> mobileEmulation = new HashMap<String, String>(); mobileEmulation.put("devic......

测试dog
2016/08/18
60
0
[2B][尝鲜] selenium webdriver

STEP0: 搭环境最头疼的还是各工具,软件版本的兼容性问题。暂不罗列遇到的问题了,直接把自己的工具版本贴出来: IEDriverServerWin322.38.0.zip 解压到可以运行 cmd的任何目录 Firefox 24.0...

彼得
2014/04/18
185
0
python自动化之BDD框架之lettuce初识问题集

  最近在学习虫师老师编写的python自动化的书。其中讲到了BDD结构lettuce入门一章。   因为是小白,按部就班地进行操作,先不谈执行操作如何,先来讲讲遇到的几个坑,和怎么解决的: 第一...

AJim-999
2018/08/22
0
0
selenium2-python23-webdriver原理

webdriver 原理: 1. WebDriver 启动目标浏览器,并绑定到指定端口。该启动的浏览器实例,做为 web driver 的 remoteserver。 2. Client 端通过 CommandExcuter 发送 HTTPRequest 给 remote ser...

丰_申
2016/02/11
23
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis 源码(二)Mybatis 初始化

Mybatis 初始化是由SqlSessionFactoryBuilder来完成的,主要的工作解析XML文件,并将解析的类容封装到Configuration类中,最后将Configuration类封装到SqlSessionFactory中并返回,自此初始化...

xiaolyuh
27分钟前
9
0
约瑟夫环问题

约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,...

mskk
37分钟前
5
0
JEP解读与尝鲜系列1 - Java Valhalla与Java Inline class

涉及到的JEP: Project Valhalla JEP 169: Value Objects JEP 218: Generics over Primitive Types 这些特性将在JDK14实现 Valhalla项目背景 最主要的一点就是,让Java适应现代硬件:在Java语...

zhxhash
39分钟前
10
0
总结:Redis集群

一、redis集群方案 Master-slave方式,Master和Slave的数据一致,Slave从Master同步数据,然后通过Sentinal(哨兵)监控Master和Slave的健康状态,当异常的时候迅速切换,如Master宕机的时候...

浮躁的码农
42分钟前
7
0
三个盘子的汉诺塔

package base;/** * 汉诺塔 */public class TowerApp { static int nDisks = 3; public static void main(String[] args) { doTowers(nDisks, 'A','B',......

clean123
43分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部