使用 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()
我正在尝试使用 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()