2026, Jan 07 06:02

ElementNotInteractableException в Selenium: причина и надежное решение на Google Finance

Почему возникает ElementNotInteractableException в Selenium на Google Finance и как исправить: явные ожидания, выбор интерактивного input, устойчивые селекторы.

При работе с публичными сайтами автотесты на Selenium нередко упираются в печально известную ошибку ElementNotInteractableException. Типичный случай — поле поиска Google Finance: элемент найден, вводите текст — и получаете исключение, хотя селектор выглядит корректным. Ниже — краткое объяснение, почему так происходит и как безопасно с этим справиться.

Проблема

Скрипт открывает Google Finance и пытается набрать запрос прямо в поле поиска, обращаясь к нему по имени класса, затем отправляет форму.

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
target_url = 'https://www.google.com/finance/'
browser.get(target_url)
search_box = browser.find_element(By.CLASS_NAME, 'Ax4B8.ZAGvjd')
search_box.send_keys('nvda stock')
search_box.send_keys(Keys.ENTER)
time.sleep(1)

В результате получаем:

ElementNotInteractableException: Message: element not interactable

Что происходит

На странице есть два поля input с одинаковым классом. Первое присутствует в DOM, но недоступно для взаимодействия. Если выбрать его и начать печатать, возникает ElementNotInteractableException. Видимое и рабочее поле — это второе совпадение.

Решение

Нужно явно обратиться ко второму совпадению. Быстрый способ — получить все подходящие элементы и взять второй по индексу.

query_field = browser.find_elements(By.CLASS_NAME, 'Ax4B8.ZAGvjd')[1]

Либо найти поля по CSS-атрибуту и подождать их появления, а затем выбрать интерактивный по индексу.

waiter = WebDriverWait(browser, 10)
query_field = waiter.until(
    EC.presence_of_all_elements_located(
        (By.CSS_SELECTOR, 'input[aria-label="Search for stocks, ETFs & more"]')
    )
)[1]

Ниже — минимальный исполняемый пример: он открывает Google Finance, дожидается появления полей, выбирает интерактивное и выполняет поиск.

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
client = webdriver.Chrome()
hold = WebDriverWait(client, 10)
client.get('https://www.google.com/finance/')
input_node = hold.until(
    EC.presence_of_all_elements_located(
        (By.CSS_SELECTOR, 'input[aria-label="Search for stocks, ETFs & more"]')
    )
)[1]
input_node.send_keys('nvda stock')
time.sleep(1)
input_node.send_keys(Keys.ENTER)
time.sleep(2)

Почему это важно

Современные фронтенды часто выводят дублирующиеся или «слоистые» элементы, которые имеют общие классы и структуру, но по-разному ведут себя при взаимодействии. Простого выбора первого совпадения в DOM недостаточно, если оно скрыто, не получает события или иначе неинтерактивно. Понимание этого паттерна экономит время при отладке ненадежных локаторов.

input_element = driver.find_elements(By.CLASS_NAME, 'Ax4B8.ZAGvjd')[1] может сработать сегодня. Но завтра — уже нет.

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

Выводы

Если ElementNotInteractableException возникает на, казалось бы, правильном поле, проверьте, нет ли дубликатов и не является ли первое совпадение неинтерактивным. Соберите все кандидаты и выберите интерактивный по индексу либо используйте селектор по атрибуту CSS вместе с ожиданием, возвращающим все совпадения, а затем выберите нужный элемент. Помните, что структура интерфейса меняется, поэтому отдавайте предпочтение селекторам, которые отражают намерение и явно учитывают наличие нескольких узлов.