Ошибка выполнения действия на странице

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://translate.yandex.ru')
print(driver.title)

Ошибки нет. Но если добавить

z = driver.find_element_by_id('textarea').send_keys('123')
print(z) 

возникает ошибка:

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
(Session info: headless chrome=87.0.4280.88)

Как сделать так, чтобы выполнять действия в невидимом браузере без ошибок?


Ответы (1 шт):

Автор решения: cauf

Вообще у вас здесь несколько недочетов в работе со страницей:

  1. К моменту выполнения скрипта искомый элемент еще может быть не готов к использованию. Такое возможно, если элементы на странице создаются с помощью js-скриптов. Самый простой способ это проверить - добавить небольшую задержку перед обращением к странице. Обычно достаточно пары секунд

    import time
    time.sleep(2)
    
  2. Я посмотрел на указанную вами страницу в инструментах разработчика браузера. Там хорошо видно, что работать следует с другим элементов, который имеет id = 'fakeArea'. Именно в этот элемент вводится текст.

    z = driver.find_element_by_id('fakeArea')
    
  3. Если вы сами поработаете со страницей с выведенными параллельно инструментами разработчика, то видно, что действия с элементом вы начинаете с клика по нему. При этом js-код реагирует на этот клик и происходит большое количество изменений других элементов. Советую в коде сделать так же - сперва кликнуть по нему, а затем вводить текст.

    z.click()
    z.send_keys('123')
    print(z)
    

В итоге получится вот такой код:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://translate.yandex.ru')
print(driver.title)

time.sleep(2)
z = driver.find_element_by_id('fakeArea')
z.click()
z.send_keys('123')

print(z) 
→ Ссылка