Ошибка входа в Selenium - неправильные идентификаторы? - PullRequest
1 голос
/ 06 мая 2020

Это всего лишь быстрая проверка работоспособности. Я надеюсь, что кто-нибудь сможет обратить на это внимание.

По сути, я пытаюсь войти на этот сайт (ArcGIS Online) с помощью селена: https://www.arcgis.com/home/signin.html?useLandingPage=true ".

Вот как выглядят элементы: enter image description here

Мой код для входа выглядит так:

user = driver.find_element_by_name("user_username")
password = driver.find_element_by_name("user_password")
user.clear()
user.send_keys(username)
password.clear()
password.send_keys(password)
driver.find_element_by_id("signIn").click()

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

В настоящее время я получаю следующую ошибку:

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

Действительно цените любые мысли, которые у людей есть!

EDIT:

Обновлен код на этот:

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

options = webdriver.ChromeOptions()
options.headless = True
browser = webdriver.Chrome(options=options)
url = "https://www.arcgis.com/home/signin.html?useLandingPage=true"
browser.get(url)

try:
    user = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.ID, "user_username"))
    )

    password = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.ID, "user_password"))
    )  

    signin = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.ID, "signIn"))
    ) 

    user.clear()
    user.send_keys(username)
    password.clear()
    password.send_keys(password)
    signin.click()

finally:
    browser.quit()

И теперь получим эту ошибку:

TypeError: object of type 'WebElement' has no len()

Вероятно, что-то не так, мы более подробно рассмотрим правильное использование функции ожидания.

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Для всех, кто заходил на эту страницу, решение заключалось в том, чтобы дождаться загрузки элементов, убедитесь, что я выполнял поиск по Удостоверения личности и ... убедитесь, что у меня нет опечаток! Ниже представлен рабочий сценарий:

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

username = "Hari"
password = "Seldon" 
options = webdriver.ChromeOptions()
options.headless = True
driver = webdriver.Chrome(options=options)
url = "https://www.arcgis.com/home/signin.html?useLandingPage=true"
driver.get(url)
try:
    user = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "user_username")))
    passwd = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "user_password")))
    user.clear()
    user.send_keys(username)
    passwd.clear()
    passwd.send_keys(password)
    driver.find_element_by_id("signIn").click()  

finally:
    driver.quit()

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы должны сначала дождаться загрузки элементов на странице:

user = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "user_username")))
password = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "user_password")))
user.clear()
user.send_keys("aaa")
password.clear()
password.send_keys("bbb")
driver.find_element_by_id("signIn").click()

Вам нужны эти импорты для функции ожидания:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
1 голос
/ 06 мая 2020

Вы используете find_element_by_name, но используете значение id в коде. Я изменил его на find_element_by_id, и он работает. Код ниже:

user = browser.find_element_by_id("user_username")
password = browser.find_element_by_id("user_password")
user.clear()
user.send_keys(username)
password.clear()
password.send_keys(password)
browser.find_element_by_id("signIn").click()
...