Почему 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 шт):

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

Проблема может быть в том, что элемент с таким классом не загружен на страницу в момент поиска. Возможно, этот элемент появляется на странице только после какого-то действия пользователя, например, клика по какому-то другому элементу. В этом случае нужно дождаться загрузки элемента с помощью одного из методов ожидания (например, WebDriverWait).

→ Ссылка
Автор решения: sdpctr

Тебе нужно было указать ожидания, ниже прикрепляю коррекниый вариант кода, буду рад если отметишь мой коммент как коммент который помог решить проблему


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()
→ Ссылка