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

Фотография

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

selenium webdriver python pytest

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

#1 devepshko

devepshko

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

  • Members
  • Pip
  • 21 сообщений
  • ФИО: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
  • 833 сообщений


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

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

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

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

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

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

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


  • 1

#3 devepshko

devepshko

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

  • Members
  • Pip
  • 21 сообщений
  • ФИО: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
  • 833 сообщений


Отправлено 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
  • 21 сообщений
  • ФИО: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
  • 21 сообщений
  • ФИО: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
  • 21 сообщений
  • ФИО:Sergei

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

 

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

 

until(

ec.presence_of_element_located(locator))

 

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

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

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

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

 

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


  • 0



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

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

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