处理chrome浏览器弹出式授权-Authentication window

业务描述

在执行自动化测试中,使用Chrome浏览器有时会遇到页面弹出一个窗口让你输入账号和密码。类似下图:

此时页面没有任何加载,尝试过的小伙伴应该发现,它既不是Alert对象,也不是prompt,也不是页面元素中的任何一个,自动化工具无法捕捉到。

对于这种页面授权,首先可以尝试更换浏览器,不同浏览器的特性不同,更换后你可能发现验证的方式不是一个弹出式窗口了,而是一个页面。那么自然就可以进行自动化验证。

如果一定要在chrome实现,其实网上提供了很多其他方法,比如使用如下方式访问你的页面

http://username:password@url

也可以使用AutoIT对窗口进行定位然后输入账号密码,或者使用sikuli进行图形自动化。

不过以上方式或多或少并不能适用所有测试环境。

经过搜寻,验证和对比,找到了如下方式,针对chrome浏览器是很稳定并且适用各种场景的方法。

参考文献地址:

https://developer.chrome.com/extensions/webRequest#event-onAuthRequired

https://stackoverflow.com/questions/16612968/chrome-webrequest-onauthrequired-listener

https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46

https://stackoverflow.com/questions/42114940/how-to-handle-authentication-popup-in-chrome-with-selenium-webdriver-using-java

1. 基本思路:

使用chrome创建自定义的extension插件,在测试中让浏览器加载此插件并通过chrome的API自动完成后台授权,这样授权窗口将不会再弹出。需要注意的是当密码更换后需要更新插件编码,重新打包并替换原来的插件

2. 构建自定义插件:

  • 创建一个文件夹命名插件名字(文件夹名)
  • 在文件夹中创建一个名为manifest的json文件,内容如下:

{

  "name":"Webrequest API",

  "version":"1.0",

  "description":"Extension to handle Authentication window",

  "permissions":["webRequest","webRequestBlocking","<all_urls>"],

  "background": { "scripts" : ["webrequest.js"] },

  "manifest_version": 2

}

  • 在文件夹中创建一个名为webrequest的js文件,内容如下:

chrome.webRequest.onAuthRequired.addListener(function(details){

    console.log("Goodbye to your authentication window!!!");

    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这个特性,不过查阅了很多资料后没有找到对应的参数,如果有人知道其他更方便的方法,欢迎更正。

猜你喜欢

转载自blog.csdn.net/LeonLee85/article/details/110136786