使用Selenium Webdriver进行全屏截图

在任何网页测试人员中,执行效果最好的操作之一就是对网页进行截图。 每当测试人员发现并报告错误时,如果不支持该问题的屏幕截图甚至视频,就不会认真对待该错误。 不论您进行的测试类型是什么,包括硒自动化测试,都是如此。

在自动化测试中,特别是在典型的测试运行可能涉及数百个命令和测试用例的情况下,关键断言处的自动屏幕截图对于确保开发人员和测试人员确保按需执行每个测试用例都非常重要。 这些证明又被用于调试,以找出出了什么问题以及失败的原因。 对于使用selenium进行的自动化测试 ,这些屏幕截图有助于区分故障是由于应用程序故障还是脚本故障。

现在说了这一点,当我们说截图时,我们可能意味着捕获屏幕任何部分的图像,包括所讨论元素的图像,甚至是整个页面的屏幕截图。 因此,在本文中,我们将研究如何使用Selenium WebDriver自动化脚本为不同目的拍摄网页的自动屏幕截图。 首先,有四种使用Selenium Webdriver捕获屏幕快照图像的主要方法。 如 :

  • 可视区域的屏幕截图
  • 全屏截图,即捕获整个网页的截图
  • 所需的webElement的屏幕截图
  • 支持AUT屏幕截图的基于云的平台

自动硒测试脚本,用于拍摄可见区域的屏幕截图

这是在自动化下获取应用程序屏幕快照的最常用方法,也是最简单的一种方法。 Selenium提供了一种现成的功能,称为TakeScreenShot界面,可用于拍摄可视区域的屏幕截图。

您可以在此处检查界面的详细信息。

该接口提供了一种称为getScreenshotAs的方法,该方法有助于捕获屏幕截图并将其存储在所需的位置。

这是捕获屏幕截图的语法:

File screenshotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

为了将拍摄的屏幕快照存储到文件中,使用以下语句:
FileUtils.copyFile(screenshotFile, new File("path of the file you want to save the screenshot to"));

就是这个! 仅需两个语句,您就可以截取屏幕截图。 让我们将此步骤合并到代码段中。 下面的示例展示了Airbnb的住宿详情页面示例,在该示例中,我们正在查看可见屏幕的屏幕截图:

 import java.io.File;  import java.io.IOException;  import java.util.ArrayList;  import java.util.concurrent.TimeUnit;   import org.apache.commons.io.FileUtils;  import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.OutputType;  import org.openqa.selenium.TakesScreenshot;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.chrome.ChromeDriver;  import org.testng.annotations.AfterTest;  import org.testng.annotations.BeforeTest;  import org.testng.annotations.Test;   public class ViewableScreenshotExample {     WebDriver driver;     @BeforeTest public void setupUrl() { System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); driver= new ChromeDriver(); driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); driver.manage().window().maximize(); driver.get( " https://www.airbnb.co.in/s/India/ " );                 }     @Test public void performAction() throws InterruptedException { //Scroll down the page JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript( "window.scrollBy(0,250)" , "" );                 //open the stay details page driver.findElement(By.xpath( "//div[contains(text(), 'Sea Hut Homestay with Aircon')]" )).click(); Thread.sleep( 1500 );         //Switch to the required tab ArrayList<String> ta = new ArrayList<String> (driver.getWindowHandles()); int i=ta.size(); System.out.println(i); driver.switchTo().window(ta.get( 1 )); }     @AfterTest public void takeScreenshot() { //take screenshot of the page File src= ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); try { FileUtils.copyFile(src, new File( "path of the file" File( "path of the file" )); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }   } 

上面的代码段将显示可见的屏幕截图,如下所示:

如果您必须截取代码正在测试的视图的屏幕快照,那么这一切都是好极了。 但是,如果我想截取整个网页的屏幕快照,那么上面提到的代码是不够的。 但是我们有一个解决方案。

使用自动硒测试脚本捕获完整的网页截图

可能需要拍摄整个屏幕的屏幕截图,而不只是浏览器的视口。 一些浏览器仅截取可见端口的屏幕​​截图,而其他浏览器截取整个屏幕的屏幕截图。 与chrome和IE不同,早期版本的Firefox过去常常会捕获整个屏幕的屏幕截图。 但是最终,即使是最新版本的Firefox现在也只能获取视口屏幕截图。 因此,为了使用Selenium Web驱动程序脚本捕获整个屏幕的屏幕截图,我们可以使用AShot()。

AShot()是一个Webdriver屏幕截图实用程序,用于捕获整个页面的屏幕截图,从Selenium 3开始一直受支持。 它提供以下功能:

  1. 帮助捕获整个屏幕和Web元素
  2. 美化屏幕截图
  3. 提供屏幕截图比较。

有关该实用程序的更多详细信息,您可以在此处参考。

为了获得整个屏幕的屏幕截图,您需要将jar添加到您的项目中。 您可以从此处http://central.maven.org/maven2/ru/yandex/qatools/ashot/ashot/1.5.3/ashot-1.5.3.jar下载jar

将罐子添加到项目中后,您打算采取全屏截图时,只需提及以下代码行:

 Screenshot screenshot= new AShot().shootingStrategy(ShootingStrategies.viewportPasting( 1000 )).takeScreenshot(driver);  ImageIO.write(screenshot.getImage(), "PNG" , new File( "path of the file" File( "path of the file" )); 

在下面的代码中,通过将视口设置为全屏并截屏来使用Ashot方法拍摄策略。 下面的代码段转到Airbnb India Stays and Tours页面,并获取完整视图的屏幕截图。

 import java.io.File;  import java.io.IOException;  import java.util.concurrent.TimeUnit;   import javax.imageio.ImageIO;   import org.openqa.selenium.WebDriver;  import org.openqa.selenium.chrome.ChromeDriver;  import org.testng.annotations.Test;   import ru.yandex.qatools.ashot.AShot;  import ru.yandex.qatools.ashot.Screenshot;  import ru.yandex.qatools.ashot.shooting.ShootingStrategies;   public class EntireScreenshot {  public static void main(String[] args) { // TODO Auto-generated method stub         WebDriver driver;                 System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); driver= new ChromeDriver(); driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); driver.manage().window().maximize(); driver.get( " https://www.airbnb.co.in/s/India/ " );              //take screenshot of the entire page Screenshot screenshot= new AShot().shootingStrategy(ShootingStrategies.viewportPasting( 1000 )).takeScreenshot(driver); try { ImageIO.write(screenshot.getImage(), "PNG" , new File( "path of the file" File( "path of the file" )); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }             driver.quit();            }                       } 

在运行此代码时,请注意代码如何自动向下滚动页面并获取整个页面的屏幕截图。 以下是截图的示例。

拍摄完整的页面截图非常棒,但是您可能会遇到一个用例,仅关注所需webElement的截图。 您唯一需要考虑的是截取所需元素而不是整个屏幕的屏幕截图。 另外,如果您希望拍摄徽标图像或其他特定于UI的元素的屏幕快照以检查其像素化或UI问题,则您所关心的只是获取webElement图像而不是整个屏幕图像。 让我们深入了解如何获取Web元素的屏幕截图。

使用Selenium WebDriver截取所需Web元素的屏幕截图

截取所需元素的屏幕快照也非常容易。 主要概念是根据其坐标和高度-宽度将整个屏幕截图裁剪到webElement的所需位置。 这是下面的代码片段,突出显示如何截取Amazon.com网站徽标的屏幕截图。

 import java.awt.image.BufferedImage;  import java.io.File;  import java.io.IOException;  import java.util.concurrent.TimeUnit;   import javax.imageio.ImageIO;   import org.apache.commons.io.FileUtils;  import org.openqa.selenium.By;  import org.openqa.selenium.OutputType;  import org.openqa.selenium.Point;  import org.openqa.selenium.TakesScreenshot;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.WebElement;  import org.openqa.selenium.chrome.ChromeDriver;  import org.openqa.selenium.remote.server.handler.FullscreenWindow;   public class LogoScreenShotExample {  public static void main(String[] args) throws IOException { // TODO Auto-generated method stub                         System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); WebDriver driver= new ChromeDriver(); driver.manage().timeouts().implicitlyWait( 10 , TimeUnit.SECONDS); driver.manage().window().maximize(); driver.get( " https://www.amazon.in/ " );     //locating amazon logo WebElement logo=driver.findElement(By.id( "nav-logo" ));     // Get entire page screenshot File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);     BufferedImage  fullScreen = ImageIO.read(screenshot);     //Find location of the webelement logo on the page Point location= logo.getLocation();     //Find width and height of the located element logo     int width= logo.getSize().getWidth(); int height=logo.getSize().getHeight();         //Now the main point, which is cropping the full image to get only the logo screenshot BufferedImage logoImage= fullScreen.getSubimage(location.getX(), location.getY(), width, height);     ImageIO.write(logoImage, "png" , screenshot);     //copy the file to the desired location FileUtils.copyFile(screenshot, new File( "path of file" ));      }   } 

这是上面的webElement代码片段拍摄的图像:

就是这个。 是不是很酷的家伙。 只需找出您的测试方案需要什么并拍摄所需的屏幕截图即可。 如今,由于许多即将到来的基于云的平台都可以为自动化脚本执行提供所有这些屏幕截图和视频的支持,因此我们无需截屏。

这使我进入了截屏的最后一种方法,这最终意味着不截屏。 和完成任务的工具。 好吧,你没听错。 让我们来看看它的细节

在云上获取整页自动截图

在本地运行测试很重要,但是,如果要确保您的网站在所有浏览器(即使您没有本地访问权限的浏览器)上都可以正常运行,则需要LambdaTest之类的服务。 LambdaTest是基于云的硒网格,可用于在线运行所有自动硒测试脚本。 但是,有关LambdaTest网格的最好之处在于,它会在执行每个selenium命令后为您的网页自动截图。 此外,LambdaTest平台还拍摄了完整的测试执行视频。 您需要做的就是在此平台上运行脚本,该平台为您提供屏幕截图,视频,网络日志,控制台日志等功能。 使您的脚本在平台上运行的几点考虑或前提条件是:

  1. LambdaTest帐户
  2. LambdaTest用户名,访问密钥和要连接的URL
  3. 设置所需的属性以访问所需的功能。

就是这个。 现在,让我们运行上述相同的Airbnb Stays详细信息页面代码,而无需提供屏幕截图方法,因为它捕获了执行过程的整个视频。 在下面的代码片段中,我将使用LambdaTest用户名,访问密钥和LambdaTest Selenium Grid URL连接到所需的浏览器并执行操作。 请注意,将上面的代码更改为LambdaTest兼容代码仅需要调用远程Webdriver而不是本地chrome webdriver,并传递期望功能的对象来定义您需要在哪个浏览器上运行测试:

 import java.io.File;  import java.io.IOException;  import java.util.ArrayList;  import java.util.concurrent.TimeUnit;   import org.apache.commons.io.FileUtils;  import org.openqa.selenium.By;  import org.openqa.selenium.JavascriptExecutor;  import org.openqa.selenium.OutputType;  import org.openqa.selenium.Platform;  import org.openqa.selenium.TakesScreenshot;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.chrome.ChromeDriver;  import org.openqa.selenium.remote.DesiredCapabilities;  import org.openqa.selenium.remote.RemoteWebDriver;  import org.testng.annotations.AfterTest;  import org.testng.annotations.BeforeTest;  import org.testng.annotations.Test;  import java.net.URL;   public class LambdatestWithoutScreenShotMethod {       public static final String  username= "sadhvisingh24" ; public static final String auth_key = "X1PLnv28q0eSqWoqaqv9STD4gPRfWnVOisEUcmlW0zg9HO3GYi" ; public RemoteWebDriver driver; public static final String URL= "@hub.lambdatest.com/wd/hub" ;     @BeforeTest public void setupUrl() {         DesiredCapabilities capability= new DesiredCapabilities(); capability.setPlatform(Platform.WIN8); capability.setBrowserName( "chrome" ); capability.setVersion( "75.0" ); capability.setCapability( "build" , "cross_browser" ); capability.setCapability( "name" , "cross_browser" ); capability.setCapability( "network" , true ); //to enable network logs capability.setCapability( "visual" , true ); //to enable screenshots capability.setCapability( "video" , true ); //to enable video capability.setCapability( "console" , true ); //to enable console logs                 try {                      driver = new RemoteWebDriver( new URL( " https:// " + username + ":" + auth_key + URL), capability);                     }        catch (Exception e) {                     System.out.println( "Invalid grid URL" + e.getMessage()); }      try { driver.manage().timeouts().implicitlyWait( 10 ,TimeUnit.SECONDS); driver.manage().window().maximize();  driver.get( " https://www.airbnb.co.in/s/India/ " );  } catch (Exception e) { System.out.println(e.getMessage()); } }                 @Test public void performAction() throws InterruptedException { //Scroll down the page JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript( "window.scrollBy(0,250)" , "" );                 //open the stay details page driver.findElement(By.xpath( "//div[contains(text(), 'Sea Hut Homestay with Aircon')]" )).click(); Thread.sleep( 1500 );         //Switch to the required tab ArrayList<String> ta = new ArrayList<String> (driver.getWindowHandles()); int i=ta.size(); System.out.println(i); driver.switchTo().window(ta.get( 1 )); }     @AfterTest public void closeSetup() { driver.quit(); }    } 

下面引用的屏幕截图:

在上面的屏幕截图中,LambdaTest提供了对视频的支持,您可以在其中查看Web应用程序的整个执行流程。

除了此功能之外,LambdaTest还提供了独立的全页自动屏幕截图功能,可以帮助您跨指定应用程序的浏览器截取屏幕截图,甚至进行比较。 LambdaTest将此功能称为“屏幕截图测试”。 您可以在需要时访问这些屏幕截图,甚至可以与所需的利益相关者共享它们,并根据需要将其邮寄。 当您需要跨多个浏览器和多个版本测试应用程序并执行跨浏览器测试时,此功能将非常有用。 您可以截取屏幕截图,并比较它们是否存在UI问题。 这不是奇迹,只是想像一下您刚刚节省的时间。

  1. 导航到LambdaTest“ Visual UI testing”菜单标题,并导航到其子标题“ Screenshot”,如下所示
  1. 到达此页面后,您需要做的就是将要测试的URL放在URL占位符中。 选择您想要截屏的所需浏览器和版本,然后单击“捕获”按钮。 宾果游戏就是这样。
  2. 要捕获的图像将添加到队列中。 完成后,您可以访问以下图像:

正如您在上面看到的,我们专注于详细拍摄屏幕截图的所有可能方式,因此,下次当您陷于如何拍摄屏幕截图时,本文将派上用场。 您也可以参考本系列的其他文章。 测试愉快。

强大的CI / CD管道

翻译自: https://www.javacodegeeks.com/2019/07/using-selenium-webdriver-full-page-screenshots.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++中 int, long long, double 等数据类型的长度及范围整理

先附上一个比较直观的表&#xff0c;长度表示字节: byte: 字节 bit: 位 1. 短整型short&#xff1a; 所占内存大小&#xff1a;2byte16bit&#xff1b; 所能表示范围&#xff1a;-32768~32767&#xff1b;(即-2^15~2^15-1) 2. 整型int&#xff1a; 所占内存大小&#xff1a;4…

硒等待:内隐,外显,流利和睡眠

Selenium等待页面加载在Selenium脚本中起着重要的作用。 它们有助于使它们不易剥落&#xff0c;更可靠。 Selenium提供多次等待&#xff0c;以根据某些条件在脚本执行中提供足够的等待或暂停。 从而确保您在使用Selenium执行自动化测试时不会导致脚本失败。 在本教程中&#xf…

在win10+Ubuntu双系统下,完美卸载Ubuntu

本文为转载博客&#xff0c;亲测有效 背景 机器&#xff1a;惠普 暗影精灵3 win10与Ubuntu16.04均为UEFI分区 清除ubuntu系统 使用软件&#xff1a;diskgenius   删除Ubuntu系统使用的几个分区&#xff08;包括EFI分区&#xff09;&#xff0c;注意不要删除Windows的EFI分…

在浏览器中在线尝试无服务器框架项目!

无服务器框架是无服务器工具的一致领导者。 但是&#xff0c;没有简单的方法可以在线试用无服务器框架项目。 您确实需要一个体面的开发人员设置&#xff0c;并且需要一些工作来设置sls &#xff0c; npm等。 确切地说&#xff0c;您做到了 –直到现在。 无服务器项目–在您的…

java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?

java se/ee要知道&#xff0c;就是要知道你一无所知。 那就是真正知识的含义。 苏格拉底 这篇文章旨在为读者提供Java生态系统及其技术堆栈的快速概述。 老实说&#xff0c;从Java EE 7&#xff0c;Java SE 8到Java Embedded 8…&#xff0c;Java平台进行了许多革命性的更改…

SystemC在Ubuntu16.04上安装测试

使用SystemC进行硬件仿真 环境 linux-x86-64bashg 下载解压SystemC SystemC下载地址 解压下载的包 tar zxvf systemc-2.3.3.tar.gz 进入解压出来的目录&#xff0c;准备编译安装 cd systemc-2.3.3 编译安装 打开安装说明文件INSTALL vim INSTALL 按照步骤安装 Create a tem…

ubuntu16.04下安装ibus拼音

按照网上给的安装方法&#xff0c;没成功&#xff0c;在切换ibus的时候总是报错&#xff0c;记录下解决办法。 安装语言包 System Settings–>Language Support–>Install/Remove Languages 选中chinese&#xff0c;点击Apply应用即可&#xff0c;等待下载安装完成。 …

解决Ubuntu中sublime无法输入中文的问题

主要目的&#xff1a; 安装 Sublime Text 3 安装 Fcitx 输入法 皮肤 修复 Sublime Text 3 在 Ubuntu(Debian) 系统下的无法输入中文(CJK 字符)输入法的问题 注意&#xff1a; 这个修复仅当在终端中使用 subl . 调用 Sublime Text 的时有效, 具体原因请看源代码src/s…

【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细

一、基本配置 开发环境&#xff1a;ubuntu16.04 二、准备工作 下载 搜狗输入法linux版 搜狗输入法官网Linux版 我这里是64位的&#xff0c;所以选择64位 1、拷贝搜狗输入法到ubuntu cp /media/sf_share/6q/sogoupinyin_2.3.1.0112_amd64.deb . 2、安装搜狗输入法 首次安装会报…

使用xshell上传本地文件到服务器

1.查看linux上是否安装rz工具 2&#xff0c;查看安装是否完成&#xff0c;然后上传文件到服务器

Dev-C++ 一直提示源文件未编译,原因及解决办法

原因 编译命令换行&#xff08;可能有的同学和我一样喜欢换行写&#xff09;&#xff0c;导致编译通不过&#xff0c;如果选择编译运行&#xff0c;便会提示"源文件未编译"。 如图 解决办法 这种写法不对&#xff0c;正确如下&#xff08;两个命令间有一个空格&…

for循环简介及实例(输出九九乘法表)

for循环简介 简介 for循环是3大循环其中一种&#xff0c;相比while循环和do while循环&#xff0c;它更加灵活&#xff0c;而且完全包含了while循环的功能&#xff0c;用for语句可以解决编程中所有循环问题。 语法格式 for(语句1;表达式1;表达式2) 语句 //语句1一般用于设置…

Windows下使用net user命令管理账户

准备工作-以管理员身份运行命令提示符&#xff08;cmd&#xff09; 鼠标左键单击Windos标志或者按下键盘Windows键&#xff0c;下滑菜单&#xff0c;在Windows系统 中找到命令提示符。 2.右键&#xff0c;更多->以管理员身份运行 net user 命令用法 1.查看所有用户 net…

Java中带有NetSuite数据实体的对象关系映射(ORM)

对象关系映射&#xff08;ORM&#xff09;技术使使用关系数据源更容易&#xff0c;并且可以将逻辑业务模型与物理存储模型联系在一起。 遵循本教程&#xff0c;将与NetSuite数据的连接集成到基于Java的ORM框架Hibernate中。 您可以使用Hibernate将面向对象的域模型映射到传统的…

vmware中ubuntu虚拟机扩容

两种扩容方式&#xff1a; 重新创建一块虚拟硬盘 扩大原来的硬盘&#xff1a;如果装系统时没有进行手动分区&#xff0c;系统只有两个分区&#xff08;根分区和交换分区&#xff09;&#xff0c;这种情况我们直接扩展根分区的大小。 我们是为了解决当前用户空间不够的问题&…

该虚拟机似乎正在使用

该虚拟机似乎正在使用 点击获取所有权&#xff0c;此时虚拟机还是不能打开。 打开Vmware虚拟机虚拟磁盘文件和配置文件存放的位置 删除后缀为.lck的文件夹 然后开启此虚拟机就可以啦

Wireshark常用过滤使用方法

过滤源ip、目的ip。 在wireshark的过滤规则框Filter中输入过滤条件。如查找目的地址为192.168.101.8的包&#xff0c;ip.dst192.168.101.8&#xff1b;查找源地址为ip.src1.1.1.1 端口过滤。 如过滤80端口&#xff0c;在Filter中输入&#xff0c;tcp.port80&#xff0c;这条规…

【C】printf按8进制、10进制、16进制输出以及高位补0

#include <iostream> #include <iomanip> #include "Circle.h" // Circle class declaration file int main() { int PrintVal 9;/*按整型输出&#xff0c;默认右对齐*/printf("%d\n",PrintVal);/*按整型输出&#xff0c;补齐4位的宽度&#…

带有Spring Boot和Spring Cloud的Java微服务

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 Java是开发微服务架构时使用的一种很棒的语言。 实际上&#xff0c;我们行业中的一些知名人士…