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

Рекомендации по ожиданиям для SinglePage проектов

pytest
single-page-app
python
selenium
webdriver
Теги: #<Tag:0x00007fb2f5b23180> #<Tag:0x00007fb2f5b23040> #<Tag:0x00007fb2f5b22f00> #<Tag:0x00007fb2f5b22dc0> #<Tag:0x00007fb2f5b22c80>

(Артём Кузьменко) #1

Всем здравствуйте!

Хотел бы получить несколько советов по написанию тестов для SinglePage проектов.
Имеется приложение в одну страницу, все действия происходят на этой странице, все что не делается на этой странице делается в окнах попапах, которые появляются поверх основной страницы.
После завершения действия в попапе есть 2 варианта событий:

  1. Попап закрывается и страница перезагружается полностью
  2. Попап закрывается и страница НЕ перезагружается полностью, обновляетсялишь какая-то ее часть.

Вопрос как избегать sleep’ов? Ожидания не помогают, я пробую ждать исчезновение попапа или ждать появления элемента в основном окне. Элемент находится, но он уже “протухший”. Что можете посоветовать в таком случае?


(Viktor) #2

Используйте waitUntil и добавьте StaleElementReferenceException в список игнорируемых exceptions. Ищите элемент заново, не храните его.


(Maxim Andryushchenkov) #3

Здесь помогут только явные ожидания, которые нужно зашить в методы Page Object:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

При этом методы в PO как для страницы не имеют смысла, нагляднее будет создавать классы типа PopupElement, LoginBlock и т.д., так они будут яснее описывать происходящее на экране. И да, как вам сказали выше - обрабатывайте StaleElementReferenceException, то есть переискивайте объекты, если они уже “несвежие”.


(Артём Кузьменко) #4

Спасибо.
У меня в попапе после нажатия кнопки появляется элемент лоадер и потом сразу обновляется страница. Я пробовал ждать его исчезновения. Selenium ждет, но почему-то ждет столько, сколько я прописал ему в implicity_wait, но не падает. Тест проходит.
Я сделал следующее. Запоминаю имя элемента до вызова попапа, и потом в try except в цикле жду пока имя элемента не станет отличаться от старого. А потом делаю assert на имя элемента. Примерно то же самое получается, что сказали Вы мне.