python - Selenium 自动化 – 交互问题
问题描述
我正在开发一个能够登录网页(postmark.com
)的机器人。为此,我正在使用 selenium 和 python。现在我的代码能够访问网页,点击登录点击,插入用户名和密码;但是,当点击登录点击(访问帐户)时,我收到以下错误
Traceback (most recent call last):
File "/home/pi/Documents/Bot_Poshmark.py", line 20, in <module>
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log)).click()
File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/support/wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
奇怪的是,有时(如 2 或 3)我编写的同一段代码可以完成所有步骤。这是我的代码(我为此使用了 Raspberry Pi 4)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.poshmark.com") #Open webpage
Log_Field=(By.XPATH, "//a[contains(text(),'Log in')]")
Email= (By.XPATH, "//input[@placeholder='Username or Email']")
Pass= (By.XPATH, "//input[@placeholder='Password']")
Log= (By.XPATH, "//button[@class='btn btn--primary']")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log_Field)).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Email)).send_keys("xxx@xx.com")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Pass)).send_keys("123456")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log)).click()
有人知道为什么会这样吗?谢谢
解决方案
要将字符序列发送到用户名或电子邮件和密码 字段,您需要诱导WebDriverWait并且element_to_be_clickable()
您可以使用以下任一定位器策略:
使用
CSS_SELECTOR
:driver.get("https://poshmark.com/") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href='/login']"))).click() WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#login_form_username_email"))).send_keys("xxx@xx.com") driver.find_element_by_css_selector("input#login_form_password").send_keys("123456") driver.find_element_by_css_selector("button.btn.blue.btn-primary").click()
使用
XPATH
:driver.get("https://poshmark.com/") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Log in']"))).click() WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='login_form_username_email']"))).send_keys("xxx@xx.com") driver.find_element_by_xpath("//input[@id='login_form_password']").send_keys("123456") driver.find_element_by_xpath("//button[@class='btn blue btn-primary']").click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
这个用例
在此用例中,该行:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log)).click()
无法在所需的时间范围内识别所需的元素,因此您面临TimeoutException。
但是,从TimeoutException中很难挖掘出失败的实际结果。
解决方案
作为了解失败确切原因的解决方案,您需要删除WebDriverWait并将代码行替换为:
find_element_by_class_name(name)
find_element_by_css_selector(css_selector)
find_element_by_id(id)
find_element_by_link_text(link_text)
find_element_by_name(name)
find_element_by_partial_link_text(partial_link_text)
find_element_by_tag_name(tag_name)
find_element_by_xpath(xpath)
time.sleep(secs)
如果需要,您可以在调试时减慢搜索诱导等待的速度。
参考
您可以在以下位置找到一些相关的讨论:
推荐阅读
- ruby-on-rails - 更新另一个字段以及 rails 中的 increment_counter 方法
- javascript - 如何在 material-ui/DatePicker 中设置时区
- regex - 正则表达式提取县和邮政编码
- python - 垂直打印字典内的python列表
- r - 在R中使用列表的foreach
- php - 单击按钮时输出消息,然后在一段时间后自动消失
- react-native - 为 React Native 安装 gRPC-Core 时出错
- windows - 有没有办法在 MS Windows perl 中打开包含长文件名的文件夹?
- node.js - 无法使用 Typescript 从 Protractor 中的节点连接读取描述符
- intellij-idea - IntelliJ 远程调试有时不起作用