Вопрос-Ответ

Selenium in Python: "NoSuchElementException: Message: no such element: Unable to locate element"

Selenium в Python: "NoSuchElementException: Сообщение: нет такого элемента: не удается найти элемент"

Я попытался ввести 'abc' в первом блоке идентификатора и 'cdef' во втором блоке пароля.

Однако внизу появляется код ошибки.

from selenium import webdriver
driver.get('http://sugang.korea.ac.kr')

Я добавил неявное ожидание, чтобы предотвратить выполнение кода до полной загрузки страницы.

driver.implicitly_wait(30)

Код для добавления имени пользователя и пароля приведен ниже:

driver.find_element_by_name('id').send_keys('abc')
driver.find_element_by_name('pw').send_keys('cdef')

Но я получаю следующую ошибку:


Исключение NoSuchElementException: Сообщение: нет такого элемента: не удается найти элемент: {"метод": "id", "селектор": "id"}


Переведено автоматически
Ответ 1

Исключение "Нет такого элемента" обычно возникает, когда веб-драйвер не может видеть элемент, над которым вы пытаетесь выполнить действие.

Причинами могут быть:


  1. ваш идентификатор или имя, XPath или cssSelector могут быть неверными.



  2. Ваш элемент может находиться внутри iframe, поэтому веб-драйвер не может его увидеть или обнаружить. Переключитесь на iframe с помощью Selenium и python



  3. Вашему элементу требуется время, чтобы появиться в пользовательском интерфейсе, поэтому вы можете использовать явное ожидание, чтобы решить эту проблему. Смотрите 5. Waits



Ответ 2

Поля имени пользователя и пароля находятся в пределах frame, поэтому вам необходимо:


  • Вызовите WebDriverWait, чтобы нужный фрейм был доступен, и переключитесь на него.

  • Вызовите WebDriverWait, чтобы нужный элемент был кликабельным.

  • Вы можете использовать следующее решение:


    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By

    driver = webdriver.Firefox(executable_path=r'C:\\Utility\\BrowserDrivers\\geckodriver.exe')
    driver.get("http://sugang.korea.ac.kr")
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"firstF")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.input_login[name='id']"))).send_keys('abc')
    driver.find_element_by_css_selector("input.input_login[name='pw']").send_keys("cdef")

  • Снимок браузера:


sugang_korea_ac_kr

Ответ 3

Добавить явное ожидание

from selenium.webdriver.support import expected_conditions as EC

userNameElement= WebDriverWait(driver, 2).until(
EC.presence_of_element_located((By.NAME, "id"))
userNameElement.send_keys('abc')

pwdElement= WebDriverWait(driver, 2).until(
EC.presence_of_element_located((By.NAME, "pwd"))
pwdElement.send_keys('cdef')

Здесь я ожидаю, что ваши локаторы верны.

Ответ 4

Он находится во фрейме, на который вам нужно переключиться в первую очередь. Кроме того, используйте идентификаторы, где это возможно, поскольку они быстрее.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url ="http://sugang.korea.ac.kr"
driver = webdriver.Chrome()
driver.get(url)
WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.CSS_SELECTOR,'[name=firstF]')))
driver.switch_to.frame(driver.find_element_by_css_selector('[name=firstF]'))
WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.ID,'id'))).send_keys('abc')
driver.find_element_by_id('pw').send_keys('def')
driver.find_element_by_id('loginButton').click()
2023-07-18 02:58 python selenium selenium-webdriver