Как заполнить форму python, selenium?

Есть сайт: ссылка удалена модератором. на нем есть форма для ввода имени и почты. Все бы ничего, но эта форма что-ли динамическая, потому что, когда я пытаюсь искать элемент для ввода имени/почты:
driver.find_element(By.XPATH, '//*[@id="firstname"]')


выдает ошибку, которая говорит о том, что элемент не найден:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="firstname"]"}
  (Session info: chrome=110.0.5481.180)
Stacktrace:
Backtrace:
	(No symbol) [0x00E737D3]
	(No symbol) [0x00E08B81]
	(No symbol) [0x00D0B36D]
	(No symbol) [0x00D3D382]
	(No symbol) [0x00D3D4BB]
	(No symbol) [0x00D73302]
	(No symbol) [0x00D5B464]
	(No symbol) [0x00D71215]
	(No symbol) [0x00D5B216]
	(No symbol) [0x00D30D97]
	(No symbol) [0x00D3253D]
	GetHandleVerifier [0x010EABF2+2510930]
	GetHandleVerifier [0x01118EC1+2700065]
	GetHandleVerifier [0x0111C86C+2714828]
	GetHandleVerifier [0x00F23480+645344]
	(No symbol) [0x00E10FD2]
	(No symbol) [0x00E16C68]
	(No symbol) [0x00E16D4B]
	(No symbol) [0x00E20D6B]
	BaseThreadInitThunk [0x76027D69+25]
	RtlInitializeExceptionChain [0x77AEBB9B+107]
	RtlClearBits [0x77AEBB1F+191]


Process finished with exit code 1


Пробовал решить проблему через time.sleep(), но сколько бы я не выставлял времени для сна, не помогало.

код:
import time
from selenium import webdriver
from fake_useragent import UserAgent
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


ua = UserAgent()
url = "https://www.nealthy.com/alpha"

options = webdriver.ChromeOptions()
options.add_argument(f'user-agent={ua.chrome}')

web_driver = Service('C:\\webdriver\\chromedriver.exe')  #ПУТЬ К ВЕБ ДРАЙВЕРУ
driver = webdriver.Chrome(service=web_driver, options=options)

driver.get(url=url)
time.sleep(10)
driver.find_element(By.XPATH, '//*[@id="firstname"]').send_keys('Mikhail')
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
Добрый день. У вас возникли проблемы потому что на сайте используется Shadow DOM.
Скриншот фрагмента кода удалён модератором.

Как работать с Shadow DOM в различных версиях Selenium можете прочитать например в этой статье на хабре.
Если используйте актуальные версии, то ваш код может быть модифицирован таким образом
from selenium import webdriver
from fake_useragent import UserAgent
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


ua = UserAgent()
url = "https://www.nealthy.com/alpha"

options = webdriver.ChromeOptions()
options.add_argument(f'user-agent={ua.chrome}')

web_driver = Service('C:\\webdriver\\chromedriver.exe')  #ПУТЬ К ВЕБ ДРАЙВЕРУ
driver = webdriver.Chrome(service=web_driver, options=options)

driver.get(url=url)

# Выше приведен ваш код, изменения начинаются здесь
shadow_host = driver.find_element(By.XPATH, '//form-widget')
shadow_root = shadow_host.shadow_root
shadow_content = shadow_root.find_element(By.CSS_SELECTOR, '#firstname')
shadow_content.send_keys('Mikhail')

Еще обратите внимание, что в Shadow DOM лучше искать локатор по CSS селектору, иначе можно наткнуться на баги Selenium.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы