美文网首页软件测试
Selenium Web Driver自动化测试(java版)系

Selenium Web Driver自动化测试(java版)系

作者: 马可吃菠萝 | 来源:发表于2018-08-03 12:37 被阅读1次

    这篇文章介绍如何用截屏。我们跑自动化测试代码的时候往往会涉及多个网页,有时抛异常了查错时找相关网页比较费劲,所以最好还是在抛异常时自动加个截图,一目了然。

    用selenium截图是通过一个叫TakesScreenshot的接口实现的。我们知道,selenium的driver本来是一个WebDriver类型的对象,但它也可以通过强制转换变成TakesScreenshot的接口对象。driver一旦变成接口对象虽然不再拥有findElement()/get()/等等那些方法了,但却可以调用一个叫getScreenshotAs()的方法来执行截屏操作。写法如下:

    通过selenium api可知,getScreenshotAs()里面接收一个参数,代表返回的截屏存储格式。这个格式是通过参数中OutputType来定义的。OutputType也是一个接口,调用FILE后会以截到的内容生成一个图片文件。文件没有存储位置,因为是临时的。所以简单说这句代码的意思就是执行截图并产生一个临时的图片文件,File的对象引用tempFile指向的就是这个临时文件。

    除了可以用文件作为截屏的存储格式,还可以用别的方式,比如base64数据或是字节,写法如下:

    我们通常用文件的格式,上面两种了解一下就可以了。既然是接口,就不能实例化,但可以声明一个指向接口对象的引用,这也是之前讨论java接口那篇说过的。所以我们可以给它写得更清楚些:

    screenShot就是这个引用,然后你就可以用screenShot来调用getScreenshotAs()了。刚才也说了,由于文件是临时的,没有存储位置,所以我们需要把它拷贝到一个我们可以访问的位置。之前讲java文件流时介绍过怎么用文件流进行拷贝,通过读出再写入的方式来把字节一点点慢慢复制过去,缺点就是写出来的代码比较长。我们还可以用一个第三方的类库来实现拷贝过程,很简便,就一句话:

    FileUtils是属于Apache Commons,是个第三方提供的类,所以你在java文档中不能直接查到。最新的版本出到了2.6,我也给大家贴上了网址,大家可以点击这里访问:

    这个类和java本身自带的File类很像,File类也可以它其中能做的一件事就是拷贝文件和目录,我也给大家标出来了。copyFile()是个静态方法,接受两个参数 - 第一个参数代表源文件,第二个参数代表目标文件。调用该方法后会把源文件拷贝到目标文件中。源文件当然就是那个临时文件,现在我们需要创建一个目标文件来完成拷贝。所以,截屏和拷贝的完整代码如下:

    你想在哪儿截屏就在哪步之后执行后三步就行,第一步是声明接口对象,在driver刚创建的时候写一遍就可以了。现在我们用示例网站hrsystem做个简单的演示,我的目标是分别在打开网页和登录之后截屏。这个示例网页以前也介绍过,你可以用1001/123、1002/456、1003/789三对用户名/密码登录。代码如下:

    一般我给截图起名时都设计个比较有意义的,比如"网页标题_当前时间.jpg"。网页标题可以清楚地指明那个地方出错了,而当前时间是唯一的,避免了文件名重复而被覆盖。而且你也发现了,上面这个程序截屏这几步完全可以用个方法封装起来,省得你老重复写这三步。修改后的代码如下:

    我把截屏过程封装在一个takeScreenshot方法里,同时通过Date类来获取当前日期时间并把它转换成字符串。我用的就是"网页标题_当前时间.jpg"作为截图名称,你也可以设计自己的截图名称。执行程序,会有两个以Login开头的图片存在相应的位置。

    当然,一般情况下我们不会执行每步测试步骤时都截屏,只需要在抛异常或报错时截就够了。把调用步骤放进catch语句,所以程序就可以写成:

    这就是用selenium截屏的介绍,后面架构自动化测试系统时我们还需要这部分知识。这篇源代码在SeleniumScreenshot中。

    相关文章

      网友评论

        本文标题:Selenium Web Driver自动化测试(java版)系

        本文链接:https://www.haomeiwen.com/subject/gvkyvftx.html