You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium ActionChains输入异常:无法正确填充双输入框

问题:Selenium输入框填充异常,邮箱无法保留内容
  • 填充"Your Name"和"Email Address"两个输入框时,仅能成功填充姓名框,邮箱框无法填充
  • 调整ActionChains执行顺序后,邮箱先被填充,但随后会被姓名内容覆盖

原代码

url = "http://automationpractice.com/"
start_page = StartPage(chrome_browser)
start_page.open_page(url)
start_page.select_image(chrome_browser)

home_page = HomePage(chrome_browser)
home_page.select_chat_with_sales(chrome_browser)

chrome_browser.switch_to.window(chrome_browser.window_handles[1])
chrome_browser.implicitly_wait(10)

email_input = chrome_browser.find_element(By.ID, "customer-email")
email_input.click()
email_input.send_keys("test@gmail.com")
ActionChains(chrome_browser) \
    .key_down(Keys.SHIFT) \
    .send_keys("test@gmail.com") \
    .perform()
chrome_browser.implicitly_wait(5)
your_name = chrome_browser.find_element(By.ID, "customer-name")
your_name.click()

ActionChains(chrome_browser) \
    .key_down(Keys.SHIFT) \
    .send_keys("Test Testsson") \
    .perform()

chrome_browser.implicitly_wait(5)

chat_with_us = chrome_browser.find_element(By.XPATH, "//*[contains(text(), 'Chat with us')]")
assert chat_with_us == "Chat with us"

问题分析

  1. SHIFT按键未释放:调用key_down(Keys.SHIFT)后未执行key_up(Keys.SHIFT),导致后续所有输入都处于大写状态,且按键状态持续影响后续操作
  2. ActionChains未绑定目标元素:直接使用全局send_keys会将内容发送到当前焦点元素,切换输入框后,未释放的按键+全局输入会覆盖已有内容
  3. 冗余输入操作:对邮箱输入框同时调用send_keys和ActionChains输入,属于重复操作
  4. 断言逻辑错误:find_element返回WebElement对象,直接与字符串比较永远不成立,需获取元素文本后再断言

修正后的代码

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "http://automationpractice.com/"
start_page = StartPage(chrome_browser)
start_page.open_page(url)
start_page.select_image(chrome_browser)

home_page = HomePage(chrome_browser)
home_page.select_chat_with_sales(chrome_browser)

# 切换到新窗口,使用显式等待确保窗口加载完成
chrome_browser.switch_to.window(chrome_browser.window_handles[1])
wait = WebDriverWait(chrome_browser, 10)

# 处理邮箱输入框:绑定元素操作,避免全局输入
email_input = wait.until(EC.element_to_be_clickable((By.ID, "customer-email")))
ActionChains(chrome_browser) \
    .click(email_input) \
    .send_keys("test@gmail.com") \
    .perform()

# 处理姓名输入框:绑定元素操作,按需对首字母使用SHIFT并及时释放
your_name = wait.until(EC.element_to_be_clickable((By.ID, "customer-name")))
ActionChains(chrome_browser) \
    .click(your_name) \
    .key_down(Keys.SHIFT) \
    .send_keys("t") \
    .key_up(Keys.SHIFT) \
    .send_keys("est ") \
    .key_down(Keys.SHIFT) \
    .send_keys("t") \
    .key_up(Keys.SHIFT) \
    .send_keys("estsson") \
    .perform()

# 修正断言逻辑,获取元素文本后比较
chat_with_us = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[contains(text(), 'Chat with us')]")))
assert chat_with_us.text.strip() == "Chat with us"

关键修改说明

  • 用显式等待替代重复的implicitly_wait,确保元素可交互后再操作,提升稳定性
  • 每个ActionChains操作都绑定目标输入框,通过click确保焦点在目标元素上,避免全局输入导致的内容覆盖
  • 若需要部分字符大写,仅针对对应字符使用key_down/key_up(Keys.SHIFT),操作后立即释放按键,避免影响后续输入
  • 修正断言逻辑,获取元素的text属性后再与目标字符串比较

内容的提问来源于stack exchange,提问作者Daniel Axelsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:38:17