簡體   English   中英

Chromedriver + Selenium 無法發送“s”鍵

[英]Chromedriver + Selenium cannot send 's' key

使用 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,結果相同。 以前有人遇到過這個問題嗎? 我能做什么?

當您嘗試識別密碼字段並隨后發送字符序列時,可能正在進行某些JavaScriptAJAX調用。 因此問題。


解決方案

要定位並向元素發送字符序列,您必須為element_to_be_clickable()引入WebDriverWait ,您可以使用以下任一解決方案:

  • 使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM