Я пытаюсь войти на 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()
Похоже, что элемент userID отсутствует при первой загрузке страницы, но вскоре создается динамически. Вам нужно сказать селену подождать, пока этот элемент не появится.
@JeffC Мне нравится этот сайт и его удивительное сообщество. Это сработало как шарм, я думаю, элемент еще не был загружен. Спасибо. Я изменю свой пост, чтобы включить решение.
@JamesHayek Я бы посоветовал предоставить проверенное решение в разделе ответов, а не публиковать его в разделе вопросов. Спасибо
Здорово. Я добавил свой комментарий в качестве ответа и немного расширил его.
@SaurabhGaur Я сделал это намеренно, чтобы Джефф, поставщик решений, мог получить признание за ответ. Это, а также чтобы будущий читатель мог получить решение, не прокручивая слишком далеко.






Вполне вероятно, что элемент сначала не виден, и это вызывает сбой. Подождите, пока элемент не станет видимым/доступным для клика, а затем используйте клавиши отправки.
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "userID"))).send_keys(userName)
Я предполагаю, что поиск элемента происходит до его загрузки. Мое предложение попытается немного подождать, и оно должно сработать.
Пробовали ли вы добавить WebDriverWait и подождать, пока элемент станет активным, прежде чем пытаться отправить ключи?