Клик производится не на том элементе

UPD Проблема осталась, прошу вашей помощи. Спасибо

Здравствуйте уважаемые господа. Очень надеюсь на вашу помощь.
Сразу оговорюсь - гуглил, искал по форуму и т.д. Но именно решения своей проблемы не нашел, вернее мне достаточно не решения, а просто понять причину.
Итак:
Есть страница на которой есть селект (он невидимый), есть js-формочка (jquery), через которую и происходит работа с селектом, т.е. тотже селект ,только визуально сделан красивым. И скажем, выбрав в нем значение, выбирается значение в невидимом селекте.
Вот такой кусок скрипта раньше (Оговорюсь, что обновили селениум на последнюю версию, и после этого начались глюки!!!) работал верно:

# Находим js-селектор и кликаем на нем, чтобы появился выпадающий список значений
driver.find_element_by_xpath('//*[@id="bla-bla-bla"]/a/span').click()
# Находим элемент из выпадающего списка и кликаем на нем
driver.find_element_by_xpath("//*[@id='id_rub']/div/ul/li[text()='Рубрика_1']").click()

Вот кусочек листинга js-селектора, для понимания его структуры:

<ul class="results">
<li id="o_1" class="active-result" style="">Рубрика_1</li>
<li id="o_2" class="active-result" style="">Рубрика_2</li>
<li id="o_3" class="active-result" style="">Рубрика_3</li>

Итак, суть проблемы. Раньше (До обновления селениума) выбор происходил замечательно, а сейчас (обновил до версии 3.38.1, обновлял через pip командой --update ) выбор стал происходить в рандомном порядке, даже не могу уловить закономерность.
Т.е. выбираешь Рубрика_1, может выбрать Рубрика_1, Рубрика_2 или Рубрика_3 и т.д.
Принтовал что находит по xpath - находит именно наш элемент, с его id, но кликает временами куда-то не туда.
Грешу конечно же на обновление селениума, но все же хочу понять, в чем фишка.
Надеюсь на вашу помощь, большое спасибо
P.S. Python 2.7 + Selenium Webdriver 3.38.1 (Firefox)

2 лайка

UPD
Проблема осталась, просто рандом сыграл злую шутку

Уважаемые господа! Только написал пост - и проблема решилась!
Все дело в том, что при обновлении через pip ипсользовал такую команду:

pip install selenium --update

Данная команда обновила до версии 3.38.1
Почитал в доках, что обновление надо проводить след. образом:

pip install -U selenium

И вуаля, обновилось до самой последней версии 3.38.3
И на ней все замечательно работает

1 лайк

Отдельно хотелось бы сказать спасибо за развёрнутый вопрос.
И описание проблемы, и какие шаги сделали для её решения, и пример кода теста и тестируемой страницы. Прямо жалко, что вы сами так быстро взяли и всё решили. :slight_smile:

1 лайк

Эх… придется все-таки поучаствовать.
Великий Китайский рандом сыграл злую шутку.
Итак - проблема осталась ,просто после 3-5 запусков выбирало нужную рубрику, но вот после 6го запуска - опять тот же баг(
Вопрос остается открытым.
Прошу помощи. Спасибо

Вот сейчас проследилась закономерность (но не всегда она срабатывает, бывает ,что и рандом, но чаще всего соблюдается). Вот например список:

<li id="main_rubric_id_chzn_o_179" class="active-result" style="">Шопинг</li>
<li id="main_rubric_id_chzn_o_180" class="active-result" style="">Шоу-программа</li>
<li id="main_rubric_id_chzn_o_181" class="active-result" style="">Шоу-программы, Ведущие</li>
<li id="main_rubric_id_chzn_o_182" class="active-result" style="">Эксклюзивные услуги</li>
<li id="main_rubric_id_chzn_o_183" class="active-result" style="">Ювелирные салоны</li>
<li id="main_rubric_id_chzn_o_184" class="active-result" style="">Яхтинг</li>

При выборе Шопинг, может выбраться он, а может тот элемент, который на 4ре позиции позже, т.е. Ювелирные салоны.
При выборе элементов, которые не имеют более поздних позиций до 4х, т.е. Эксклюзивные услуги, Ювелирные салоны либо Яхтинг, выбираются именно они!
Грешу на визуальную составляющую, т.е. список виден не весь при его открытии и такое предчувствие, что как-то идет перекрытие элементов.
Господа, есть идеи?

Почему вы не хотите работать с id?
Попробуйте ещё переписать кусок теста на JavaScript и посмотреть результат его работы.

По поводу id.
данный параметр в некоторых случаях динамический. Т.е. например рубрике Рестораны может относится id - 2, а завтра 5.
Но пробовал работать и с id, т.е. находил наш элемент по xpath, брал его атрибут id и искал элемент через find_element_by_id (Костыльно, но просто ради эксперимента). Картина от этого не изменилась.
По поводу javascript’s были мысли, вообще думал заваять выбор элемента на Jquery, но я именно хочу разобраться - почему так происходит? ну не дает мне этот вопрос покоя

Кстати, еще дополнение. Сделав вот так:

# Находим js-селектор и кликаем на нем, чтобы появился выпадающий список значений
driver.find_element_by_xpath('//*[@id="bla-bla-bla"]/a/span').click()
# Находим элемент из выпадающего списка
a = driver.find_element_by_xpath("//*[@id='id_rub']/div/ul/li[text()='Рубрика_1']")
# Наводим курсор на элемент
hover = ActionChains(driver).move_to_element(a)
hover.perform()
# Ищем заново наш элемент (Именно эта строчка нужна, но хз зачем, но экспериментальным путем выяснил, что уменьшает шанс на баг) и кликаем по нему
a = driver.find_element_by_xpath("//*[@id='id_rub']/div/ul/li[text()='Рубрика_1']")
a.click()

И о чудо, баг воспроизводится не как раньше через раз, а примерно в 5-10 процентах прогонов данного теста

Живьём посмотреть на страницу, конечно нет возможности, да? :slight_smile:
Есть подозрение, что список из <ul>/<li> может не совпадать со списком <select> и в этой связи вы можете получать тот результат теста, который получаете. Т. е. в один момент списки совпадают, а в другой — нет. На эту мысль ещё натолкнуло то, что id у конкретных элементов у вас может меняться (вы сами так сказали).

Мысль интересная, но тогда как объяснить то, что на старой версии селениума все работало безотказно, уже на протяжении нескольких месяцев.
По поводу id прошу прощения, не правильно выразился. id у нас статика. Но тут привязка в том, что мы например на одной странице создем рубрику с именем Тест (например), и мы еще не знаем какой id у нее будет на той странице, где вылазит бага. Мы знаем только ее название, поэтому к нему и привязывались.
Насчет посмотреть страницу - жаль, но не смогу, т.к. это наша админка =(

Прежде чем кликать на элемент проверте что он видим и доступен. Может быть в списке появляется скрол и прежде чем кликнуть на элемент до него нужно доскролить.

Ключевые слова в топике “иногда”, “через раз” и т.д. - что в 99% случаев означает необходимость дополнительных ожиданий, а в особо отчаянных случаях - слипов.

[quote=“o_koleda, post:10, topic:3846”]
но тогда как объяснить то, что на старой версии селениума все работало безотказно, уже на протяжении нескольких месяцев.
[/quote]Ну, например, увеличилась производительность драйвера, и то что раньше проскакивало “на авось”, сейчас падает.

[quote=“o_koleda, post:8, topic:3846”]
И о чудо, баг воспроизводится не как раньше через раз, а примерно в 5-10 процентах прогонов данного теста
[/quote]Дополнительное телодвижение в виде move_to_element создает искусственную задержку между двумя кликами, что негативно сказывается на воспроизводимости :smile:

Поставьте же наконец слип после первого клика секунд на 1-2 и погоняйте пару сотен раз - это наиболее простой способ понять причины проблемы.

Это было самое первое, что попробовал. Не помогает слип даже в минуту, не говоря уже о секундах.

Извините, но я не поверю, что такая конструкция может быть “не стабильной”, разве что елозить мышкой во время выполнения.

слип(10 сек)
driver.find_element_by_xpath('//*[@id="bla-bla-bla"]/a/span').click()
слип(10 сек)
driver.find_element_by_xpath("//*[@id='id_rub']/div/ul/li[text()='Рубрика_1']").click()

В противном случае пишите логи[драйвера/селениума], видео, сохраняйте сорс страницы и т.д. и анализируйте, чем отличается “правильное” поведение от “не правильного”. Если есть “иногдашная” ситуация, всегда есть сопутствующий набор причин.

ЗЫ: встречался как то со “вредной” ддл, там селект опции частично был реализован через mouse over - т.е. экспанднули-навели на айтем-коллапснули => айтем выбрался. А простой клик селениума тригал почему то только mouse over, как итог при дальнейшем движении мыши к другому элементу GUI, фокус соскакивал на другую опцию. Решение - два клика по опции.