最新更新,测试在Chrome Browser Ver.123 上可用
使用 Selenium 4的同学就可以不用看这个了,Selenium 4 有方法直接搞定
业务描述
在执行自动化测试中,使用Chrome浏览器有时会遇到页面弹出一个窗口让你输入账号和密码。类似下图:
此时页面没有任何加载,尝试过的小伙伴应该发现,它既不是Alert对象,也不是prompt,也不是页面元素中的任何一个,自动化工具无法捕捉到。
对于这种页面授权,首先可以尝试更换浏览器,不同浏览器的特性不同,更换后你可能发现验证的方式不是一个弹出式窗口了,而是一个页面。那么自然就可以进行自动化验证。
如果一定要在chrome实现,其实网上提供了很多其他方法,比如使用如下方式访问你的页面
http://username:password@url
也可以使用AutoIT对窗口进行定位然后输入账号密码,或者使用sikuli进行图形自动化。
不过以上方式或多或少并不能适用所有测试环境。
经过搜寻,验证和对比,找到了如下方式,针对chrome浏览器是很稳定并且适用各种场景的方法。
参考文献地址:
https://developer.chrome.com/extensions/webRequest#event-onAuthRequired
javascript - chrome.webRequest.onAuthRequired Listener - Stack Overflow
https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46
How to handle authentication popup in Chrome with Selenium WebDriver using Java - Stack Overflow
1. 基本思路:
使用chrome创建自定义的extension插件,在测试中让浏览器加载此插件并通过chrome的API自动完成后台授权,这样授权窗口将不会再弹出。需要注意的是当密码更换后需要更新插件编码,重新打包并替换原来的插件。
2. 构建自定义插件:
- 创建一个文件夹命名插件名字SkipAuth
- 在文件夹中创建一个名为manifest的json文件,内容如下:
{ "manifest_version": 2, "name": "Skip Basic Auth", "version": "1.0", "permissions": [ "webRequest", "webRequestBlocking", "<all_urls>" ], "background": { "scripts": ["background.js"], "persistent": true } }
- 在文件夹中创建一个名为background的js文件,内容如下:
chrome.webRequest.onAuthRequired.addListener( function(details) { return { authCredentials: {username: "<username>", password: "<password>"} }; }, { urls: ['<all_urls>'] }, ['blocking'] );
- 打包插件,进入chrome://extensions/, 选择pack extension,再选择你的文件夹之后打包,获得一个后缀名为crx的文件。
- 此时可以尝试把crx拖入chrome进行安装,查看是否编写成功。不过此时你无法直接使用这个插件,因为Google要求所有插件必须从官方商店下载安装。现在可以卸载掉它,稍后我们在自动化中使用。
3. 在自动化中加载你的插件
- 将上面生成的crx文件放到你的框架中。并且带入如下参数启动你的chrome浏览器:
ChromeOptions options = new ChromeOptions(); options.addExtensions(new File("<path of your crx file>")); options.addArguments("--no-sandbox");
使用沙盒模式可以允许浏览器使用你自定义的插件。现在你会发现验证信息窗口已经消失了。
其实还有考虑过通过修改参数可以禁用chrome这个特性,不过查阅了很多资料后没有找到对应的参数,如果有人知道其他更方便的方法,欢迎更正。