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

Школа тест-менеджеров v. 2.0
онлайн, начало 16 октября
Школа для начинающих тестировщиков
онлайн, начало 17 октября
Python для начинающих
онлайн, начало 16 октября
Организация автоматизированного тестирования
онлайн, начало 18 октября
Фотография

Невозможность взаимодействия с элементом DOM

selenium webdriver python pytest

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

#1 devepshko

devepshko

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

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Sergei

Отправлено 23 Май 2019 - 12:14

Доброго дня!

 

Так получилось, что я занимаюсь автоматизацией тестирования в нашей компании. Тесты прогоняются на 4 основных браузерах: Chrome, Firefox, Edge, Safari, в качестве инструмента. Я использую связку Selenium+Pytest.

 

И вот при подготовке одного из тестов я обнаружил, что он всегда падает в Safari, когда во всех остальных браузерах проходит успешно. Начал разбираться, оказалось, что причина - то, что не может быть совершен клик по кнопке, которая скрывает/раскрывает спойлер. Сначала подумал, что дело в загрузке, и добавил WebDriverWait. Ожидание отрабатывает, т.е. драйвер видит, что элемент появился, но действие с ней выполнить не может - выбрасывает эксцепшон:

selenium.common.exceptions.ElementNotInteractableException: Message:
C:\python\lib\site-packages\selenium\webdriver\remote\errorhandler.py:242: ElementNotInteractableException

Похожая ерунда была с другим тестом в Эдж: там есть список подкатегорий, нужно навести на любую, чтобы появилось дополнительное меню. При прогоне теста, первый элемент работает как надо, а последующие становятся неактивными. И это только в тестах, в реальности все работает.

 

И отсюда у меня возникает вопрос: с чем связано такое поведение? Есть ли воркараунд, если кто сталкивался?


  • 0

#2 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 626 сообщений


Отправлено 23 Май 2019 - 14:08

Ктож его знает, этож сафари...

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

Обходные пути - временно исключить этот тест на Сафари, до выхода новой версии драйвера/браузера.

Вы же это дело запускаете на свежей версии Сафари?

Руками в Сафари кликается норм на этом элементе?

Можете попробовать вместо обычного клика на элементе, кликнуть по нему JacvaScript-ом.


  • 1

#3 devepshko

devepshko

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

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Sergei

Отправлено 24 Май 2019 - 14:38

Ктож его знает, этож сафари...

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

Обходные пути - временно исключить этот тест на Сафари, до выхода новой версии драйвера/браузера.

Вы же это дело запускаете на свежей версии Сафари?

Руками в Сафари кликается норм на этом элементе?

Можете попробовать вместо обычного клика на элементе, кликнуть по нему JacvaScript-ом.

вот ведь упыри - действительно, JS работает.

Сафари последней доступной версии - 12.1


  • 0

#4 Darksol89

Darksol89

    Активный участник

  • Members
  • PipPip
  • 81 сообщений
  • ФИО:Иван
  • Город:Санкт-Петербург


Отправлено 27 Май 2019 - 09:59

 

Ктож его знает, этож сафари...

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

Обходные пути - временно исключить этот тест на Сафари, до выхода новой версии драйвера/браузера.

Вы же это дело запускаете на свежей версии Сафари?

Руками в Сафари кликается норм на этом элементе?

Можете попробовать вместо обычного клика на элементе, кликнуть по нему JacvaScript-ом.

вот ведь упыри - действительно, JS работает.

Сафари последней доступной версии - 12.1

 

А как JS для клика использовать??
У меня клик по элементу тоже не происходит, использую  клик такой: 
click(driver, design_dialog_locator(param[0][0], param[0][1]))

Сам метод выглядит так:

def click(driver, locator, sleep_time=5, expl_wait=20):
"""
Wait until element will be shown and clickable, then send 'click' to it.
TimeoutException will be generated if something's wrong (NOT NoSuchElementException).

:type driver: WebDriver
:type locator: tuple
:param sleep_time: delay before click
:param expl_wait: explicit waiting time for presence of element will found
:type sleep_time: float
:type expl_wait: float
"""

time.sleep(sleep_time)
WebDriverWait(driver, expl_wait, ignored_exceptions=StaleElementReferenceException).until(
ec.presence_of_element_located(locator))
#WebDriverWait.until(ec.invisibility_of_element_located(locator))
# additional check were deleted, cause of some unexpected timeout exceptions on it
#WebDriverWait(driver, 30).until(ec.element_to_be_clickable(locator))
wait_for_loading(driver)
driver.find_element(*locator).click()
#driver.execute_script(*locator)
wait_for_loading(driver)


  • 0

#5 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 626 сообщений


Отправлено 27 Май 2019 - 14:06

У нас что-то типа такого:

driver.executeJavaScript("arguments[0].click()", element);

У вас есть driver.execute_script(""), надо переделать как-то моё на ваше.


  • 0

#6 Darksol89

Darksol89

    Активный участник

  • Members
  • PipPip
  • 81 сообщений
  • ФИО:Иван
  • Город:Санкт-Петербург


Отправлено 27 Май 2019 - 15:20

У нас что-то типа такого:

driver.executeJavaScript("arguments[0].click()", element);

У вас есть driver.execute_script(""), надо переделать как-то моё на ваше.

"arguments[0].click()" а это обязательная запись? просто не пойму что за аргумент 0. element - это я так понимаю тот элемент куда надо кликнуть?


  • 0

#7 devepshko

devepshko

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

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Sergei

Отправлено 27 Май 2019 - 15:29

 

У нас что-то типа такого:

driver.executeJavaScript("arguments[0].click()", element);

У вас есть driver.execute_script(""), надо переделать как-то моё на ваше.

"arguments[0].click()" а это обязательная запись? просто не пойму что за аргумент 0. element - это я так понимаю тот элемент куда надо кликнуть?

 

 

JS вообще сложно понять (=

да, element - это ваш "driver.find_element(*locator)"


  • 0

#8 Darksol89

Darksol89

    Активный участник

  • Members
  • PipPip
  • 81 сообщений
  • ФИО:Иван
  • Город:Санкт-Петербург


Отправлено 27 Май 2019 - 16:19

 

 

У нас что-то типа такого:

driver.executeJavaScript("arguments[0].click()", element);

У вас есть driver.execute_script(""), надо переделать как-то моё на ваше.

"arguments[0].click()" а это обязательная запись? просто не пойму что за аргумент 0. element - это я так понимаю тот элемент куда надо кликнуть?

 

 

JS вообще сложно понять (=

да, element - это ваш "driver.find_element(*locator)"

 

а надо импорт какой то делать?


  • 0

#9 devepshko

devepshko

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

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Sergei

Отправлено 27 Май 2019 - 17:50

 

 

 

У нас что-то типа такого:

driver.executeJavaScript("arguments[0].click()", element);

У вас есть driver.execute_script(""), надо переделать как-то моё на ваше.

"arguments[0].click()" а это обязательная запись? просто не пойму что за аргумент 0. element - это я так понимаю тот элемент куда надо кликнуть?

 

 

JS вообще сложно понять (=

да, element - это ваш "driver.find_element(*locator)"

 

а надо импорт какой то делать?

 

какой-то особенный - нет. Достаточно того, что у вас есть для выполнения действий средствами самого вебдрайвера.


  • 0

#10 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 05 Июнь 2019 - 13:45

Ожидание отрабатывает, т.е. драйвер видит, что элемент появился

 

until(

ec.presence_of_element_located(locator))

 

Одно из самых бесполезных и бессмысленных ожиданий, на мой взгляд. 

Нужный элемент может присутствовать в DOM даже, если Вы его не видите.

Также, как и наоборот - может быть не кликабельным, даже если Вы его видите и Вам кажется, что все ок.

Если нужно кликнуть - лучше ждать кликабельности (element_to_be_clickable).


  • 0

#11 devepshko

devepshko

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

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Sergei

Отправлено 05 Июнь 2019 - 14:12

 

Ожидание отрабатывает, т.е. драйвер видит, что элемент появился

 

until(

ec.presence_of_element_located(locator))

 

Одно из самых бесполезных и бессмысленных ожиданий, на мой взгляд. 

Нужный элемент может присутствовать в DOM даже, если Вы его не видите.

Также, как и наоборот - может быть не кликабельным, даже если Вы его видите и Вам кажется, что все ок.

Если нужно кликнуть - лучше ждать кликабельности (element_to_be_clickable).

 

с ожиданиями вообще не всегда все так гладко, как хотелось бы (= Иногда и кликабельности недостаточно, если какие-то скрипты еще DOM обновляют... вот элемент вроде бы появился и кликабельный, а потом DOM обновился и получаешь Exception.... но это уже наверное к вопросу о степени прямости рук девелоперов (=


  • 0


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн




Темы с аналогичным тегами selenium, webdriver, python, pytest

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

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

Яндекс.Метрика
Реклама на портале