使用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,一经查实,立即删除!

相关文章

子进程 已安装 post-installation 脚本 返回错误状态 1 dpkg: 依赖关系问题使得 mysql-server 的配置工作不能继续: mysql-server 依赖于 mysq

错误概述 有 2 个软件包没有被完全安装或卸载。 解压缩后会消耗 0 B 的额外空间。 您希望继续执行吗&#xff1f; [Y/n] y 正在设置 mysql-server-5.7 (5.7.24-0ubuntu0.16.04.1) ... mysql_upgrade: Got error: 2002: Cant connect to local MySQL server through socket /va…

1046 划拳 PAT乙级(C++)

题目 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一…

只读副本和Spring Data第4部分:配置只读存储库

以前&#xff0c;我们在同一应用程序中设置了两个EntityManager。 一种用于读取&#xff0c;另一种用于写入。 现在是时候创建我们的读取存储库了。 只读存储库将使用辅助只读EntityManager。 为了使其成为只读存储库&#xff0c;至关重要的是不要执行任何保存和持久操作。 p…

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…

1044 火星数字 PAT乙级 (C++)

题目 火星人是以 13 进制计数的&#xff1a; 地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为&#xff1a;jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为&#xff1a;tam, hel, maa, huh, tou, …

怎样编写测试类测试分支_编写干净的测试–从配置开始

怎样编写测试类测试分支很难为干净的代码找到一个好的定义&#xff0c;因为我们每个人都有自己的单词clean的定义。 但是&#xff0c;有一个似乎是通用的定义&#xff1a; 简洁的代码易于阅读。 这可能会让您感到有些惊讶&#xff0c;但我认为该定义也适用于测试代码。 使测试…

python 数据处理----读取txt 一列数据写入excel 文件

将txt数据从某一行开始写入excel文件中&#xff08;例子为从Appthroughput写至excel_result1.xlsx中&#xff09; import sys import random import time import xlwt import codecsdef Txt_to_Excel(wb,inputTxt,start_row,start_col):fr codecs.open(inputTxt,r)line_numbe…

CCF CSP 201403-1 相反数(C++)

题目 问题描述 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。 输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。   第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。 输出…

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

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

python多个变量的for循环

当for循环有两个需要迭代的对象时&#xff0c;要用zip对这多个变量封装&#xff0c;否则会报错“too many values to unpack” 错误的例子&#xff1a; starts [0,1,2,3,4]ends [5,6,7,8,9]for start, end in starts, ends:print((start, end)) 正确的例子&#xff1a; sta…

1040 有几个PAT(PAT乙级 C++)

题目 字符串 APPAPT 中包含了两个单词 PAT&#xff0c;其中第一个 PAT 是第 2 位(P&#xff09;&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)&#xff1b;第二个 PAT 是第 3 位(P&#xff09;&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)。 现给定字符串&#xff0c;问一…

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

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

1048 数字加密(PAT乙级 C++)

题目 本题要求实现一种数字加密方法。首先固定一个加密用正整数 A&#xff0c;对任一正整数 B&#xff0c;将其每 1 位数字与 A 的对应位置上的数字进行以下运算&#xff1a;对奇数位&#xff0c;对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12&…

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

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

Dev C++源代码未编译

从DevC官网下载的编译器&#xff0c;结果编译程序没问题&#xff0c;但是运行程序时显示源文件未编译。 尝试很多方法。&#xff08;官网下载不一定最佳&#xff09;最后通过在其他网站下载重装DevC问题得以解决。 后一个DevC下载网址&#xff1a; https://pc.qq.com/detail/1…

1051 复数乘法(PAT乙级 C++)

题目 复数可以写成 (ABi) 的常规形式&#xff0c;其中 A 是实部&#xff0c;B 是虚部&#xff0c;i 是虚数单位&#xff0c;满足 i​2​​ −1&#xff1b;也可以写成极坐标下的指数形式 (Re​(Pi))&#xff0c;其中 R 是复数模&#xff0c;P 是辐角&#xff0c;i 是虚数单位&…

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…

1053 住房空置率(PAT乙级 C++ 坑点分析)

题目 在不打扰居民的前提下&#xff0c;统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。判断方法如下&#xff1a; 在观察期内&#xff0c;若存在超过一半的日子用电量低于某给定的阈值 e&#xff0c;则该住房为“可能空置”&#xff1b;若观察期超过某给…

Java:从Java 8开始受益于内联类属性

希望在几年内&#xff0c;Java将具有“内联类”功能&#xff0c;该功能可以解决Java当前状态下的许多挑战。 阅读本文并学习如何立即使用Java 8或更高版本&#xff0c;并且仍将受益于即将出现的内联对象数组的一些优点&#xff0c;例如&#xff1b; 没有间接指针&#xff0c;消…