攻克特殊 UI 元素:当 click() 无法奏效时
文件上传和日期选择是 Web 业务中最常见的交互,但也是自动化报错的重灾区。它们往往由于依赖系统原生对话框或复杂的 JS 面板,使得常规操作难以奏效。
1. 文件上传 (File Upload)
场景 A:标准 input 标签 (推荐)
如果 HTML 结构中含有 <input type="file">,即使它在界面上是「隐藏」的或被按钮覆盖,依然可以直接利用 send_keys。
- 核心操作:
driver.find_element(By.ID, "upload").send_keys(r"C:\test\avatar.png") - 验证证据 (Evidence):
- 检查页面上是否出现了文件名文本。
- 检查上传按钮的状态是否由「请选择」变为「已选择」或「上传中」。
场景 B:非 input 标签 (System Dialog)
如果是点击后弹出系统级对话框,WebDriver 是无法触达的。
- 推荐方案: 尽量通过 JS 钩子寻找隐藏的
input标签。如果实在没有,考虑使用pyautogui(注意:由于不支持 Headless,生产环境建议尽量规避此类场景)。
2. 日期控件 (Date Pickers)
场景 A:可直接输入的日期框
直接 clear() 后使用 send_keys。这是效率最高且最稳定的路径。
场景 B:readonly(只读)日期框
为了强制用户点击面板,很多日期框设置了 readonly 属性。
PYTHON
element = driver.find_element(By.ID, "start_date")
# 1. 破解只读锁:注入 JS 移除属性
driver.execute_script('arguments[0].removeAttribute("readonly")', element)
# 2. 绕过 UI 直接注入文本
element.send_keys("2024-12-31")
验证证据:
执行 driver.execute_script("return arguments[0].value", element),确认返回的值确实是注入的日期。
3. 工业级实践经验
- 路径健壮性: file path 建议使用
os.path.abspath()转化为绝对路径,避免在不同运行路径下脚本失效。 - 上传后的同步:
send_keys触发上传动作后,浏览器往往需要几秒钟处理。务必加上显式等待,直到「上传完成」的 Toast 提示或后端返回的缩略图出现。 - 时区问题: 如果业务涉及国际化,日期控件在注入值时要特别注意服务器时区与浏览器时区的匹配。
继续阅读: Web自动化-验证码绕过与图像识别方案