使用 Python 3.7.4、Selenium 3.141.0、Chromedriver 78 和 Chrome 78。
我正在尝试自动登录网页,但是当我以表格将密钥发送到输入时,它会发送除"s"字母以外的所有字符。
input = form_element.find_element_by_xpath(password_xpath)
input.send_keys("password")
它只写"paword"。我已经在其他问题中看到过这个问题,但Chromedriver版本很旧。我也尝试使用"\s",但它写"\"。
没有找到任何文档。我尝试使用Chrome 77 + Chromedriver 77,结果相同。 以前有人遇到过这个问题吗?我能做什么?
当您尝试识别密码字段并随后发送字符序列时,可能正在进行某些 JavaScript 或 AJAX 调用。因此问题。
溶液
要找到字符序列并将其发送到元素,您必须诱导WebDriverWait等待element_to_be_clickable()
,您可以使用以下解决方案之一:
-
使用
CSS_SELECTOR
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "password_css"))).send_keys("password")
-
使用
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "password_xpath"))).send_keys("password")
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
您可以将send_keys
包装在一种方法中,以缓慢发送键,并在每次字符按下之间等待。这可能有助于减慢密钥发送速度,并允许字段上的任何 Javascript 事件及时触发,而不会中断密钥发送:
def slowly_send_keys(field, text):
for c in text:
field.send_keys(c)
time.sleep(0.1)
您可以这样称呼它:
input = form_element.find_element_by_xpath(password_xpath)
slowly_send_keys(input, "password")
我们在这里每次按键之间等待 0.1 秒。有时Selenium发送密钥的速度非常快,并且并非所有击键都会被注册,因此此解决方案旨在解决该潜在问题。
在上面的Debanjan解决方案中提到,在密码字段上调用WebDriverWait
也应该有助于解决您的问题 - 我想提供send_keys
的替代方案,以防这也是这里问题的一部分。
您可以通过添加等待来Send Keys
,因为有些时间Element Not Clickable
,并确保Xpath
正确
!如果你不给正确的XPATH
它也会给你错误
对于正确的Xpath
,您可以在 chrome 中使用选择器小工具
好吧,如果你给对XPATH
那么:
试试这个代码!
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as
input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "YOUR XPATH"))).send_keys("Your Password")
你也可以添加等待后的角色,这是方式!
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as
input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "YOUR XPATH")))
for p in input:
input.send_keys(p)
time.sleep(0.5)