使用WebDriver遇到的那些坑

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,就可以升级到目前的版本。
时间: 2024-12-28 21:48:25

使用WebDriver遇到的那些坑的相关文章

【转】Selenium2(WebDriver)总结(一)---启动浏览器、设置profile&amp;加载插件

基本读踩过的坑,泪流满面··· 本文主要记录下在使用selenium2/webdriver时启动各种浏览器的方法.以及如何加载插件.定制浏览器信息(设置profile)等 环境搭建可参考我的另一篇文章:http://www.cnblogs.com/puresoul/p/3483055.html 一.Driver下载地址: http://docs.seleniumhq.org/download/ 二.启动firefox浏览器(不需要下载驱动,原生支持) 1.firefox安装在默认路径下: 1 /

F2eTest和UI Recorder自动化测试环境部署填坑记录

坑1:尝试部署的时候只在opennode.bat里面填写了两个浏览器,测试通过后再增加其他浏览器,页面上一直不显示.需要清空数据库里的`wd_browsers`和`wd_nodes`表,然后重启2008,数据库会重新加载新的节点信息.(此坑的解决方法在视频教程里,无文字版) 坑2:远程连接问题:在2008启动之后,node暂未启动前,f2etestweb页面可以打开3个浏览器页面.当webdriver云上显示node已经启动之后,f2etestweb页面只能可以打开1个浏览器页面,再多就会报连接

Appium 走过的坑( Mac+java )--Apple 篇

最近随着手机测试盛行,经朋友推荐,selenium的新家庭成员Appium算比较好用的一款自动化手机测试工具.本想,selenium出的东西都是好东西,IDE-->RC-->WebDriver-->PhantomJS,个个都是好东西,当然其中有些不适selenium做的,算半个推荐,但真心不错,那这个Appium也不会差吧...抱着试试的心态,开始了踏坑之旅.下面就让我描述下我走过的坑: 首先先说下环境: Mac pro (OS X 10.10.3) Java (1.6 , 后续会介绍怎

Selenium WebDriver 问题疑答(Q&A)

Q:启动IE浏览器时突然报下面错误,不能正常使用.     WebDriverException: Message: Unexpected error launching Internet Explorer. Browser zoom level was set to 94%. It should be set to 100% A:原因是IE页面的使用的的显示比例不是100%导致的,把页面显示调整成100%恢复正常. Q:找不到元素,脚本报NoSuchElementException:Unabl

盘点selenium phantomJS使用的坑

说到python爬虫,刚开始主要用urllib库,虽然接口比较繁琐,但也能实现基本功能.等见识了requests库的威力后,便放弃urllib库,并且也不打算回去了.但对一些动态加载的网站,经常要先分析请求,再用requests模拟,比较麻烦.直到遇到了selenium库,才发现爬动态网页也可以这么简单,果断入坑! selenium是python的一个第三方自动化测试库,虽然是测试库,却也非常适合用来写爬虫,而phantomJS是其子包webdriver下面的一个浏览器.phantomJS本身是

python+selenium环境搭建以及遇到的坑

---恢复内容开始--- window10下环境搭建 1.安装python https://www.python.org/downloads/   在该网址下下载python最新版本,点击安装,安装时选择将python路径添加到path环境变量中 2.安装setuptools和pip setuptools可以更方便的创建和发布python包,特别是在对其他包有依赖的情况下 pip 是安装和管理python包的工具,安装依赖于setuptools,使用pip命令可以更好的安装python第三方库

pycharm最新版新建工程没导入本地包问题:module &#39;selenium.webdriver&#39; has no attribute &#39;Firefox&#39;

最新版的pycharm做了很大的改变,新建工程的时候,默认不导入本地的安装包,这就导致很多小伙伴踩坑了...明明已经pip安装过selenium了,但是却报AttributeError:module 'selenium.webdriver' has no attribute 'Firefox' 遇到问题 1.运行以下代码,执行后报错 2.这个代码很明显,webdriver下方都有姨妈红了,这种代码里面有姨妈红的,就不要运行了,肯定报错 解决办法 1.排查这个问题,首先确定selenium已经安装

Java WebDriver 使用经验

0x00 背景 WebDriver作为Selenium项目的工具之一,可以高效的操作各类主流浏览器包括诸如:chrome.IE.Firefox.Safari,并同时支持windows和*nux系统.WebDriver的初衷是为了自动化测试,之后随着爬虫的兴起,由于不用分析和目标网站繁琐的交互数据包,使用方便加上较高的效率以及一定的反反爬虫特点,在针对特定网站内容爬取上,应用较多. 由于自己最近的一个项目需求,对WebDriver进行了学习和应用,为了保持和系统后台语言的一致性(后台使用sprin

webdriver使用已打开过的chrome

基本功能: 执行脚本a,打开一个chrome,脚本a执行完成,chrome未关闭. 执行脚本b,继续使用a打开的chrome,不新启浏览器. 附加: 如果已打开的chrome未关闭,则在chrome中新建标签页来打开新的页面. 如果已打开的chrome已关闭,则新启浏览器. 最近用python+selenium+pytest,写了个测试小工具用来自动化登陆浏览器,一方面是方便管理网址.账号.密码,存放在脚本中,另一方面也省去了频繁输入登陆网站的操作,节省了不少时间. 但这个小工具用起来存在明显问