Sparkle CodesSparkle
项目 / web测试 / Day08

特殊元素处理:文件上传与日期控件自动化

x
xpx
Jun 19, 2024
Editorial Insight
#Automation#FormHandling#Selenium

攻克特殊 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. 工业级实践经验

  1. 路径健壮性: file path 建议使用 os.path.abspath() 转化为绝对路径,避免在不同运行路径下脚本失效。
  2. 上传后的同步: send_keys 触发上传动作后,浏览器往往需要几秒钟处理。务必加上显式等待,直到「上传完成」的 Toast 提示或后端返回的缩略图出现。
  3. 时区问题: 如果业务涉及国际化,日期控件在注入值时要特别注意服务器时区与浏览器时区的匹配。

继续阅读: Web自动化-验证码绕过与图像识别方案

BACK TO BLOG
The End of Interaction