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"
问题分析
- SHIFT按键未释放:调用
key_down(Keys.SHIFT)后未执行key_up(Keys.SHIFT),导致后续所有输入都处于大写状态,且按键状态持续影响后续操作 - ActionChains未绑定目标元素:直接使用全局
send_keys会将内容发送到当前焦点元素,切换输入框后,未释放的按键+全局输入会覆盖已有内容 - 冗余输入操作:对邮箱输入框同时调用
send_keys和ActionChains输入,属于重复操作 - 断言逻辑错误:
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
相关产品推荐
相关产品推荐

