Python Selenium操作日期输入框clear()无效无法清空内容怎么解决
问题复现
现有测试代码如下:
from selenium import webdriver from selenium.webdriver.support.select import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys import time PATH = "driver\chromedriver.exe" driver = webdriver.Chrome(executable_path=PATH) url = 'https://www.mergermarket.com/homepage' driver.get(url) deals = driver.find_element_by_xpath('//*[@id="header"]/div/div[2]/nav/ul/li[4]/a') urldeals = deals.get_attribute("href") driver.get(urldeals) custom1 = driver.find_element_by_xpath('//*[@id="searchCriteriaSummary"]/div[4]/div/div[2]/div/div[1]/div[2]/div/div/div[2]/div') custom1.click() custom2 = driver.find_element_by_id('react-select-12-option-0') custom2.click() time.sleep(1) date = driver.find_element_by_xpath('//*[@id="date-picker_from"]') date.click() date.send_keys('01/11/2021') time.sleep(1) date2 = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="date-picker_to"]'))) date2.click() date2.clear() date2.send_keys("15/11/2021")
问题现象:
- 在左侧起始日期输入框填入
01/11/2021后,站点会自动在右侧结束日期输入框填充当前日期 - 调用
clear()方法清空结束日期后输入自定义值,新内容会直接追加在原有默认值后方,无法替换
根因说明
该站点基于React框架开发,日期输入框绑定了组件内部状态,Selenium原生的clear()方法仅修改了DOM节点的展示value,没有触发组件的change更新事件,导致组件底层存储的日期值没有被同步清空,后续输入就会追加在原有值尾部。
可行解决方案
- 方案1:全选替换法(最便捷)
点击输入框后通过快捷键全选现有内容,直接输入新值覆盖原有内容:
date2 = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="date-picker_to"]'))) date2.click() # Windows/Linux用CTRL+A,Mac环境替换为Keys.COMMAND date2.send_keys(Keys.CONTROL, 'a') date2.send_keys("15/11/2021")
- 方案2:JS直接赋值法(稳定性最高)
通过执行JS直接修改输入框值并主动触发变更事件,跳过前端自动填充逻辑:
date2 = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="date-picker_to"]'))) # 直接设置目标日期值 driver.execute_script("arguments[0].value = '15/11/2021';", date2) # 触发change事件同步React组件状态 driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", date2)
- 方案3:退格清空法(兼容性适配)
如果全选逻辑失效,可以通过多次按退格键清空现有内容后再输入:
date2 = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="date-picker_to"]'))) date2.click() # 日期格式为dd/mm/yyyy共10位字符,按10次退格清空 for _ in range(10): date2.send_keys(Keys.BACKSPACE) date2.send_keys("15/11/2021")
内容的提问来源于stack exchange,提问作者LaurieFalcon
相关产品推荐
相关产品推荐

