Почему Selenium не видит поле на странице?
Заголовок вопроса:
Хочу написать бота для скрининга музыки из вк но я не могу ввести текст в поле на странице т.к. Selenium не видит это поле "input"
Код страницы:
Мой код:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
driver = webdriver.Firefox()
driver.get("https://vk.com")
driver.find_element(By.CLASS_NAME, "VkIdCheckbox__name").click()
driver.find_element(By.CLASS_NAME, "eltt_close_button").click()
elem = driver.find_element(By.ID, "index_email")
elem.clear()
elem.send_keys("Test")
elem.send_keys(Keys.RETURN)
elem2 = driver.find_element(By.CLASS_NAME, "vkc__TextField__input")
elem2.clear()
elem2.send_keys("Test")
elem2.send_keys(Keys.RETURN)
time.sleep(30)
driver.close()
Ошибка:
Traceback (most recent call last):
File "C:\Users\nurlashka\Desktop\vkLogin\main.py", line 19, in <module>
elem2 = driver.find_element(By.CLASS_NAME, "vkc__TextField__input")
File "C:\Users\nurlashka\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 861, in find_element
return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
File "C:\Users\nurlashka\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 444, in execute
self.error_handler.check_response(response)
File "C:\Users\nurlashka\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\errorhandler.py", line 249, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .vkc__TextField__input
Ответы (2 шт):
Проблема может быть в том, что элемент с таким классом не загружен на страницу в момент поиска. Возможно, этот элемент появляется на странице только после какого-то действия пользователя, например, клика по какому-то другому элементу. В этом случае нужно дождаться загрузки элемента с помощью одного из методов ожидания (например, WebDriverWait).
Тебе нужно было указать ожидания, ниже прикрепляю коррекниый вариант кода, буду рад если отметишь мой коммент как коммент который помог решить проблему
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import time
driver = webdriver.Chrome()
driver.get("https://vk.com")
driver.find_element(By.CLASS_NAME, "VkIdCheckbox__name").click()
driver.find_element(By.CLASS_NAME, "eltt_close_button").click()
elem = driver.find_element(By.ID, "index_email")
elem.clear()
elem.send_keys("Test")
elem.send_keys(Keys.RETURN)
elem2 = WebDriverWait(driver, 3).until(ec.visibility_of_element_located((By.CLASS_NAME, "vkc__TextField__input")))
# elem2 = driver.find_element(By.CLASS_NAME, "vkc__TextField__input")
elem2.clear()
elem2.send_keys("Test")
elem2.send_keys(Keys.RETURN)
time.sleep(3)
driver.close()
