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

Automate login with selenium and python, how to correctly extract element for user and password

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

我的代码看起来像这样:

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") returns 错误:

>>> 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, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@type='password']"))).send_keys("myfakepass")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//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()