admin管理员组

文章数量:1529447

最新更新,测试在Chrome Browser Ver.123 上可用

使用 Selenium 4的同学就可以不用看这个了,Selenium 4 有方法直接搞定

业务描述

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

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

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

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

http://username:password@url

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

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

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

参考文献地址:

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

javascript - chrome.webRequest.onAuthRequired Listener - Stack Overflow

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

本文标签: 弹出式浏览器chromeauthenticationwindow