Снимок экрана мобильной эмуляции Chrome с проблемой Ashot

У меня есть задача сделать скриншоты мобильной версии веб-страниц.

Для этого я взял Селениду и Ашота. В десктопном представлении все правильно. Но в мобильной эмуляции просмотра страницы есть некоторые проблемы. Показывает одну картинку, а снимает другую. Может кто знает другое решение или как решить эту проблему?

public class ChromeMobileEmulation implements WebDriverProvider {
    @Override
    public WebDriver createDriver(DesiredCapabilities desiredCapabilities) {

        Map<String, String> mobileEmulation = new HashMap<>();
        mobileEmulation.put("deviceName", "iPhone X");

        ChromeOptions chromeOptions = new ChromeOptions().setHeadless(true);
        chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation);
        chromeOptions.addArguments("--diagnostics", "--disable-blink-features");
        WebDriverManager.chromedriver().setup();

        return new ChromeDriver(chromeOptions);
    }

    @BeforeAll
    public static void setUp() throws IOException {
        propertyLoader();
        createFolders();

        SelenideLogger.addListener("allure", new AllureSelenide().screenshots(true).savePageSource(false));
        Configuration.browser = System.getProperty("browser");
        Configuration.timeout = 10000;

        RestAssured.filters(new AllureRestAssured());

        chromeMobile = new SelenideDriver(new SelenideConfig()
                .browser(ChromeMobileEmulation.class.getName())
                .headless(true)
                .browserSize("375x812"));
    }

    private Screenshot capturePage(int scrollTime) {
        return new AShot().shootingStrategy(viewportPasting(scrollTime)).takeScreenshot(getWebDriver());
    }

    protected void capturePageToVault(String pageName, String url, SelenideDriver driver, int scrollTime) throws IOException {
        driver.open(url);

        expected = capturePage(scrollTime, driver.getWebDriver());

        ImageIO.write(expected.getImage(), "png", expectedImg(pageName));

    }
}





WORKING SOLUTION FOR ME
private Screenshot capturePage(int scrollTime, WebDriver driver) {
        return new AShot()
                .coordsProvider(new WebDriverCoordsProvider())
                .shootingStrategy(viewportPasting(scaling(3), scrollTime))
                .takeScreenshot(driver);
    }

person Boris    schedule 19.11.2019    source источник


Ответы (1)


Если вы получаете скриншоты, это хороший знак — ваш код, по крайней мере, работает. Вы не предоставили достаточно информации (скриншот, координаты элемента и т. д.), но я полагаю, что у вас проблемы со стратегией масштабирования.

Когда возникает эта проблема и как она выглядит:

Когда вы делаете скриншоты на новом устройстве, может случиться так, что сделанные скриншоты «захватывают неправильные координаты». По моему опыту, это произошло, когда я выполнил тесты на дисплее Macbook Retina и сравнил со снимком экрана с дисплея без сетчатки или выполнил код на Macbook, но браузер был открыт на дисплее без сетчатки.

Я не эксперт в дисплеях (надеюсь, кто-то объяснит это лучше), но я считаю, что эта проблема возникает из-за одной из следующих причин: разное разрешение монитора (сколько пикселей у вас на том или ином мониторе) ИЛИ ppi соотношение (пикселей на дюйм).

Решение:

Я предлагаю вам получить координаты элемента и сравнить их с координатами сделанного скриншота. Если вы видите какой-то общий множитель, например, «мой скриншот в два раза больше элемента», вам следует установить стратегию масштабирования:

new AShot()
  .shootingStrategy(ShootingStrategies.scaling(2))
  .takeScreenshot(webDriver);

Вероятно, ваша проблема похожа на: Selenium: Not возможность сделать полный скриншот страницы с помощью библиотеки aShot

person Vitaliy Moskalyuk    schedule 19.11.2019
comment
Нет, между тем, что показывает браузер, и тем, что снимает Ашот, разное @ВиталийМоскалюк - person Boris; 03.12.2019
comment
По этой ссылке я смог решить эту проблему! Спасибо! ` private Screenshot capturePage (int scrollTime, драйвер WebDriver) { return new AShot() .coordsProvider (new WebDriverCoordsProvider()) .shootingStrategy (viewportPasting (масштабирование (3), scrollTime)) .takeScreenshot (драйвер); } ` - person Boris; 03.12.2019