Перейти к содержимому

Фотография

Получение текста из нотификации (Selenium + Python)

selenium python

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 13

#1 Aredel

Aredel

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Смирнова Валерия Владимировна


Отправлено 30 октября 2018 - 10:59

При создании пользователя у нас есть ряд валидаций на вводимые данные - часть из них происходит на фронтенде, часть - осуществляется бэкендом. Фронтовая валидация отмечает поля красными и пишет под ними текст ошибки, а бэковая отправляет всплывающую нотификацию с текстом ошибки, которая исчезает через несколько секунд. Скриншот нотификации прикладываю.

Когда я пишу автотесты на вылавливание текста ошибок, код выглядит так (мы используем PageObject):

Локатор текста из нотификации (я пробовала и class_name, и другие варианты селекторов):

ITEM_ERROR = (By.CSS_SELECTOR, ".el-form-item__error")

Метод класса:

    def get_notification_text(self):
        element = self.driver.find_element(*BaseLocators.NOTIFICATION_TEXT).text
        return element

Поиск текста ошибки на странице и сравнение с тем, каким он должен быть:

error = users_page.get_notification_text()
    assert error == "Email is already in use"

Когда я дебажу этот кусочек кода (PyCharm IDE, встроенная питоновская консоль), порядок действий таков: открываю нужную страницу в экземпляре драйвера (chrome/gecko), заполняю ее данными для срабатывания нужной нотификации, в консоли заведомо вбиваю код:

err = driver.find_element_by_css_selector(".el-form-item__error").text

После чего быстренько нажимаю кнопку "создать пользователя" и отправляю код выше на исполнение в консоли чтобы он сработал в момент появления нотификации. Получаю вроде как успех: скриншот 2. После чего я уже непосредственно запускаю прогон тестов, и тут начинается магия. Ставлю breakpoint в IDE для отладки ассертов, и вижу вот что: assert error == "Email is already in use" прошла успешно, тест зеленый, а в следующем тесте с точно таким же кодом (только err заменен на msg), но другим текстом нотификации результат таков: скриншот 3.

На нем видно, что в msg ничего не сохранилось, текста ошибки нет.

Итоговая ошибка теста:

>       assert msg == "User was created successfully"
E       AssertionError: assert '' == 'User was created successfully'
E         + User was created successfully

test_users.py:91: AssertionError

И эта ошибка повторяется на всех последующих тестах, где мне надо получить текст нотификации.

Есть ли какие-то советы по тому, как это пофиксить?

Прикрепленные файлы

  • Прикрепленный файл  Notification.png   17,54К   0 Количество загрузок:
  • Прикрепленный файл  Err text.png   63,23К   0 Количество загрузок:
  • Прикрепленный файл  Magic.png   368,81К   0 Количество загрузок:

  • 0

#2 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 октября 2018 - 11:40

для дебага добавьте таймаут например 10с перед тем как ещё одно действие сделать. Или лучше даже - первый тест после проверки должен подождать пока окошко исчезнет, и потом сверху одну секунду для уверенности

 

может эти всплывающие окошки накладываются друг на друга, или скорее всего стекуются

 

а вообще второй тест если запустить один, сам по себе - запасится?


  • 0

#3 Aredel

Aredel

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Смирнова Валерия Владимировна


Отправлено 30 октября 2018 - 12:35

Таймауты прописаны в conftest.py, окошки друг на друга не накладываются, потому что после каждого теста у меня driver.refresh() прописан, то есть в один момент одного теста у меня всегда только одна нотификация.

Тесты отдельно друг от друга вот прямо сейчас запустила: все равно ошибка срабатывает.


  • 0

#4 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 октября 2018 - 13:02

нотификацию как и любой другой элемент надо ждать перед тем как проверять текст на ней

 

есть ли у вас это ожидание?


  • 0

#5 Aredel

Aredel

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Смирнова Валерия Владимировна


Отправлено 30 октября 2018 - 13:08

Во-первых, да, а во-вторых, почему все же один раз он находит текст элемента, а потом вдруг перестает? :) Вот чего я не могу понять.


  • 0

#6 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 октября 2018 - 13:12

 

 

почему все же один раз он находит текст элемента, а потом вдруг перестает? :) Вот чего я не могу понять.

всё не могу понять - как описываете "один раз находит а потом перестаёт" когда только запускаете один тест? в котором одна проверка?


  • 0

#7 Aredel

Aredel

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Смирнова Валерия Владимировна


Отправлено 30 октября 2018 - 13:28

У меня есть файл test_users.py, там списком идут тесты по разным кейсам, друг за другом. И результаты я вижу так, как показано на скриншоте, который я прикрепляю.

Соответственно, один тест проходит успешно, потому что текст ошибки найдет, assert правильный, а другой тест падает потому что не справился с нотификацией.

Прикрепленные файлы


  • 0

#8 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 октября 2018 - 13:30

ну а почему вам предложили запустить только один тест чтобы посмотреть на результат, а вы этого сделать не хотите?


  • 0

#9 Aredel

Aredel

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Смирнова Валерия Владимировна


Отправлено 30 октября 2018 - 13:33

ну а почему вам предложили запустить только один тест чтобы посмотреть на результат, а вы этого сделать не хотите?

Я же выше написала:

Тесты отдельно друг от друга вот прямо сейчас запустила: все равно ошибка срабатывает.

 

Я запустила один отдельно - он зеленый, второй отдельно - он красный.


  • 0

#10 aid

aid

    Опытный участник

  • Members
  • PipPipPipPip
  • 448 сообщений
  • ФИО:Николай


Отправлено 30 октября 2018 - 13:46

Ну, строка пустая, видно из ошибки. Может слишком быстро пытается взять текст или локатор не айс.


  • 0

#11 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 октября 2018 - 13:49

сделайте вывод ХТМЛ перед проверкой и покопайтесь в нём, есть ли там искомый элемент и есть ли там нужный текст


  • 0

#12 Aredel

Aredel

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Смирнова Валерия Владимировна


Отправлено 30 октября 2018 - 14:16

Ну, строка пустая, видно из ошибки. Может слишком быстро пытается взять текст или локатор не айс.

Локаторы мы пробовали разные, можно попробовать навешать дополнительных ожиданий, но все равно к сожалению пока ничего дельного не увидела.


  • 0

#13 aid

aid

    Опытный участник

  • Members
  • PipPipPipPip
  • 448 сообщений
  • ФИО:Николай


Отправлено 30 октября 2018 - 16:09

 

Ну, строка пустая, видно из ошибки. Может слишком быстро пытается взять текст или локатор не айс.

Локаторы мы пробовали разные, можно попробовать навешать дополнительных ожиданий, но все равно к сожалению пока ничего дельного не увидела.

 

 

Ну. А разные локаторы вы пробовали на ерроре? Вот стопудово, что ".el-form-item__error" не относится к действию User was created successfully.

Ну и позанудничать, бэк не отправляет "всплывающую нотификацию с текстом ошибки, которая исчезает через несколько секунд". Бэк отправляет ошибку, которую всё тот же фронт отображает. То есть, валидация на беке осуществляется, а когда фронт подсвечивает поля красным, он на фронте же и валидирует.


  • 0

#14 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 октября 2018 - 18:38

 

 

но все равно к сожалению пока ничего дельного не увидела.

а что показал вывод HTML?


  • 0



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных