Python: Selenium «нет такого элемента» XPath или ID

Я пытаюсь войти на Tessco.com Я узнал, что этот сайт использует JavaScript, поэтому мне не удалось найти форму с помощью RoboBrowser.

Сейчас я использую Селениум. Я использовал два метода для ввода информации в поле. Один, используя driver.find_element_by_xpath(), а также driver.find_element_by_id()

Обе попытки приводят к ошибке. Код выглядит следующим образом:

import time
from selenium import webdriver
chrome_path = r"C:\Users\James\Documents\Python Scripts\jupyterNoteBooks\ScrapingData\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("https://www.tessco.com/login")

userName = "[email protected]"
password = "PasswordForThis123"

elem = driver.find_element_by_xpath("""//*[@id = "userID"]""")
elem = send_keys(userName)

elem = driver.find_element_by_xpath("""//*[@id = "password"]""")
elem = send_keys(password)

driver.close()

Ошибка:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id = "userID"]"}

Когда я вызываю элемент, используя идентификатор как таковой:

elem = driver.find_element_by_id("userID")
elem = send_keys(userName)

elem = driver.find_element_by_id("password")
elem = send_keys(password)

Я получил:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id = "userID"]"}

У меня сложилось впечатление, что я проверил элемент и использовал соответствующие имена.

Любые намеки или идеи, что я делаю неправильно?






Решение представлено ниже в разделе комментариев. Код изменен на:

import time
from selenium import webdriver
#Webdriver wait functions being introduced to add a delay.
#I was running into problems, with the ID not being found
#add wait for the element to be clickable before trying send keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_path = r"C:\Users\James\Documents\Python Scripts\jupyterNoteBooks\ScrapingData\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("https://www.tessco.com/login")

userName = "[email protected]"
password = "PasswordForThis123"

wait = WebDriverWait(driver, 10)

elem = wait.until(EC.element_to_be_clickable((By.ID, "userID"))) 
elem.send_keys(userName)

elem = wait.until(EC.element_to_be_clickable((By.ID, "password"))) 
elem.send_keys(password)

driver.close()

Пробовали ли вы добавить WebDriverWait и подождать, пока элемент станет активным, прежде чем пытаться отправить ключи?

JeffC 02.07.2019 23:28

Похоже, что элемент userID отсутствует при первой загрузке страницы, но вскоре создается динамически. Вам нужно сказать селену подождать, пока этот элемент не появится.

John Gordon 02.07.2019 23:32

@JeffC Мне нравится этот сайт и его удивительное сообщество. Это сработало как шарм, я думаю, элемент еще не был загружен. Спасибо. Я изменю свой пост, чтобы включить решение.

James Hayek 03.07.2019 01:44

@JamesHayek Я бы посоветовал предоставить проверенное решение в разделе ответов, а не публиковать его в разделе вопросов. Спасибо

Saurabh Gaur 03.07.2019 01:55

Здорово. Я добавил свой комментарий в качестве ответа и немного расширил его.

JeffC 03.07.2019 04:55

@SaurabhGaur Я сделал это намеренно, чтобы Джефф, поставщик решений, мог получить признание за ответ. Это, а также чтобы будущий читатель мог получить решение, не прокручивая слишком далеко.

James Hayek 05.07.2019 17:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
869
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "userID"))).send_keys(userName)

Я предполагаю, что поиск элемента происходит до его загрузки. Мое предложение попытается немного подождать, и оно должно сработать.

Другие вопросы по теме