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

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

screenshot
Теги: #<Tag:0x00007f7b6549ee08>

(Александр Шиповалов) #1

Добрый день коллеги. В одной из недавних тем, был выработан метод для снятия и прикрепления скриншотов с помощью 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 снимает видимую область экрана а затем несколько раз копирует ее и растягивает таким образом скриншот до полной длины экрана.


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

(Александр Шиповалов) #3

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


(Александр Шиповалов) #4

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

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


(sidelnikovmike) #5

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

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


(Александр Шиповалов) #6

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

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)

(sidelnikovmike) #7

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


(Taras) #8

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


(Александр Шиповалов) #9

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


(Александр Шиповалов) #10

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


(sidelnikovmike) #11

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


(Александр Шиповалов) #12

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


(Александр Шиповалов) #13

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


(sidelnikovmike) #14
((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);

(Александр Шиповалов) #15

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

ViewportPastingStrategy

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


(sidelnikovmike) #16

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


(Александр Шиповалов) #17

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


(sidelnikovmike) #18

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

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


(Taras) #19

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


(Александр Шиповалов) #20

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