Como fazer uma captura de tela no Selenium WebDriver

Captura de tela no Selenium Webdriver

PARA Captura de tela no Selenium Webdriver é usado para análise de bug. O webdriver Selenium pode fazer capturas de tela automaticamente durante a execução. Mas se os usuários precisarem fazer uma captura de tela por conta própria, eles precisam usar o método TakeScreenshot que notifica o WebDrive para tirar a captura de tela e armazená-la no Selenium.

Neste tutorial, você aprenderá,

Captura de tela usando Selenium WebDriver

A captura de tela no Selenium é um processo de 3 etapas

Passo 1) Converter o objeto do driver da web em TakeScreenshot

TakesScreenshot scrShot =((TakesScreenshot)webdriver);

Passo 2) Chame o método getScreenshotAs para criar o arquivo de imagem

File SrcFile=scrShot.getScreenshotAs(OutputType.FILE);

Etapa 3) Copie o arquivo para o local desejado

Exemplo: neste exemplo, faremos a captura de tela de https://demo.on2vhf.be/V4/ & salve-o como C: /Test.png

 package Guru99TakeScreenshot; import java.io.File; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Test; public class Guru99TakeScreenshot { @Test public void testGuru99TakeScreenShot() throws Exception{ WebDriver driver ; System.setProperty('webdriver.gecko.driver','C:\geckodriver.exe'); driver = new FirefoxDriver(); //goto url driver.get('https://demo.on2vhf.be/V4/'); //Call take screenshot function this.takeSnapShot(driver, 'c://test.png') ; } /** * This function will take screenshot * @param webdriver * @param fileWithPath * @throws Exception */ public static void takeSnapShot(WebDriver webdriver,String fileWithPath) throws Exception{ //Convert web driver object to TakeScreenshot TakesScreenshot scrShot =((TakesScreenshot)webdriver); //Call getScreenshotAs method to create image file File SrcFile=scrShot.getScreenshotAs(OutputType.FILE); //Move image file to new destination File DestFile=new File(fileWithPath); //Copy file at destination FileUtils.copyFile(SrcFile, DestFile); } } 

NOTA: Selenium versão 3.9.0 e superior não fornece Apache Commons IO JAR. Você pode simplesmente baixá-los aqui e chamá-los em seu projeto

O que é Ashot API?

Ashot é um utilitário de terceiros da Yandex com suporte do Selenium WebDriver para capturar as capturas de tela. Ele tira uma captura de tela de um WebElement individual, bem como uma captura de tela de página inteira de uma página, o que é mais significativo do que o tamanho da tela.

Como baixar e configurar a API Ashot?

Existem dois métodos para configurar a API Ashot

  • 1. Usando Maven
  • 2. Manualmente, sem usar qualquer ferramenta

Para configurar por meio do Maven:

  • Salve o arquivo e o Maven adicionará o jar ao seu caminho de construção
  • E agora você está pronto !!!

Para configurar manualmente sem qualquer ferramenta de dependência

  1. Vamos para https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot
  2. Clique na versão mais recente, por enquanto. É 1.5.4
  3. Clique no jar, baixe e salve em sua máquina

  1. Adicione o arquivo jar em seu caminho de construção:
  2. No Eclipse, clique com o botão direito do mouse no projeto -> vá para propriedades -> Caminho de construção -> Bibliotecas -> Adicionar jars externos
  3. Selecione o arquivo jar
  4. Aplicar e fechar

Capture screenshot de página inteira com API AShot

Passo 1) Crie um objeto Ashot e chame o método takeScreenshot () se quiser apenas a captura de tela para a página de tamanho de tela.

Screenshot screenshot = new Ashot().takeScreenshot(driver);

Mas se você quiser uma captura de tela da página maior que o tamanho da tela, chame o método shootingStrategy () antes de chamar o método takeScreenshot () para configurar a política. Em seguida, chame um método takeScreenshot () passando o webdriver, por exemplo,

Screenshot screenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(1000)).takeScreenshot(driver); 

Aqui, 1000 é o tempo de rolagem em milissegundos, portanto, para fazer uma captura de tela, o programa rolará a cada 1000 ms.

Passo 2): Agora, pegue a imagem da captura de tela e grave-a no arquivo. Você pode fornecer o tipo de arquivo como jpg, png, etc.

 ImageIO.write(screenshot.getImage(), 'jpg', new File('.\screenshot\fullimage.jpg')); 

Tirar uma captura de tela de página inteira de uma página maior que o tamanho da tela.

Exemplo: Aqui está o exemplo de captura de uma captura de tela de página inteira de https://demo.on2vhf.be/test/on2vhfhome/ e salve no arquivo 'screenshot.jpg.'

Devido ao uso da classe ShootingStrategy da API Ashot, seremos capazes de capturar uma imagem completa de uma página maior que o tamanho da tela. Aqui está o programa:

 package Guru99; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.Screenshot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; public class TestScreenshotUsingAshot { public static void main(String[] args) throws IOException { System.setProperty('webdriver.chrome.driver', 'c:\chromedriver.exe'); WebDriver driver = new ChromeDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); driver.manage().window().maximize(); Screenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(1000)).takeScreenshot(driver); ImageIO.write(screenshot.getImage(), 'jpg', new File('c:\ElementScreenshot.jpg')); } } 

Tirar uma captura de tela de um elemento específico da página

Exemplo: Aqui está o exemplo de captura de tela do elemento do logotipo do Guru 99 em https://demo.on2vhf.be/test/on2vhfhome/ página e salve no arquivo 'ElementScreenshot.jpg'. Aqui está o código:

 package Guru99; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.Screenshot; import ru.yandex.qatools.ashot.shooting.ShootingStrategies; public class TestElementScreenshotUsingAshot { public static void main(String[] args) throws IOException { System.setProperty('webdriver.chrome.driver', 'c:\chromedriver.exe'); WebDriver driver = new ChromeDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); driver.manage().window().maximize(); // Find the element to take a screenshot WebElement element = driver.findElement(By.xpath ('//*[@id='site-name']/a[1]/img')); // Along with driver pass element also in takeScreenshot() method. Screenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(1000)).takeScreenshot(driver,element); ImageIO.write(screenshot.getImage(), 'jpg', new File('c:\ElementScreenshot.jpg')); } } 

Comparação de imagens usando AShot

 package Guru99; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.Screenshot; import ru.yandex.qatools.ashot.comparison.ImageDiff; import ru.yandex.qatools.ashot.comparison.ImageDiffer; public class TestImageComaprison { public static void main(String[] args) throws IOException { System.setProperty('webdriver.chrome.driver', 'C:\chromedriver.exe'); WebDriver driver = new ChromeDriver(); driver.get('https://demo.on2vhf.be/test/on2vhfhome/'); // Find the element and take a screenshot WebElement logoElement = driver.findElement(By.xpath('//*[@id='site-name']/a[1]/img')); Screenshot logoElementScreenshot = new AShot().takeScreenshot(driver, logoElemnent); // read the image to compare BufferedImage expectedImage = ImageIO.read(new File('C:\Guru99logo.png')); BufferedImage actualImage = logoElementScreenshot.getImage(); // Create ImageDiffer object and call method makeDiff() ImageDiffer imgDiff = new ImageDiffer(); ImageDiff diff = imgDiff.makeDiff(actualImage, expectedImage); if (diff.hasDiff() == true) { System.out.println('Images are same'); } else { System.out.println('Images are different'); } driver.quit(); } } 

Resumo

  • Ashot API é um freeware da Yandex.
  • É um utilitário para fazer uma captura de tela no Selenium.
  • Ele ajuda você a fazer uma captura de tela de um WebElement individual em diferentes plataformas, como navegadores de desktop, iOS Simulator Mobile Safari, Android Emulator Browser.
  • Ele pode fazer uma captura de tela de uma página maior que o tamanho da tela.
  • Este recurso foi removido na versão 3 do selênio, então Ashot API é uma boa opção.
  • Ele pode decorar as imagens.
  • Ele fornece uma comparação de captura de tela.

Tornado possível devido às contribuições de Shradhdha Dave