Angular2+ 使用 Protractor 与 Modify Header Value (HTTP Headers) 插件 完成 Windows Authorization 验证
入职新公司第二周,接到了一个E2E测试的任务,两天的时间把所有的测试条件都写完了,结果剩下三天都卡在了Windows Authorization验证这里。
先说一下公司项目Authorize的逻辑
第一步,输入网址后,将重定向到公司统一的登录网站,需要Windows Authorization。
第二部,验证成功的话,将跳转到公司SSO网站,返回相对应网站的cookie
第三部,使用cookie访问用户想访问的网站
失败想法一:
刚开始很偷懒的想用Protractor去抓输入框和登录按钮就好了么。事实证明,这个想法还是太天真。因为浏览器里面的 Windows Authorization 对话框是不存在于DOM上的,所以Protractor是抓不到这个窗口的。
那这个可以理解,换方案。
失败想法二:
stackoverflow.com大法好,搜索了一圈之后,找到第二种方法是在URL中输入http://username:password@domain.com。
结果发现不好用,仔细看了看帖子,发现这都是2017年之前的帖子,于是我去Chrome官网查了相关资料,发现这个方法在V59就被禁止了。
好吧,下一个方案
失败想法三:
这是时候,就要想我能不能绕过认证,直接拿cookie去进行验证呢?
在做这个方案的时候,我可悲的发现,Protractor做不了这件事,没有方法去配置header里面的cookie,即使配置了,也没有按照逻辑去运行。
比如browser.manage().addCookie(),这个方法一直没有按照我的预想去运行,不知道有没有大神能指导我一下
也许我没找到这个正确的方法吧……
失败想法四:
依然是stackoverflow.com,这个方法(Link)我是没有成功,不知道国外那帮大神是怎么干的,理论上应该可行。这里我可以跟大家说这个解决方法的思路,这个思路是成功的,之后我会说解决方案。
这个方法的核心是加了一层proxy,当Protractor启动后,chrome启动并访问我们去测试的网站,那么在中间加一层来配置header并加上Cookie就可以了。
这里面的http-proxy就是这么做的,当Protractor启动之后,所有发出的信息都经过Proxy添加了相应的header,这样就实现了绕过验证页面登录网站。
结果……太复杂,我的大脑已经宕机……
所以换方案
失败想法五:
这时候,我想反正Windows Authrization窗口就跳出来了,那我就模拟键盘敲击:
1. 输入账号
2. 按下Tab键
3. 输入密码
4. 按下Tab键
5. 这时候login按钮得到焦点,按下Enter键就可以了
于是我试了robotjs与robot-js,结果是悲剧的,唉,这时候的感觉就是绝望,真的绝望。
成功方案的摸索过程
这周就剩一天了,在吃了根香蕉(程序猿需要吃香蕉减轻压力啊)
在同事的关怀与鼓励下,我还没有被击倒的情况下发现了另一种解决方案。
那就是借助Chrome的插件来完成这个挑战,这个方案也是一波多折,但是总算解决问题了。
配置的过程:
因为我们访问网站,如果想跳过验证界面的话,直接添加一个带有合法Cookie的header就好了。
1. 于是我下载了一个Chrome扩展差件 Modify Header Value (HTTP Headers)
2. 在添加完成之后,打开插件,url那列添加网址,header那列写cookie,value那列填入cookie的值,点最右边的加号按钮保存
3. 之后插件一定要启动起来,访问我们想要测试的网站,发现不用输入密码就可以进入网站了
发现问题:
用angular-cli运行命令ng e2e的时候,chrome正常启动,但是发现并没有载入插件,所以测试不成功。
调查问题:
这个问题的原因是protractor只是启动了selenium里面的chrome.exe,所以他是很干净的环境,只是加载了一个automation的插件。我们之前在chrome配置的插件根本就没有加载进来
解决问题:
依然通过stackoverflow搜索到加载插件的方法
修改protractor.conf.js里面的代码,在exports.config里面添加这些代码。
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['--load-extension=C:/Users/<User Name>/AppData/Local/Google/Chrome/User Data/Profile 1/Extensions/cbdibdfhahmknbkkojljfncpnhmacdek/0.1.4_0',
'--user-data-dir=C:/Users/<User Name>/AppData/Local/Google/Chrome/User Data']
}
},
directConnect: true,
...
}
--load-extension是指定了extention的路径,后面的cbdibdfhahmknbkkojljfncpnhmacdek是加密的扩展插件名称
--user-data-dir是指定了我们使用的chrome记录的历史记录,如果不指定这个文件的话,你会发现,当protractor启动浏览器后,即使加载了插件,那么插件里面的之前保存的数据也读取不到
这时运行e2e测试时,会发现插件已经加载,并且里面能看到我们之前设置的cookie。
而且验证也已经自动通过了。
更好的解决方案:
刚刚有了一个想法,进行验证,这个方法是更好的
实际上我们已经打开Chrome, 登录网站,已经选择了保存账号与密码,这个时候我们知道确保protractor启动的Chrome能读取到用户文件就好了。
所以我删除了第三方插件,并且将exports.config修改如下
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['--user-data-dir=C:/Users/<UserName>/AppData/Local/Google/Chrome/User Data']
}
},
这样修改完成后,protractor启动的chrome会读取我们之前的登录信息,跳转到我们想测试的界面。
由于碰到了Session过期的问题,而且在重启服务之后也需要手动登录,所以不能使用用户存储数据的方法来解决。
所以继续调查有了新的解决方案
依然使用第三方控件,这次的控件名称为 MultiPass for HTTP basic authentication,下载安装之后,第一次要设置URL,Username和Password。
因为该控件是自动将账号密码转换成header发送出去,所以每次都是模拟重新输入账号密码,就不会存在session过期的问题。
并且将exports.config修改如下
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['--user-data-dir=C:/Users/<UserName>/AppData/Local/Google/Chrome/User Data']
}
},
解决方案只是折中的方案,因为第一次测试的时候,我们需要打开chrome并且输入账号密码并进行保存。
希望有解决这个问题的大神能分享一下经验,谢谢!
希望对大家有帮助
Happy Testing!
Angular2+ 使用 Protractor 与 Modify Header Value (HTTP Headers) 插件 完成 Windows Authorization 验证的更多相关文章
- 火狐添加消息头 Modify Header Value (HTTP Headers)
火狐浏览器添加组件 : Modify Header Value (HTTP Headers)
- Cannot send session cache limiter Cannot modify header information
当php报出 Cannot send session cache limiter 或Cannot modify header information 的错误时 其理论上是因为php代码以前有 ...
- 阿里云服务器出现Warning: Cannot modify header information - headers already sent by (output started at 问题的解决方法
阿里云服务器出现Warning: Cannot modify header information - headers already sent by (output started at 问题的解决 ...
- php有些系统会报错或提示 Cannot modify header information - headers already sent by
Warning: Cannot modify header information - headers already sent by (output started at /home/test/do ...
- PHP错误Warning: Cannot modify header information - headers already sent by解决方法
这篇文章主要介绍了PHP错误Warning: Cannot modify header information - headers already sent by解决方法,需要的朋友可以参考下 今天在 ...
- Warning: Cannot modify header information - headers already sent by (output started at
一般来说在header函数前不能输出html内容,类似的还有setcookie() 和 session 函数,这些函数需要在输出流中增加消息头部信息.如果在header()执行之前有echo等语句,当 ...
- PHP:Cannot modify header information - headers already sent by错误的解决方案
<?php ob_start();setcookie("username","test",time()+3600);echo "the user ...
- Warning: Cannot modify header information - headers already sent by ... functions_general.php on line 45
摘自:有用到 http://blog.csdn.net/besily/article/details/5396268 PHP错误:Warning: Cannot modify header infor ...
- php5.6,Ajax报错,Warning: Cannot modify header information - headers already sent in Unknown on line 0
php5.6ajax报错 Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be remo ...
随机推荐
- 如何实现Zabbix的主动注册功能
主动注册(Active Agent Auto-Registration),顾名思义,无需在Zabbix Web上手动添加host信息,即可实现主机的监控. 它是由Agent主动向Server注册. 相 ...
- chart 目录结构 - 每天5分钟玩转 Docker 容器技术(164)
chart 是 Helm 的应用打包格式.chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源,比如 Service.Deployment.PersistentV ...
- 畅通工程-HZNU寒假集训
畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...
- 使用 Babylon.js 在 HTML 页面加载 3D 对象
五一 Windwos Blogs 推了一篇博客, Babylon.js v3.2 发布了.因为一直有想要在自己博客上加载 3D 对象的冲动,这两天正好看到了,就动手研究研究.本人之前也并没有接触过 W ...
- C++位运算
移位运算 要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形. 2 " < <" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2. ...
- java之SpringMVC的controller配置总结
先在springmvc-servlet.xml文件作如下配置(注解开发controller) <?xml version="1.0" encoding="UTF-8 ...
- Linux 系统化学习系列文章总目录(持续更新中)
本页内容都是本人系统化学习Linux 时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接 ...
- C#读取shp文件并获取图形保存到sde要素类中(不使用ESRI的类库,纯c#实现)
说明:首先要将sde要素类发布成对应的要素服务,通过对要素服务的操作,实现数据在sde要素类中的增删 //向服务器发出请求 public string getPostData(string postS ...
- Effective C++ 读书笔记(13-32)
条款一十三:以对象管理资源 1.把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制“确保资源被释放. 2.auto_ptr是个”类指针对象“,也就是所谓”智能指针“,其析构函数自动对其所指对 ...
- oracle批量插入测试数据
做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法.产生测试数据的SQ ...