Як зробити знімок екрана Selenium веб-драйвер

Скріншот в Selenium

A Скріншот в Selenium Веб-драйвер використовується для аналізу помилок. Selenium webdriver може автоматично робити знімки екрана під час виконання. Але якщо користувачам потрібно зробити знімок екрана самостійно, їм потрібно використовувати метод TakeScreenshot, який сповіщає WebDrive зробити знімок екрана та зберегти його в Selenium.

Скріншот в Selenium

Як зробити знімок екрана Selenium

Ось крок за кроком процес створення знімка екрана в selenium WebDriver

Крок 1) Перетворити об’єкт веб-драйвера на TakeScreenshot

TakesScreenshot scrShot =((TakesScreenshot)webdriver);

Крок 2) Викличте метод getScreenshotAs, щоб створити файл зображення

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

Крок 3) Скопіюйте файл у потрібне розташування

Приклад: у цьому прикладі ми зробимо знімок екрана https://demo.guru99.com/V4/ і збережіть його як 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.guru99.com/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);

    }

}

ПРИМІТКА: Selenium версія 3.9.0 і вище не надає Apache Commons IO JAR. Ви можете просто завантажити їх тут і викликайте їх у своєму проекті

Що таке Ashot API?

Ashot є сторонньою утилітою від Yandex підтримується Selenium Веб-драйвер для створення знімків екрана. Він робить знімок екрана окремого WebElement, а також знімок повної сторінки сторінки, що важливіше, ніж розмір екрана.

Як завантажити та налаштувати Ashot API?

Є два способи налаштування Ashot API

  1. Використання Maven
  2. Вручну без використання інструментів

Щоб налаштувати через Maven:

Налаштувати через Maven

  • Збережіть файл, і Maven додасть jar до вашого шляху збірки
  • І тепер ви готові!!!

Щоб налаштувати вручну без будь-якого інструменту залежностей

  1. Перейдіть до https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot
  2. Наразі натисніть останню версію. Це 1.5.4
  3. Натисніть на банку, завантажте та збережіть її на своїй машині

Налаштувати вручну без будь-якого інструменту залежностей

  1. Додайте файл jar у шлях збірки:
  2. In Eclipse, клацніть правою кнопкою миші на проекті -> перейдіть до властивостей -> Build Path -> Libraries -> Add External jar
  3. Виберіть файл jar
  4. Застосувати та закрити

Зробіть знімок екрана на всю сторінку за допомогою AShot API

Крок 1) Створіть об’єкт Ashot і викличте метод takeScreenshot(), якщо вам потрібен лише знімок екрана для сторінки розміру екрана.

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

Але якщо вам потрібен знімок екрана сторінки, більший за розмір екрана, викличте метод shootingStrategy(), перш ніж викликати метод takeScreenshot(), щоб налаштувати політику. Потім викличте метод takeScreenshot(), передаючи веб-драйвер, наприклад,

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

Тут 1000 — це час прокручування в мілісекундах, тому для створення знімка екрана програма прокручуватиме кожні 1000 мс.

Крок 2): Тепер візьміть зображення зі знімка екрана та запишіть його у файл. Ви можете вказати тип файлу як jpg, png тощо.

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

Створення повного знімка екрана сторінки, розмір якої перевищує розмір екрана.

приклад: Ось приклад створення знімка екрана на всю сторінку https://demo.guru99.com/test/guru99home/ і збережіть у файл «screenshot.jpg».

Завдяки використанню класу ShootingStrategy API Ashot ми зможемо захопити повне зображення сторінки, розмір якої перевищує розмір екрана.

Ось код скріншота в програмі selenium:

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.guru99.com/test/guru99home/");
driver.manage().window().maximize();
		
Screenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(1000)).takeScreenshot(driver);

ImageIO.write(screenshot.getImage(), "jpg", new File("c:\\ElementScreenshot.jpg"));
	
	}

}

Зробити скріншот певного елемента сторінки

приклад: Ось приклад створення скріншота елемента з логотипом Guru 99 https://demo.guru99.com/test/guru99home/ і збережіть у файлі «ElementScreenshot.jpg».

Ось код знімка екрана в селені:

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.guru99.com/test/guru99home/");
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"));
	}
}

Порівняння зображень за допомогою 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.guru99.com/test/guru99home/");

        // 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();
    }
}

Підсумки

  • Ashot API є безкоштовною програмою від Yandex.
  • Це утиліта для створення скріншотів Selenium.
  • Це допоможе вам зробити знімок екрана окремого WebElement на різних платформах, як-от браузери настільних ПК, iOS Simulator Mobile Safari, Android Браузер емулятора.
  • Він може зробити знімок екрана сторінки, розмір якої перевищує розмір екрана.
  • Цю функцію було видалено в Selenium версії 3, тому Ashot API є хорошим варіантом.
  • Нею можна прикрасити скріншоти.
  • Він забезпечує порівняння скріншотів.

Детальніше ЧИТАТИ