环境:Win7 + Robot Framework + IE9
任务:下载网页中链接所指向的文件
参考:File Downloads With Selenium — Mission Impossible?
过程:
阶段一:
概述:用 MS UI Automation 操作浏览器控件。
MS UI Automation + NRobotRemote + Selenium2Library + Robot Framework (CPython)
原因:IE9不支持设置成:”点击链接,自动下载文件“。
具体:
> 用 UI Automation 实现包含必要的关键字的 test library。
> NRobotRemote 载入 test library,提供关键字服务。
> pybot(用 CPython 驱动的Robot Framework)调用上述关键字服务,操控浏览器控件,模拟人工下载文件。
缺点:
> 太复杂。 杀鸡用牛刀。就为了下载个文件,启了另一个“重量级”的 test library. 而且该test library 必须以 Remote 的形式存在,否则不能与 Selenium2Library “共存”。
> 效率低。 除了复杂外,UI Automation 查找控件的效率并不高 (比不上 Selenium2Library 查找 html 元素的效率)。
> 不稳定。 UI Automation 本身对控件焦点的依赖度很高,会导致测试过程出错率加大。而且 UI Automation 要求不能锁屏(锁屏会导致控件句柄之类的资源被注销)。IE9 弹出的下载提示框有两种形式(View Downloads 和 Notification Bar)。在实践中发现,这两种提示框的出现没有规律(可能我没研究透),而且有时候 Notification Bar 中的控件不能支持 UI Automation (检测不到关键的按钮)。
阶段二(现在:2014.12.22):
因为阶段一的方案不稳定,所以寻求其它方案。
概述:调用PowerShell下载文件。
Robot Framework.OperatingSystem.Run_And_Return_Rc + PowerShell
过程:
> 尝试篇头参考的文章中提到的“直接下载 (用 wget)”。尝试后发现获取 Cookie 那部分比较“麻烦”(不了解 SUT 的具体实现方式,黑盒测试。)。尝试复制文件链接到另一个浏览器访问,发现输入 SUT 的用户名和密码就能下载文件。于是,成功用 wget 实现直接下载。(wget 的使用方法,语法等,自寻)。
> 进阶。使用 wget 需要先安装 wget,不够NICE。考虑使用 MS-DOS 的命令行,替代 wget。最后决定使用 PowerShell。因为 PowerShell 够强大简便;再者 Win7 自带PowerShell,无需安装其它任何额外的工具。
结果:阶段一方案的缺点都避开了。棒!
思考:
> 很多‘下载文件’需要提供用户名和密码。保管好这些信息。最好用测试专用的账号。PowerShell 支持加密字符串及读取加密后的字符串作为身份验证时的密码。( 可参考 Using PSCredentials without a prompt )(不过这种利用 PowerShell 加密解密的方法有个限制:在本机加密后得到的字符串只能在本机解密。因为密钥存储在本机。)
> UI 自动化不能滥用。UI 自动化的代价太高了。多考虑单元测试和 Service 层的自动化。