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

Фотография

Element is not clickable at point

python selenium error

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

#1 Darksol89

Darksol89

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

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


Отправлено 17 августа 2017 - 14:12

Всем доброго времени суток!

 

Столкнулся с проблемой, может кто подскажет как решить?

Используется Selenium 2.53.2 и FireFox 45.3.0 ESR

 

Имеется вот такой метод выбора резистора:

 

def resistor_changing(driver, field_name, value, ok_button_id="commitdlg113"):
"""
Function change resistors parameter on resistor's dialog

:type driver: WebDriver
:type field_name: str
"""
# Unlock user overwrite
click(driver,
(By.XPATH, '//form[@id="form113"]//div/span'))
# Field to change getting
field_to_change = driver.find_element(
By.XPATH, '//form[@id="form113"]//label[contains(text(), "{name}")]/../select'.format(name=field_name))
# selecting required value
selecting_by_visible_text(driver, field_to_change, str(value))
wait_for_loading(driver)
wait_for_staleness(driver, field_to_change)
# click OK button
click(driver, (By.ID, ok_button_id))
wait_for_loading(driver)

 

field_name - это название поля из эксель файла.

value - значение, которое подставляется из эксель файла

 

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

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

 

selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (1178.933349609375, 826.5999755859375). Other element would receive the click: <div style="z-index: 101;" class="ui-widget-overlay ui-front"></div>

 

 

Дело еще в том, что этот метод работает в другом диалоге, с точно такими же айдишниками и резистор выбирается успешно.

 

подскажите пожалуйста, что ему нужно то? может это баг селениума или фф?


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 17 августа 2017 - 15:10

Ну написно же

Other element would receive the click

Значит другой элемент(скорее всего "крутелка") перекрывает

Тебе надо дождаться пока пропадет "крутелка", а потом уже кликать

 

http://software-test...ay/#entry161533


  • 0

#3 Darksol89

Darksol89

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

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


Отправлено 17 августа 2017 - 20:57

Ну написно же

Other element would receive the click

Значит другой элемент(скорее всего "крутелка") перекрывает

Тебе надо дождаться пока пропадет "крутелка", а потом уже кликать

 

http://software-test...ay/#entry161533

нет там никакой крутилки или загрузки, диалог подгружается быстро. И  перед выполнением этого метода wait_for_loading есть и time.sleep пробовал, без толку.

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


  • 0

#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 18 августа 2017 - 06:13

time.sleep сколько ?

Поставь секунд 10

Если таже ошибка, то очень странно


  • 0

#5 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 18 августа 2017 - 07:37

 

Ну написно же

Other element would receive the click

Значит другой элемент(скорее всего "крутелка") перекрывает

Тебе надо дождаться пока пропадет "крутелка", а потом уже кликать

 

http://software-test...ay/#entry161533

нет там никакой крутилки или загрузки, диалог подгружается быстро. И  перед выполнением этого метода wait_for_loading есть и time.sleep пробовал, без толку.

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

 

Место то другое, а метод тот же. Посему не показатель.

 

Черным по белому написано "Other element would receive the click: <div style="z-index: 101;" class="ui-widget-overlay ui-front"></div>". Есть этот див и он перекрывает желаемый элемент (по которому хотим выполнить клик). Либо все-таки проблемы синхронизации, либо пытаемся кликнуть по элементу не в диалоге, а на самой странице, которая перекрыта этим оверлэем при открытом диалоге: в приложении открыть диалог, открыть консоль, проверить свой локатор, что находится только один элемент и он именно в диалоге.


  • 0

#6 Darksol89

Darksol89

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

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


Отправлено 18 августа 2017 - 08:40

time.sleep сколько ?

Поставь секунд 10

Если таже ошибка, то очень странно

попробовал, та же ошибка(((

 

То что пишет мне селениум, я понимаю)) Если руками открыть этот диалог, то элемент находится без проблем и он именно в активном окне, не где либо еще.


  • 0

#7 Darksol89

Darksol89

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

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


Отправлено 18 августа 2017 - 10:59

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

wait = WebDriverWait(driver, 10)
element = wait.until(ec.presence_of_element_located(By.XPATH, '//form[@id="form113"]//div/span')) - не подействовало.

 

после клика по кнопке "change" в предыдущем диалоге, откуда происходит переход на мой проблемный, попытался прописать вот это:

wait = WebDriverWait(driver, 10)
load = wait.until(ec.invisibility_of_element_located(By.XPATH, 'html/body/div[5]'))  - и тоже ноль изменений. Не уверен в правильности икспаса, но именно он относится к <div style="z-index: 101;" class="ui-widget-overlay ui-front"></div> тот что в ошибке.

 

Всю голову изломал, как починить это....


  • 0

#8 checo

checo

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

  • Members
  • PipPipPipPip
  • 400 сообщений
  • Город:Н.Новгород

Отправлено 18 августа 2017 - 11:30

Во-первых, какой на фиг div[5]??? Искать надо по явным признакам, например, по классу ui-widget-overlay.

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

Надо сначала подождать немного оверлей, и если он появился, тогда уже ждать невидимости.

На самом деле, это боль - работал с похожим приложением, и ожидание оверлея сильно замедляет тестирование. Возможно, более выгодный вариант - сделать повтор клика при возникновении именно такой ошибки - так же, как поведет себя пользователь.


  • 0

#9 Darksol89

Darksol89

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

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


Отправлено 18 августа 2017 - 12:06

А  этот оверлей физически то глазами видно? просто смотря за выполнением скрипта, я вижу как открывается нужный диалог и никаких посторонних загрузок, крутилок или окон нету. Просто тупо открыт диалог и после тест падает


  • 0

#10 Spock

Spock

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

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

Отправлено 18 августа 2017 - 16:43

 

 

просто смотря за выполнением скрипта, я вижу как открывается нужный диалог и никаких посторонних загрузок, крутилок или окон нету. Просто тупо открыт диалог и после тест падает

тут надо понимать как работает Селениум: 

1. сначала Селениум ищет элемент

2. затем определяет его координаты

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

 

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

 

как это видно:

1. в тест добавляете чтобы сделал скриншот на ошибке

2. открываете скриншот в графическом редакторе и находите точку в которую пытался ткнуть Селениум. Возможно увидите что точка клика Селениума не попадает по элементу

 

тогда скорее всего поможет "скрольнуть" страничку, даже не смотря на то что там скролла может и нет, что-то типа такого:

WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500); 

тогда Селениум "прочухивается" и начинает попадать по элементам


  • 0

#11 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 21 августа 2017 - 07:13

А  этот оверлей физически то глазами видно? просто смотря за выполнением скрипта, я вижу как открывается нужный диалог и никаких посторонних загрузок, крутилок или окон нету. Просто тупо открыт диалог и после тест падает

Оверлэй - это не крутилка и не индикатор загрузки. Если у вас диалог, то в момент открытия диалога основная страница становится заблокирована, как правило, серым фоном. Вот этот серый фон и есть оверлэй.

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

Также может быть ситуация - окно диалога открыто, но еще не догрузилось и тоже остается заблокировано собственным оверлэем


  • 0

#12 DmitriyQA

DmitriyQA

    Постоянный участник

  • Members
  • PipPipPip
  • 183 сообщений
  • ФИО:Коваленко Дмитрий Владимирович
  • Город:Tel Aviv

Отправлено 21 августа 2017 - 11:23

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

Много раз сталкивался с ним, обычно возникает если есть кнопка, а на ней иконка или еще элемент,

В таком случае использую ворк ароунд в виде клика с офсетом

 

def click_with_offset(self, elem, x_offset, y_offset):
with ActionChains(self) as action:
action.move_to_element_with_offset(elem, x_offset, y_offset)
action.click()
action.perform()


  • 0

Senior QA/ Wix.com / qaacademy.net




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

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

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