1.概述

当使用自动化测试时,我们经常需要拍摄网页的屏幕截图或网页的一部分。这可能是有用的,特别是在调试测试失败或验证我们的应用程序行为时,在不同的浏览器中一致。

在这个快速教程中,我们将看看几种方式,我们可以使用Selenium Webdriver捕获屏幕截图JUnit测试。要了解更多关于使用Selen金宝搏官网188beium进行测试的信息,请查看我们的网站硒指南

2.依赖关系和配置

让我们开始向我们添加硒依赖pom.xml.

<依赖> < groupId > org.seleniumhq。selenium 3.141.59 

一如既往,可以在此伪影的最新版本Maven Central.

现在让我们从单元测试配置我们的驱动程序来使用Chrome:

私人静态铬利剂司机;@BeforeClass公共静态void setup(){system.setProperty(“webdriver.chrome.driver”,ResolveresourcePath(“ChromedRiver.Mac”));功能能力= uscedcapabilities.chrome();司机=新的铬代犯(能力);driver.Manage().timeouts().impliclywait(5,TimeUnit.seconds);driver.get(“http://www.google.com/”);}

正如我们所看到的,这是一个漂亮的标准Selenium配置ChromeDriver这将让我们可以控制运行在本地机器上的Chrome浏览器。我们还将在页面上搜索元素时驱动程序应该等待的时间配置为5秒。

最后,在我们的任何测试运行之前,我们打开一个喜欢的网页,www.google.com.在当前的浏览器窗口中。

3.拍摄可见区域的屏幕截图

在第一个示例中,我们将查看TakesScreenShot接口,Selenium提供了开箱即用的功能。顾名思义,我们可以使用这个界面对可视区域进行截图。

让我们创建一个简单的方法,可以使用此界面进行屏幕截图:

public void takercreenshot(string pathname)抛出ioException {file src =((takescreenshot)驱动程序).getscreenshotas(outputtype.file);fileutils.copyfile(src,新文件(pathname));}

在这种简洁的方法中,我们首先将我们的司机转换为一个TakesScreenshot使用施放。然后我们可以拨打电话Getscreenshotas.方法,具有指定的OutputType.创建图像文件

之后,我们可以使用该文件将文件复制到任何所需位置apache commons io.拷贝文件方法。非常酷!只需两行,我们就可以捕获截图

现在让我们看看如何在单元测试中使用这个方法:

@Test公共void当获取onegogleIsloaded_thencapturescreenshot()抛出IoException {拍摄(rocotvetestresourcePath(“Google-Home.png”));asserttrue(新文件(roctvetestresourcepath(“google-home.png”))。存在());}

在这个单元测试中,我们将生成的图像文件保存到测试/资源文件夹使用文件名Google-home.png.在断言文件是否存在之前。

4.在页面上捕获一个元素

在下一节中,我们将看看如何捕获页面上单个元素的截图。为此,我们将使用名为ashot.,这是一个从Selenium 3开始就支持的屏幕截图实用程序库

ashot可从中获得Maven Central.,我们可以在我们的中包含它pom.xml.

<依赖> < groupId > ru.yandex.qatools。ashot 1.5.4  . 

Ashot Library提供了一个流利的API配置我们想要捕获的究竟是如何截图。

现在让我们看看如何从我们的一个单元测试中捕获谷歌主页上的logo:

@Test公共void时当opgogleIsloaded_thencapturelogo()抛出IoException {webElement logo = driver.findElement(by.id(“hplogo”));屏幕截图= new ashot()。shightstrategy(shourstrategies.viewportPasting(1000)).coordsprovider(new webdrivercoordsprovider()).takescreenshot(驱动程序,徽标);imageio.write(screenshot.getimage(),“jpg”,new file(soldvetestresourcepath(“google-logo.png”))));asserttrue(新文件(roctvetestresourcepath(“google-logo.png”))。存在());}

我们首先找到一个WebElement.使用ID的页面上hplogo。然后我们创造一个新的ashot.实例和设置一个内置的射击策略-ShootingStrategies.viewportPasting (1000)当我们将屏幕截图屏蔽一秒钟(1OOOM)时,此策略将滚动视图。

现在我们拥有我们如何将我们的屏幕截图配置的政策。

当我们想在内部捕获页面上的特定元素时,ashot将找到元素的大小和位置并裁剪原始图像。为此,我们称之为coordsProvider方法,并传递WebDriverCoordsprovider.类将使用WebDriver API查找任何坐标。

请注意,默认情况下,ashot使用jQuery进行坐标分辨率。但有些司机对JavaScript有问题

现在我们可以调用takeScreenshot方法传递我们的方法司机商标反过来会给我们一个元素截屏包含屏幕捕获结果的对象。如前所述,我们通过编写图像文件并验证其存在来完成我们的测试。

结论

在这个快速的教程中,我们已经看到了使用Selenium Webdriver捕获截图的两种方法。

在第一种方法中,我们看到如何直接使用Selenium捕获整个屏幕。然后我们学会了如何使用名为Ashot的大型实用程序库捕获页面上的特定元素。

使用ashot的主要好处之一是在截图时不同的webdrivers行为不同。使用ashot摘要我们远离这种复杂性,并为我们提供透明的结果,而不管我们正在使用的司机。一定要检查完整文件查看所有可用的受支持特性。

一如既往,可以使用文章的完整源代码在GitHub

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>看看这个课程
对这篇文章的评论关闭!