📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

6. Playwright с нуля: Ожидания и Assertions

German Vargin17:02

Transcription

Всем привет. Добро пожаловать на шестой урок Playрай с нуля. И сегодня мы с вами поработаем с ожиданиями. Мы уже научились делать разные вещи на сайте, искать элементы, нажимать на них, что-то в них вводить. И сегодня мы поработаем с ожидаемым результатом. Что можно проверять, какие есть автоматические ожидания, а что лучше прописывать вручную.

Я сразу создам новый файл, сделаю там повторяющиеся вещи, которые вы уже должны знать. Если нет, возвращайтесь к предыдущим урокам. Начнём с Playri sy import page это наша стандартная конструкция, чтобы уже заработали вещи, которые мы прописали для открытия сайта и методы, которые нам предоставляет PlayRe.

Напишем новый тест defest waiting. Стандартная конструкция page двоеточия page ещё двоеточие. И теперь мы начнём с того, что снова введём некое значение в форму поиска. Сначала найдём её get by place holder. И, соответственно, здесь у нас было название искать натрес. Дальше нам здесь надо ввести значение. Давайте будем искать книгу, например, самоучитель по Python. И после этого нам надо нажать на кнопку, чтобы запустить поиск книг Самуучитель Python. Page get by Test ID, по-моему, вот так там эта кнопка находилась через локатор data test ID search button. И всё, что нам нужно сделать - это нажать на эту кнопку. Делаем клик. Всё должно отработать.

Давайте попробуем запустить этот тест, тоже известной нам командой pтеest и название нашего файла testwaiting.p. И поехали. Если всё будет хорошо, то у нас уже должен был бы тест отработать. Я вижу, что идёт задержка, и, скорее всего, Play что-то не может найти. Либо форму для ввода текста, либо кнопку, на которую мы хотим нажать. И это прямо хорошо попадает в тему видео. Обратите внимание, мы нигде ничего не прописывали, никаких ожиданий не делали, но плейрайт сам ждёт. И это говорит о том, что в плейрайте есть автоматические ожидания. То есть он не вводит текст до того, как понимает, что форма для ввода текста доступна. Вот в данном случае мы видим, что через 30 секунд у нас тест отвалился, и мы не нашли кнопку. И Play не нажимает на эту кнопку. до того, как убедиться, что кнопка реально существует. А, соответственно, он её не нашёл. Сейчас, видимо, я где-то допустил ошибку в названии вот этого локатора. Search button, скорее всего, это неправильно. Давайте вернёмся на сайт. Вот на эту кнопку я хотел нажать. Обновлю на всякий случай страницу и через inspect de Tools. Давайте я найду вот этот атрибут data теest ID, на который я хотел сослаться. Да, вот он. Search button. И да, здесь два вот этих вот нижних подчёркивания. А, а я вписал один. Давайте для верности скопирую и вот сюда вот вставлю новое значение. Да, видите, у меня две чёрточки внизу. Это теперь должно отработать. Но сам факт, мы убедились, что Playri не нажимал на эту кнопку. Он именно вернул ошибку о том, что через 30 секунд элемент не появился. И вот если я использовал новый локатор, то всё, у меня тест отрабатывает меньше, чем за 3 секунды.

Чтобы посмотреть, какие автоматические ожидания есть в плейрайте есть хорошая таблица, где расписаны разные методы, которые мы можем делать с элементами. Вот клик, э, конкретно я использовал и он завалился. И смотрите, здесь разные есть проверки автоматические, которые делают Playriф. Здесь меньше проверок, но тоже есть какие-то. И вот пока элементы не видимые, не стабильные или они там чем-то заблокированы, playрай не будет делать действия, которое вы прописываете, и он будет ждать по умолчанию 30 секунд.

Давайте используем более кастомизированное ожидание, сделаем expect и прописым пропишем какие-то специфические условия, которые мы хотим проверить. В данном случае я использую проверку page get by text и посмотрю, что когда я ввожу вот эту вот словосочетание самоучитель Python в форму искать на Litr, по-моему, я уже это делал в предыдущем уроке, мы находим вот эти вот вот этот текст, результаты поиска самоучитель Python. Поищу я, что вот этот текст, он присутствует на странице. Делается это через метод to be visible. Запускаем. Да, всё теперь должно отработать. Локаторы правильные. Повторяю команду Pesttestwaiting.p, что у меня тест снова отработал чуть меньше, чем за 3 секунды. Всё отлично сработало.

А теперь я предлагаю посмотреть, что ещё мы можем проверять. А потому что я часто вижу нехорошие тесты, когда делаются какие-то шаги и есть только одна проверка тоже. Что можно проверять? Можно проверить прекрасно в документации PlayR. Вот мы проверили элемент to be visible. Можно ещё что-то искать на этой странице, проверять какие-то элементы. М я предлагаю вам установиться на проверках вот to have URL и To have title. Это такие базовые проверки, которые можно сделать на всей странице. И давайте мы напишем здесь ещё одну проверку. После того, как мы нажали на кнопку, у нас изменится заголовок этой страницы. Делается это через expect page. Здесь уже не нужно нам никакой локатор определять, потому что мы делаем title, который зафиксирован. И делается это to have title. Здесь вводим просто ожидаемый title страницы. А где его взять? Опять же нам нужно вернуться в def tools, зайти в элемент head, и тут должен быть у нас title. Вот он. Результаты поиска по книгам. Самоучитель Python. А, соответственно, после наших шагов у нас должен быть вот такой тайтл. Всё, мы вот это вводим. И больше нам ничего писать не нужно, да? Playрай сам проверит, что у нас такой у странице. Перезапускаем этот тест. Снова у меня он проходит достаточно быстро. И, естественно, сейчас всё паст.

А давайте я вам добавлю какой-нибудь пример того, когда у нас ожидаемый результат не совпадает с текущим. Сделаем это намеренно. Напишу expect и, например, get by text. Напишу какой-нибудь фейковый те текст, который попытаюсь найти. Сделаю это как демостor. А давайте сюда пишу visible. Соответственно, попытаемся вот этот текст найти на странице. Да, его не будет. И здесь у нас, я надеюсь, что наш тест сразу упадёт. Запускаем наш тест. Вот прогон длится чуть-чуть дольше, чем предыдущие. И мы видим, да, что падает. У нас есть запись в логе, что через 5 секунд мы отвалимся по тайм-ауту, потому что не дождались вот этот вот текст error. И, во-первых, тайм отличается. Видите, да? Когда экспект мы делаем, у нас уже по умолчанию мы ждём 5 секунд, а не 30, что, в общем-то, приятно. Если нужно, это тоже можно перенастроить. Чуть позже покажу, как это сделать. А что сейчас ещё можно показать? Если вдруг вы хотите как-то отдельно зафиксировать эту ошибку в логах, давайте мы сюда через запятую напишем сообщение, которое мы хотим увидеть. show log message for test error demo. Вот такое сообщение я могу добавлять в логин, если меня как-то особенно интересует эта ошибка, если хочу это как-то зафиксировать или потом в отчёте подсветить, перезапускаю свой тест. Сейчас он, естественно, снова упадёт, потому что я ничего не исправлял. И вот видите, то, что я записал, show log message for test error demo, оно здесь уже переопределяется и показывается. Соответственно, здесь мы это никак не исправим, да, у нас некорректный ожидаемый результат. Всё, что мы можем сделать - это либо удалить, либо давайте в данном случае я это дело закомментирую. Но сам факт, вы видели, что мы здесь нигде не писали плейрайту, сколько и что нам ждать. Если нужный элемент появляется, мы идём дальше. Если он не появляется, то в зависимости от того, какой у нас сейчас автожидание или вот это вот явный экспект, мы ждём.

Что мы можем ещё вам, мы с вами можем сделать, это перенастроить вот эти вот интервалы ожиданий. Давайте мы сделаем некий локатор. Вот сделаем его через такую конструкцию: локатор, текст. И вот этот вот текст пропишем. И скажем, что жди а 7 секунд до тех пор, пока этот локатор не появится, этот элемент. И делается это вот через параметр timeout и метод wait for. Запускаем тест. И и и, судя по всему, он у нас сейчас упадёт. Да, упадёт. И обратите внимание, у нас упал тест не через 5 секунд, как раньше, а через семь, да? Потому что я здесь прописал чётко: "Жди секунд". Теперь почему он упал? Потому что я не тот текст ввёл, да? Я ввёл текст ээ заголовка страницы, а на самой странице-то у нас вот этот текст отображается. Давайте вот это вот я исправлю. А результаты поиска: самоучитель Python, да, по сути мы дублируем проверку просто другим способом. И да, в этот раз у нас всё отработалось. Смотрите, у нас тест паст. Длится это не 7 секунд, не 10, а снова быстро, чуть больше 3 секунд. Потому что Playрай нашёл этот текст, понял, что он действительно существует, и уже идёт дальше. А поэтому, когда мы так пишем, нас не будет тест всегда ждать 7 секунд. Там это удобно.

А давайте я вам напишу пример плохого теста BТ example и покажу, как делают новички, которые вот первый раз, видимо, писали тесты, и у них страница как-то тормозит, сервер медленно отвечает, элементы не прогружаются. И часто можно в тестовых заданиях увидеть вот такую конструкцию, когда люди пишут конкретное ожидание, page for time out 10 секунд и потом добавляют какую-нибудь проверку. Сделаем это, например, через ас, что вот этот вот а текст он присутствует. Кстати, чем отличается аспекто? Арт моментально проверяет, что у нас условия э совпадает или нет. А если не совпадает, то сразу бросает ошибку. А Exect он всё-таки ждёт по умолчанию 5 секунд. Если надо, это дело можно, а, перенастроить, но, по крайней мере, делает некие попытки повторить проверку. А сет делается лишь один раз. И вот мы проверяем, что этот текст у нас в секции боди существует. До этого ждём 10 секунд. Запускаю я а этот тест. И сейчас у нас тест должен отработать, если я нигде не накосячил, выполнится успешно. Но из того, что у нас есть вот это вот явное ожидание 10 секунд вне зависимости никаких условий, у нас вот этот паст сработал, но длился 13 секунд, что плохо, потому что когда у нас будет сотня, тысяча тестов, у нас автоматизация будет выполняться очень долго. Так делать не рекомендую, поэтому давайте мы всё это закомментируем как э-э пример плохого теста, как не будем делать.

И, наверное, наверное, я вам покажу ещё какую-нибудь проверку, которую мы можем сделать. Ээ давайте проверим, что у нас много книг отображается после того, как мы вводим условия поиска самоучитель Python. Не будем уже не кликать никакие фильтры, а поищем, что у нас вот эти вот секции с книгами, их действительно возвращается много. А сейчас я найду, как обратиться к этой книжке. Вот тут есть разные секции. Можно искать картинку, можно искать вот эту вот секцию, строку. Ну давайте вот это вот проверим, что у нас секция с текстом отображается. Data test id adaptive cover image. Это немножко не то. Сейчас, сейчас, сейчас, сейчас. Вот оно. А, data тест ID art. Вот этот атрибут я буду использовать и напишу условия следующим образом. Я снова определю переменную, назову её book. и скажу, что она равняется page, а, get by test idt wrapper и напишу в условии, что у меня этих элементов должно быть несколько. Делается это следующим образом. Expect books аа to be. Нет. to have. И, по-моему, вот так это делается. Надо было сначала спекацию посмотреть, потом писать. Но, если не понятия, это делается через count. И дальше здесь мы указываем, сколько мы хотим видеть этих книг. Я, честно говоря, не знаю, сколько отображается по умолчанию. Давайте мы будем ждать 10 и опять поставим здесь тайм-аут 10 секунд, потому что книги могут загружаться какое-то время. Но опять же, у нас условия, как только сработает, да, нам не надо будет ждать все 10 секунд. Перезапускаю тест. А, скорее всего, в 10 я не попал, потому что книг отображается по умолчанию больше. Вот. Да, у нас уже выпала ошибка, что текущий результат 24. То есть после ввода в строку поиска у нас 24 книги отображается. Соответственно, чтобы это исправить, я просто заменю вот это вот значение 10, которое я только что из головой взял, на 24. Дальше я перезапускаю аа тест. Вроде больше у меня никаких ошибок здесь быть не должно. И теперь у меня всё отрабатывает снова меньше, чем за 3 секунды. А отображаются ровно 24 книги. Все проверки, которые я написал в тесте, выполняются. И, в принципе, всё хорошо. Поиск у нас более-менее работает.

Как домашнее задание, посмотрите, какие ещё типы проверок можно делать. Всё это расписано в меню Assertions, в на сайте PlayR. Здесь также есть пример того, как можно переопределить тайм-аут и сделать его не 5 секунд, а, например, 10 секунд. Надеюсь, урок был для вас полезным, и до встречи в следующих видео. Yeah.