Selenium UI 自动化:自定义 send_keys 方法实现与优化
在 UI 自动化测试中,输入文本是最常见的操作之一,但你是否遇到过以下问题?
- 文本框已有默认值,直接 send_keys 会导致测试失败。
- 使用 element.clear() 后,仍无法触发前端的 input 事件。
- 脚本执行速度慢或抛出元素不可见的异常。
今天,我分享一个我在项目中封装的 高可靠性 send_keys 方法,并结合 Selenium + Python 做了优化。
方法实现
def send_keys(self, locator, text):"""输入文本"""try:# 定位元素element = self.find_element(locator)# 清空文本框element.clear()# 执行 JS 清空并触发 input 事件,确保前端响应变化self.driver.execute_script("arguments[0].value=''; arguments[0].dispatchEvent(new Event('input'));", element)# 输入新文本element.send_keys(text)logger.info(f"输入文本到 {locator}: {text}")except Exception as e:self._handle_error("send_keys", locator, e)
核心优化点
1. 双重清空文本框
- element.clear() 可以清除文本框内容,但有些前端框架会阻止或异步修改输入值。
- 使用 JavaScript 强制清空,并触发 input 事件,确保前端监听器正确捕获变化。
2. 捕获异常并统一处理
- 通过 try-except 捕获所有操作异常,调用 _handle_error 方法统一处理(截图、日志等)。
- 提高自动化稳定性,减少测试用例因元素暂未加载而失败。
3. 日志记录
- 使用 logger.info 输出操作信息,便于排查问题。
- 对测试报告友好,可直接查看元素和输入内容。
使用示例
login_page.send_keys(("id", "username"), "test_user")
login_page.send_keys(("id", "password"), "123456")
login_page.click(("id", "login_button"))
- locator 可以是 (By.ID, “username”) 或 (By.XPATH, “//input[@name=‘username’]”)。
- 兼容绝大多数输入框、前端框架(React、Vue、Angular)。
总结
封装高质量的 send_keys 方法,可以解决:
- 前端异步框架导致的输入问题
- 测试脚本稳定性差、间歇性失败的问题
- 日志和异常处理分散、难以排查的问题
在 UI 自动化中,小工具的封装能大幅提升测试效率和稳定性,推荐每个项目都建立自己的基础页面类库。