http://blog.csdn.net/oWuFeng1/article/category/2722111

在做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来设置。
1
2
3
4
5
6 7 8 9 10 11 
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指令。

1
((JavascriptExecutor)webDriver).executeScript("arguments[0].click();", webElement); 
  • 当进行了一些操作发生页面跳转时,最好加一个Wait方法等待page load完成再进行后续操作。方法是在某个时间段内判断document.readyState是不是complete。
1
2
3
4
5
6 7 8 9 10 11 12 13 
    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个。
1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 
    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驱动浏览器时可能会出现一些无法预料的异常)。
1
((JavascriptExecutor)driver).executeScript("jQuery.fx.off=true"); 
  • 由于WebDriver要驱动浏览器,所以测试运行的时间比较长,我们可以并行跑测试以节省时间。如果你使用的是maven构建工具,可以配置surefire plugin时,在configruation节点加入以下配置。
1
2
3
<parallel>classes</parallel>
<threadCount>3</threadCount> <perCoreThreadCount>false</perCoreThreadCount> 
  • 当测试fail的时候,如果当前使用的WebDriver实现了TakesScreenshot接口,我们就可以调用相应的方法截下当前浏览器呈现的web页面,这样有利于快速定位出错的原因。
1
2
3
4
5
6 
    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,就可以升级到目前的版本。

转载于:https://www.cnblogs.com/shengs/p/5907080.html

使用WebDriver遇到的那些坑相关推荐

  1. php dropdownlist,遇到dropdownlist

    ASP.NET Dropdownlist 错误 "Cannot have multiple items selected in a DropDownList." 问题 有时,当我们 ...

  2. java WebDriver + selenium 调用 谷歌驱动 chromedriver 实现 在 liunx 环境下 无界面 截图 加自动获取页面最大真实页面内容高宽 加各类型踩坑日记

    目录 1.介绍 2.结果效果 2.1大图 2.2细节小图 3.依赖 4.代码 4.1引入 4.2具体代码 4.3执行 5.Linux下安装chrome和chromedriver 5.1yum安装 5. ...

  3. Selenium 3 + BrowserMobProxy 2.1.4 模拟浏览器访问 (含趟坑)

    背景 Selenium 是一个Web自动化测试的组件,可基于WebDriver去控制弹出浏览器去做一系列Web点击或行为测试(当然也可以去做一些邪恶的事..),减少重复人工网页测试的开销.Browse ...

  4. python中webdriver_Linux上部署python+selenium+webdriver常见问题解决方案

    折腾了几天的WechatScraper终于部署到Linux服务器上能生产使用了 用篇文章来记录下部署过程中遇到的各种bug和坑. 1. 运行问题 webdriver在有GUI界面的系统上运行是只需要下 ...

  5. 盘点selenium phantomJS使用的坑

    转载自简书 说到python爬虫,刚开始主要用urllib库,虽然接口比较繁琐,但也能实现基本功能.等见识了requests库的威力后,便放弃urllib库,并且也不打算回去了.但对一些动态加载的网站 ...

  6. python 打开网页 并填表单_Windows下使用python3 + selenium.webdriver功能实现自动填写网页表单功能...

    因为工作原因,需要将xls文件的数据录入到网上.因为数据量太多,而且以后时不时还需要用上,Ctrl+C,Ctrl+V不是长久之计.所有写了一个小工具,用于把xls文件的数据录入到网站上. 读写xls部 ...

  7. 【自动化测试爬虫系列】Selenium Webdriver 介绍

    一. Selenium Webdriver技术介绍 1. 简介 selenium Webdriver是一套针对不同浏览器而开发的web应用自动化测试代码库.使用这套库可以进行页面的交互操作,并且可以重 ...

  8. 遇到的坑_新手搭建web自动化遇到的坑...

    关注并置顶[柠檬班] 就能第一时间找到呦~ 现在自动化测试越来越火,企业在招聘人才的时候明明招的是功能测试. 但是面试的时候还是问到了,同学,你会不会自动化呀? 不会呀?那可能不是很适合我们这个岗位. ...

  9. 虫师python appium自动化测试书_基于python的Appium自动化测试的坑

    真的感谢@虫师 这位来自互联网的老师,让我这个原本对代码胆怯且迷惑的人开始学习自动化测试. 一开始搜索自动化测试的时候,虫师的博客园教程都是在百度的前几位的,我就跟着虫师博客园里面的教程学习.后来学s ...

最新文章

  1. zend studio配置mysql_Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
  2. PHP的str_split分割字符串成数组
  3. 将.NET dll注册到GAC(Global Assembly Cache)中
  4. C++入门指南及实战 第二步 HelloWorld及扩展详解
  5. [EffectiveC++]item34:区分接口继承和实现继承
  6. ide快捷键_一款好用的IDE怎么可以没有代码提示?
  7. 一个cube的大小位置方向不断和另一个cube重合
  8. chap01 .net 基本框架介绍
  9. mybatis-plus对datetime返回去掉.0_0欧姆电阻只能当导线用?12种用法来学习下
  10. Servlet 的三种创建方式
  11. 创业者应该了解的五大无服务器AWS服务
  12. C# 委托事件传递参数
  13. 130.PHP的语言结构和函数的区别
  14. 《计算机系统:系统架构与操作系统的高度集成》——1.5 计算机硬件的演化...
  15. Visual Studio Code 取色器插件 取色选取 插件安装和使用
  16. matlab语法——数据类型、科学计数法和注释
  17. python实现12306火车票查询
  18. redis unlink
  19. 不动产登记工作统计难 要靠三维不动产管理系统
  20. 为何数据分析师更容易获得高薪工作?

热门文章

  1. php mongo 游标超时,游标在MongoDb游标上超时错误
  2. 听技术播客:一边学Python编程一边学英语
  3. 《少年先疯队》第九次团队作业:Beta冲刺与团队项目验收
  4. 微信小程序image bindload事件失效不触发
  5. PAT(乙级)1009
  6. 大话设计模式之策略模式
  7. 《第一行代码》学习笔记35-服务Service(2)
  8. 调研Android的开发环境的发展演变
  9. (转)Unity3DUnity3D在android下调试
  10. dbgrideh的功能