Python Selenium, поле ввода возвращает исключение ElementNotInteractableException, даже если элемент является интерактивным

#python #selenium #selenium-webdriver

Вопрос:

РЕШАЕМАЯ:

Похоже, что это единственное поле ввода будет недоступно для взаимодействия, если оно не было нажато в последние 0,1 секунды. Для решения этой проблемы использовался следующий код:

 ActionChains(self.driver).move_to_element(input).click().send_keys("200").perform()
 

Таким образом, фокус остается на элементе, и ввод работает. Интересно, что если вызывается input.send_keys(), это все равно не работает.

Проблема:

После нажатия кнопки на веб-сайте открывается всплывающее окно, содержащее несколько полей ввода, которые генерируются react. Большинство из них доступны. Однако один из них не является и возвращает ошибку ElementNotInteractableException. Я пробовал наиболее распространенные решения, но они не работают.

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

Пробные решения:

  • Увеличить неявное ожидание до 1 минуты,
  • Добавить явное ожидание до 1 минуты
  • Используйте разные методы поиска для элемента
  • Измените порядок проверки, чтобы увидеть, влияют ли на него другие элементы (все возможные заказы завершились неудачей)
  • Добавить цепочки действий Переместить и щелкнуть. Перемещение и щелчок работают (я вижу, что элемент выбран синим контуром, но ввод все еще ощущается)
  • Используйте Javascript для вставки строки в поля ввода.значение

Блок кода, в котором возникает ошибка:

     #this input element is next to it in the same parent element
    dropdownparent = elems[2].find_element_by_xpath(".//div[@role='combobox']")
    dropdowninput = dropdownparent.find_element_by_css_selector("input")
    f.inputtext(dropdowninput, "Coulance", True )
    #reobtain the parent items to avoid a stale element reference error
    modal = self.driver.find_element_by_class_name("component-window")
    body = modal.find_element_by_class_name("body")
    elems = body.find_elements_by_xpath("./div")
    required = elems[2].find_elements_by_class_name("required")
    inputparent = required[1].find_element_by_class_name("input")
    input = inputparent.find_element_by_css_selector("input")
    #error occurs on next line
    f.inputtext(input, "200")
 

Журнал ошибок:

https://pastebin.com/ihqCvjfj

его длинный, но очень стандартный элемент недоступен

Любые предложения будут оценены, я буду обновлять раздел «Проверенные решения» всякий раз, когда я что-то пробую

Ответ №1:

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

 element = inputparent.find_element_by_css_selector("input")
driver.execute_script("""arguments[0].value = arguments[1];""", element, "some input value") 
 

Комментарии:

1. Я только что попробовал это, и каким-то образом возможно добавление цепочек действий (self.driver).move_to_element(input).click(input).perform(), поэтому с элементом можно взаимодействовать! Однако попытка send_keys() по-прежнему возвращает исключение ElementNotInteractableException. Что касается изменения значения javascript, оно не выдает ошибку, но также, похоже, ничего не добавляет к полю.

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

3. С удовольствием, но он все еще находится в разработке 😉 Но ваш комментарий на самом деле привел меня к поиску решения, которое я отметил выше!

4. Действительно счастлив. Кроме того, примите ответ, если он полезен.