Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Webdriver. AShot. Не удаётся исключить область при сравнении скриншотов.

ashot
java
webdriver
selenide
Теги: #<Tag:0x00007f7b683a6e80> #<Tag:0x00007f7b683a6cc8> #<Tag:0x00007f7b683a6b60> #<Tag:0x00007f7b683a6a20>

(Yaroslav Golishevskiy) #1

Проблема: не могу исключить область при сравнении скриншотов при помощи библиотеки AShot
Вопрос: что не так с кодом? Или проблема в самой библиотеке?
Перепробовал я все методы, которые там есть: ignoredAreas(), ignoredElements(), addIgnoredElement(), addIgnoredArea(). Не работает(

Вот один из примеров:
Код

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
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;
import ru.yandex.qatools.ashot.coordinates.Coords;
import ru.yandex.qatools.ashot.shooting.ShootingStrategies;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import static com.codeborne.selenide.Condition.visible;
import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.WebDriverRunner.getWebDriver;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

public class YandexTest  {


    @Test
    public void runTest() throws IOException {
        String url ="https://google.com";
        String xpath = "//input[@type='text']";
        open(url);
        $x(xpath).waitUntil(visible, 5000).sendKeys("123yuiouioyioyioioio12312i3yio12y3io12io3");
        Set<By> bySet = new HashSet<>();
        bySet.add(By.xpath(xpath));
        Set<Coords> coords = getCoords(bySet);
        System.out.println(Arrays.toString(coords.toArray()));

        Screenshot screenshot1 = new AShot()
                .shootingStrategy(ShootingStrategies.viewportPasting(500))
                .ignoredAreas(coords)
                .takeScreenshot(getWebDriver());

        Set<Coords> ignoredCoords = screenshot1.getIgnoredAreas();
        BufferedImage bufImage1 = screenshot1.getImage();

        refresh();
        $x(xpath).waitUntil(visible, 5000).sendKeys("789a7df8a98z7zc987c9v7c89zx7897cx89vz7c8x9v");
        Screenshot screenshot2 = new AShot()
                .shootingStrategy(ShootingStrategies.viewportPasting(500))
                .takeScreenshot(getWebDriver());

        screenshot2.setIgnoredAreas(ignoredCoords);
        BufferedImage bufImage2 = screenshot2.getImage();

        ImageDiff diff = new ImageDiffer().makeDiff(bufImage1, bufImage2);
        BufferedImage diffImage = diff.getMarkedImage();

        createImageFromBuffer(diffImage, "src/main/results/diff.png");
    }

    protected String createImageFromBuffer (BufferedImage bufImage, String filePath) {
        File image = new File(filePath);
        try {
            ImageIO.write(bufImage, "png", image);
        } catch (IOException e) {
            e.printStackTrace();
            fail();
        }
        return "Image has been saved: \n"+image.getAbsolutePath();
    }
    public static Set<Coords> getCoords(Set<By> ignoredElements) {
        Set<Coords> ignoredCoords = new HashSet<>();
        for (By locator : ignoredElements) {
            Point point = $(locator).getLocation();
            Dimension dimension = $(locator).getSize();
            ignoredCoords.add(new Coords(point.getX(), point.getY(), dimension.getWidth(), dimension.getHeight()));
        }
        return ignoredCoords;
    }
}

В результате имеем вот такой diffImage:

Версии ОС и софта следующие.
Maven:
AShot - 1.5.2
Selenide - 4.9

Geckodriver - 0.19.1


(Pazone) #2

Снять скриншот:

Screenshot myScreenshot = new AShot()
  .coordsProvider(new WebDriverCoordsProvider())
  .addIgnoredElement(By.cssSelector("input[type=text]")) 
  .takeScreenshot(getWebDriver());

сравнить скриншоты:

ImageDiff diff = new ImageDiffer().makeDiff(myScreenshot, anotherScreenshot) // Нужно передавать объекты типа Screenshot, которые возвращает AShot
BufferedImage diffImage = diff.getMarkedImage(); // получаем дифф
ImageIO.write(diffImage, "png", new File("путь"));

По идее больше ничего не надо. AShot сам найдет элементы и будет игнорировать их при сравнении


(stek) #3

здесь нужно прописать путь к скриншоту?


(Yaroslav Golishevskiy) #4

Спасибо! Очень выручили. Главная ошибка - я сравнивал BufferImage’ы, а не Screenshot’ы


(Yaroslav Golishevskiy) #5

Если с файла:
new Screenshot(ImageIO.read(new File(“PATH_TO_FILE”)))


(stek) #6
public void test() throws IOException {

        SelenideElement myWebElement = $(".form_A");
        Screenshot myScreenshot = new AShot().coordsProvider(new WebDriverCoordsProvider())
            .takeScreenshot(driver, myWebElement);
        ImageDiff diff = new ImageDiffer()
            .makeDiff(myScreenshot, new Screenshot(ImageIO.read(new File("data/form_A.png"))));
        BufferedImage diffImage = diff.getMarkedImage();
}

Ошибка : java.lang.NullPointerException в строке “.takeScreenshot(driver, myWebElement);”