问题描述
我正在尝试使一群用户自动登录到 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()