t.me/atinfo_chat Telegram группа по автоматизации тестирования

[Resolved] И снова про Ashot и Allure

Теги: #<Tag:0x00007f9afb34deb8>

Добрый день коллеги. В одной из недавних тем, был выработан метод для снятия и прикрепления скриншотов с помощью Ashot в Allure. Вот и сам виновник

@Attachment(value = "PNG Attachment {0}", type = "image/png")
public byte[] createAttachment() throws IOException {
    return captureScreenShot();
}

private byte[] captureScreenShot() throws IOException {
    WebDriver augmentedDriver = new Augmenter().augment(driver);
    BufferedImage image = new AShot().shootingStrategy(new ViewportPastingStrategy(0)).takeScreenshot(augmentedDriver).getImage();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(image, "png", baos);
    baos.flush();
    byte[] imageInByte = baos.toByteArray();
    baos.close();
    return imageInByte;
}

Однако возникло две проблемы которые я пока никак не могу решить. Данные методы находятся у меня в родительском классе для Pages. Но вызывая в наследниках метод captureScreenShot() я всегда получаю в Allure скриншоты с одинаковым именем PNG Attachment {0}. Причем счетчик не срабатывает. Всегда 0. Если какой то способ изменить имена - оставив определение метода в родительском классе. Или для этого каждый раз когда требуется создать скриншот необходимо будет писать новый метод - и выносить в аннотацию его имя.
Второй вопрос связан с Ashot - возможно ли как сделать так, что бы он снимал скриншоты одинаково во всех браузерах. На данный момент - в Firefox он снимает нормально, а вот в Chrome снимает видимую область экрана а затем несколько раз копирует ее и растягивает таким образом скриншот до полной длины экрана.

  1. {0} - это обращение к первому параметру метода. Если бы он у вас
    был - то вывелось бы его значение.toString(). То есть вашем случае
    {0} не подменяется, так как ваш метод без параметров. Разумеется, по
    аналогии можно обращаться ко всем параметрам по индексу(индекс
    начинается, как видим, с 0). При этом разумеется все будет отлично
    работать и для примитивов. Попробуйте добавить параметр и что
    нибудь в него передать - и увидите результат. По аналогии работает и
    аннотация @Step
  2. снятие только видимой области в хроме - это баг
    chromedriver. Известный. Ашот в свою очередь(по утверждению автора,
    как раз сегодня он мне об этом говорил) пытается обойти это через
    снятие куска, скроллинг, снятие другого куска и потом слепливания
    этих всех частей. Насколько он это корректно делает - я не знаю(и не
    очень понял - он верно это сделал у вас?).

Спасибо, про параметр все ясно…но вот неясно все таки архитектурно как сделать…просто передавать параметр Name и дергать его по индексу?..

И еще применение Ashot часто приводит вот к такому виду сообщений

WebDriverException: unknown error: $ is not defined не до конца ясно как с ним бороться.

Да, можно попробовать так. Я в некоторых тестах специально вводил параметр именно для лога.

По поводу ошибки - кажется это как то связано с jquery. Он у вас на странице подключен?
Ну или по крайней мере можно поглядеть, откуда ошибка идет и посмотреть исходники.

Да нет…подобная ошибка сопровождается подобный стектрейсом

org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:508)
	at ru.yandex.qatools.ashot.screentaker.ViewportPastingStrategy.getFullHeight(ViewportPastingStrategy.java:23)
	at ru.yandex.qatools.ashot.screentaker.VerticalPastingShootingStrategy.getScreenshot(VerticalPastingShootingStrategy.java:33)
	at ru.yandex.qatools.ashot.screentaker.ScreenTaker.take(ScreenTaker.java:23)
	at ru.yandex.qatools.ashot.AShot.takeScreenshot(AShot.java:161)
	at com.luxoft.classvac.wdtests.TestBase.captureScreenShot(TestBase.java:79)
	at com.luxoft.classvac.wdtests.TestBase.createAttachment(TestBase.java:73)

Ну ошибка понятно, что из executeScript. Значит она, что не понимается $ внутри. Этот символ используется в jquery. В исходниках ашота можно увидеть, какая команда вызывается(там берется высота у документа).
На вашей тестируемой странице в head блоке подключен jquery?

делайте етот метод в listener класах

Увы подключен.

Не хватит пока скилла, нормально реализовать листенер…и уж тем более не понятно как он будет отрабатывать в случае DDT тестов - как он их будет различать…как именовать…

А вот это уже странно.
Может быть не успевает загружаться jquery? или ошибка при загрузке какая?
По идее только из за этого может быть такая ошибка.

Может быть…у меня там по идее есть страница ожидания при переходе со страницы на страницу…но странно, что иногда снимает, а иногда падает вот с такой вот ошибкой

Может быть отказаться от Ашота (хотя библиотека и неплохая), но может ли вебдрайвер - выдавать byte[]

((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);

Ага. Спасибо. Но я тут смотрю класс

ViewportPastingStrategy

По идее, в других “стратегиях” это переменная фигурирует - может быть попробовать ее изменить - стратегию?

А вот не понятно, если честно.
По идее должно работать, если у Вас реально работает jquery.

Может быть действительно в некоторых случаях - оно не успевает подгрузиться? А есть способы в Ашоте - обойтись без jquery? Какой нибудь дедовский…что то мало информации по стратегиям Ашота.

Вообще я поговорю с разработчиком ашота, что лучше бы убрать jquery. Потому как не у одного у Вас могут возникнуть такие ошибки.
Можете сделать свою стратегию, отнаследовавшись от VerticalPastingShootingStrategy.
Вам нужно будет только переопределить методы забора длины и высоты экрана, вообщем сделать аналог ViewportPastingStrategy, только в executeScript не дергать jquery.

Если сделаете - можно будет и пул реквест направить может

я уже постил баг на странице ashot с етой проблемой, там есть решение, - поищите - проблема в jquery все таки

А можете дать ссылку на этот баг - а то, что то гугл мне по этомй ошибке выдает совсем другое