使用 selenium 和 python 自动登录,如何正确提取用户和密码元素

问题描述

我正在尝试使一群用户自动登录到 fitbit 站点,以使用 python 的模块 selenium 下载他们的数据。不幸的是,我通过查看页面的源 html 代码并没有完全理解如何选择正确的元素。

我的代码看起来像这样:

driver = webdriver.Firefox()

driver.get("https://accounts.fitbit.com/login")

driver.find_element_by_id("email").send_keys('name.surname@gmail.com')
driver.find_element_by_id("pass").send_keys("myfakepass")
driver.find_element_by_id("loginbutton").click()

但我不知道如何提取元素,因为 driver.find_element_by_id("email") 返回错误

>>> driver.find_element_by_id("email")
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py",line 360,in find_element_by_id
    return self.find_element(by=By.ID,value=id_)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py",line 976,in find_element
    return self.execute(Command.FIND_ELEMENT,{
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py",line 321,in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py",line 242,in check_response
    raise exception_class(message,screen,stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="email"]

这对我来说完全有意义,因为如果我检查 https://accounts.fitbit.com/login 的源页面,我无法检测到任何名为“电子邮件”的字段。但是,可能由于我缺乏经验,我无法在 html 源代码中检测到登录所需的任何元素。

有人可以帮我吗?

谢谢

解决方法

您的定位器似乎有误。试试下面的 xpath

诱导 WebDriverWait() 并等待 element_to_be_clickable()

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//input[@type='email']"))).send_keys('name.surname@gmail.com')
WebDriverWait(driver,"//input[@type='password']"))).send_keys("myfakepass")
WebDriverWait(driver,"//button[text()='Login']"))).click()

您需要导入以下库。

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

有一个有效的代码。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time


driver = webdriver.Chrome('your path')
url = "https://accounts.fitbit.com/login"
driver.get(url)
time.sleep(2)
email = driver.find_element_by_id("ember660")
email.send_keys("Edward@elric.com")
password = driver.find_element_by_id("ember661")
password.send_keys("Password")
login_button = driver.find_element_by_id("ember701").click()

您的程序无法运行,因为 id 错误

,

我想出了一个简单有效的代码。 使用集成在 chrome 中的“Inspect”命令来查找与每个字段相关的 id 或 xpath 非常有用。还需要打包时间来避免错误。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome('path to chromedriver')
url = "https://accounts.fitbit.com/login"
driver.get(url)
time.sleep(2)
email = driver.find_element_by_id("ember659")
email.send_keys("mail@gmail.com")
password = driver.find_element_by_id("ember660")
password.send_keys('actualpassword')

driver.find_element_by_xpath('//*[@id="loginForm"]/div[4]/div').click()