什么是自动化反模式?
Selenium 可以驱动浏览器模拟用户操作,但是并非所有操作都应该自动化。
所谓“自动化反模式”,即是指那些不应该被自动化的行为。
这里我们讨论几种 Selenium 自动化过程中最常见的反模式。
验证码识别
目前大部分的网站登录时,在输入用户名和密码的同时,还要求输入一个验证码,用以“人机识别”。
随着验证码的发展,大部分已经不能使用 OCR 等自动识别技术进行“有效”识别了。当然,不少第三方“打码平台”提供了识别服务,但仍会存在一定识别失败率。
不过,关键问题不在于验证码能否自动识别,而在于验证码的用途就是进行“人机识别”。如果验证码能被自动识别,是不是说明它“太弱”了?
因此,自动化测试不应该处理验证码,常规的规避方案是:
- 在测试环境中禁用验证码
- 设置一个万能的验证码
- 添加钩子以允许测试绕过验证码(如:通过 cookie 绕过登录)
双因素认证
双因素认证(2FA,Two Factor Authentication),一种鉴权机制,由认证器(Authenticator),如“谷歌认证器”, “微软认证器”等通过短信或邮件发送一次性密码(OTP,One Time Password)来认证。
双因素认证过程更是超出了浏览器交互范畴,不应由自动化处理,通常规避方案是:
- 在测试环境中,禁用 2FA
- 在测试环境中,对特定用户禁用 2FA
- 将测试机 IP 加入白名单,对白名单禁用 2FA
文件下载
使用 Selenium 模拟类似点击链接进行文件下载的操作并不明智。
首先,文件下载可能需要处理文件对话框——这是系统 UI 级别的交互——超出了 Selenium 的能力。为了不处理文件对话框,一般需要浏览器配置为不弹文件对话框直接下载到默认目录——不同浏览器配置不同(不排除某些浏览器不支持)。
其次,Selenium 并未提供一种方式获取文件下载进度。这可能需要编程在系统层面监控文件的下载。
总之,测试程序的复杂度会大大增加。
如果确实要下载文件进行校验,官方的建议是:使用类似 libcurl 的 HTTP 库进行文件下载。
写在最后
以上是笔者最常遇到的反模式,Selenium 官方还列举了其他一些反模式,可通过“参考”章节的链接查看。
参考
Selenium 文档 - 不鼓励的行为