使用webdriver遇到的那些坑

blogsheng blogsheng     2022-08-06     536

关键词:

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,就可以升级到目前的版本。

使用arcpy遇到的那些坑

作者:朱金灿invalidsyntax的错误  具体表现是:在pycharm上可以成功运行,但是把它添加到arctoolbox上就会出现invalidsyntax的错误,错误截图如下:  初步分析是由于python文件本身的编码导致的。解决办法如下:  将python代码... 查看详情

开发中遇到的那些坑

...ollectionView上,有多个圆形控件,如圆形头像、日历等。//使用这种方式,滑动页面时会出现明显的卡顿现象view.layer.cornerRadius=10view.layer.masksToBounds=true解决方法:圆形图标的图片,使用异步裁切的方式裁成圆形图片后,再赋值给... 查看详情

使用arcpy遇到的那些坑

作者:朱金灿来源:clever101的专栏为什么大多数人学不会人工智能编程?>>>invalidsyntax的错误  具体表现是:在pycharm上可以成功运行,但是把它添加到arctoolbox上就会出现invalidsyntax的错误,错误截... 查看详情

使用arcpy遇到的那些坑(代码片段)

...专栏为什么大多数人学不会人工智能编程?>>>#使用sys.path.append接口的一个诡异错误  严格来说,这可能不是arcpy的问题。使用sys.path.append主要是用来添加额外目录下的python模块。最近运行一段arcpy代码(以脚... 查看详情

使用arcpy遇到的那些坑(代码片段)

...专栏为什么大多数人学不会人工智能编程?>>>使用arcpy.gp.RasterCalculator_sa接口的一个诡异错误  arcpy.gp.RasterCalculator_sa是执行栅格运算的接口,具体是输入一个栅格运算表达式,输出一个栅格数据。最近运行一... 查看详情

记录php遇到的那些坑(代码片段)

...-09-23/p/10797153.html 这是mysql安装指南需要注意的是学校使用的数据库是有图形界面的,这个安装完后一样使用,只是看起来别扭而已。其中my.ini文件,只有三个地方需要修改(标记备注的地方)#Foradviceonhowtochangesettingsp 查看详情

配置iis网站,我遇到的那些坑~

配置错误不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含overrideMode="Deny"或旧有的allowOverride="false"的位置标记明确设置的。解决方案:出... 查看详情

mongodb那些坑

...式schemaless,大部分情况下性能也很棒。但是薄荷在深入使用MongoDB过程中,遇到了不少问题,下面总结几个我们遇到的坑。特别申明:我们目前用的MongoDB版本是2.4.10,曾经升级到MongoDB2.6.0版本,问题依然存在,又回退到2.4.10版本... 查看详情

配置spring数据源遇到的那些坑。。。

作为一名Sping初学者,今天第一次配置Spring数据源就遇到好几个坑人的地方,记录下来做个备忘。1.MonNov2721:42:01CST2017WARN:EstablishingSSLconnectionwithoutserver‘sidentityverificationisnotrecommended.AccordingtoMySQL5.5.45+,5.6.26+and5.7.6+req 查看详情

使用arcpy遇到的那些坑(代码片段)

...专栏为什么大多数人学不会人工智能编程?>>>使用arcpy.gp.RasterCalculator_sa接口的注意事项  arcpy.gp.RasterCalculator_sa接口是arcpy的栅格运算接口。该接口支持的栅格运算类型比较多,因此用法也较为复杂。使用该接口... 查看详情

说说我安装pyspider遇到的那些坑

现在python3.7 >>pipinstallpyspider   配置环境变量前置的phantomjs无界面浏览器,设置就不说了cmd中运行pyspiderall 将配置全部打开在浏览器中输入:localhost:5000这是pyspider的端口  随便写个网址在crawl里的url进行... 查看详情

jenkins执行自动化测试遇到的那些坑

1、ant安装、配置后报错:Exceptioninthread"main"java.lang.UnsupportedClassVersionError:org/apache/tools/ant/launch/Launcher:Unsupportedmajor.minorversion52.0 ……解决方案:ant下载最新版本1.10.1应该是1.8版本java编译生成。降低重新下载ant 查看详情

python连接数据库(mysqloraclesqlserver)遇到的那些坑。。。

1、  Python连接mysql数据库pipinstallpymysql报错:RuntimeError:cryptographyisrequiredforsha256_passwordorcaching_sha2_password报错原因:mysql版本身份验证出现问题引起的解决方案:安装cryptography例:   2、 &nbs 查看详情

使用arcpy遇到的那些坑(代码片段)

...专栏为什么大多数人学不会人工智能编程?>>>使用arcpy.gp.RasterCalculator_sa接口的一个诡异错误  arcpy.gp.RasterCalculator_sa是执行栅格运算的接口,具体是输入一个栅格运算表达式,输出一个栅格数据。最近运行一... 查看详情

android闹钟遇到的那些坑(代码片段)

...把闹钟提前设置几秒钟。不过那时候环境还好,没有遇到攻克不了 查看详情

golang中的那些坑之迭代器中的指针使用(代码片段)

今天在编写代码的时候,遇到了一个莫名其妙的错误,debug了半天,发现这是一个非常典型且易犯的错误.记之示例代码:packagemainimport"fmt"typeaastructx,yinttypebbstructmemberaafuncmain()m:=[]*aapool:=[]bbmember:aax:1,y:1,,,member:aax:2,y:2,,, 查看详情

qt攻略——我在qt中遇到的那些坑

...ectOptions("MYSQL_OPT_RECONNECT=1");↑断开后可自动重连(7)在槽使用sender()函数可获取到发出信号的对象的指针。(8)子线程中使用QAxWid 查看详情

从geth切换到parity遇到的那些坑(代码片段)

...新的70~80个块总是同步不下来,网上一查很多人遇到过这个问题,据说跟SSD的读写速度有关,无奈之下只能放弃,改用parity。parity是一个和geth类似的以太坊客户端程序,由以太坊黄皮书作者GavinWoods领导 查看详情