Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Клик по ссылке через (сквозь) элемент на странице

python
webdriver
Теги: #<Tag:0x00007f7b6d1645a0> #<Tag:0x00007f7b6d164438>

(Ddos1) #1

Здравствуйте. Прошу помощи в решении следующей задачи.
После обновления версии webdriver (раньше была 2.43.3 ) начали падать некоторые тесты. Как оказалось это возникает при следующей ситуации:
На странице имеется div элемент (header) (как на этом сайте где вверху написано АТ.INFO).
При вызове driver.find_elements_by_xpath("//a")[х].click() выпадает ошибка. Случается это по той причине, что при нажатии на ссылку webdriver скролит страницу до того момента пока не найдет нужную ссылку и эта ссылка оказывается в самом верху страницы, но ее не видно т.к. она находится под header’ом.
пример кода страницы
пока что я выполняю эти клики с помощью JavaScript, но это не очень удобно…


(Sergey Pirogov) #2

Я думаю, что там нужно что-то придумтаь со скролом, чтобы линк не попадал под хидер


(Stan) #3

Уже было, и где-то баранцев писал, что по-видимому пофиксили баг, при котором вебдрайвер все таки мог кликнуть на невидимую ссылку в некоторых ситуациях.

Попробуйте https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView с alignToTop == false


(Ddos1) #4

попробовал так:
driver.execute_script("document.selectByTagName('a')[x].scrollIntoView(false)")
после этого кликает по ссылке нормально.
Но тут два “но”!
1- не очень удобно запускать execute_script
2- при наличии подобного хидеру футера вообще не работает.
Как по мне то проще через execute_script делать клик.

Немного порылся в документации webdriver и по поиску нашел там scroll
попробовал следующее:
element = driver.find_elements_by_xpath("//a")[х] TouchActions(driver).scroll(100,0).perform()
но вылезло две ошибки:
Traceback (most recent call last): File "C:\Python33\lib\json\decoder.py", line 367, in raw_decode obj, end = self.scan_once(s, idx) StopIteration
а вторая:
ValueError: No JSON object could be decoded
Насколько я понял это еще не реализованные функции или я что-то не правильно сделал?


(Stan) #5

Если есть такой футер, то нужен, наоборот true :smiley:

Насчет скрол, https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/interactions/touch/TouchActions.html
Implements actions for touch enabled devices, reusing the available composite and builder design patterns from Actions.
Скролл можно сделать и жс-ом, но, имхо, подход не практичный, как можно быть на 100% уверенным что элемент окажется там после скрола?

http://selenium-python.readthedocs.org/faq.html#how-to-scroll-down-to-the-bottom-of-a-page

Хоть мне и кажется, что вы решаете немного не ту проблему (то у вас вверху хидер, то внизу футер внезапно оказывается), все таки попробуем решить вашу:

Можно скролить до середины, высчитывая размер страницы, нашел вот такую имплементацию

http://jsfiddle.net/rbgawtnx/

PS не понял ваши слова про “js использовать неудобно”, если вы не используете page object, то хотя бы в функции выносить можете?


(Ddos1) #6

я имел ввиду, что и хидер есть и футер тоже. Просто изначально мешал только хидер я о нем и написал))

По поводу скролить с помощью JS, то я об этом думал, но выбрал все-же сразу кликать с его помощью. Думал, что временно пока не найду способ это делать с помощью webdriver. Но я так понял что без JS никак.
Спасибо за помощь.


(Stan) #7

webdriver в некоторых случаях слишком умный, хочет делать то, что не предусматривается для юзеров :smile:
Попробуй вариант выше, я проверил, добавил в твой пример футер и все стало отлично работать.


(Ddos1) #8

Да, все работает.
Спасибо.