如何使用Selenium和Python覆盖输入框的默认值
Selenium 输入框clear()后仍保留默认值解决方案
问题根因
该站点的邮编输入框默认值由JS异步渲染填充,原生clear()方法执行时要么元素未完全加载,要么执行后JS逻辑又重新回填了默认值,同时你使用的旧版元素定位语法在Selenium 4+版本中已废弃,也可能导致操作不生效。
具体修改方案
- 引入显式等待,确保元素完全可交互后再执行操作,避免页面未加载完成就触发逻辑
- 替换原生
clear()方法,用全选+删除的组合操作清空输入框内容,兼容JS控制的输入框场景 - 替换已废弃的
find_element_by_name语法,使用Selenium 4+标准的元素定位写法 - 可增加输入校验逻辑,确认输入内容符合预期后再触发回车提交
修改后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager radius = int(input("Enter the radius: ")) zipcode = int(input("Enter your zipcode: ")) url = 'https://www.edmunds.com/cars-for-sale-by-owner/' options = Options() options.headless = False options.add_experimental_option("detach", True) browser = webdriver.Chrome(ChromeDriverManager().install(), options=options) browser.maximize_window() browser.set_page_load_timeout(15) browser.get(url) # 显式等待最多10秒,直到邮编输入框可交互 wait = WebDriverWait(browser, 10) zipcode_form = wait.until(EC.element_to_be_clickable((By.NAME, 'zip'))) # 全选后删除原有内容,替代原生clear() zipcode_form.send_keys(Keys.CONTROL, 'a') zipcode_form.send_keys(Keys.DELETE) # 输入自定义邮编 zipcode_form.send_keys(str(zipcode)) # 可选:校验输入内容是否正确,避免输入失效 input_value = zipcode_form.get_attribute('value') if input_value != str(zipcode): # 校验失败重新输入一次 zipcode_form.send_keys(Keys.CONTROL, 'a') zipcode_form.send_keys(Keys.DELETE) zipcode_form.send_keys(str(zipcode)) zipcode_form.send_keys(Keys.RETURN) # 后续提取信息的代码 ...
备注:如果是Mac系统运行代码,把
Keys.CONTROL替换为Keys.COMMAND即可。
内容的提问来源于stack exchange,提问作者Babayega
相关产品推荐
相关产品推荐

