前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不知道的Cypress系列(15) -- 支持跨域访问了!

你不知道的Cypress系列(15) -- 支持跨域访问了!

作者头像
iTesting
发布于 2022-04-28 00:10:20
发布于 2022-04-28 00:10:20
2.6K00
代码可运行
举报
文章被收录于专栏:iTestingiTesting
运行总次数:0
代码可运行

转眼之间,你不知道的Cypress系列已经到第15篇了。在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸。

说起Cypress,读者朋友们应该对“下一代Web端自动化测试技术”,“弯道超车首选”等等早已烂熟于心了。Cypress独特的运行机制(运行在浏览器内)也使得它吊打Webdriver之类的UI自动化测试工具。但是Cypress并不是完美无瑕,我们在使用Cypress做自动化测试时,经常会提的一个问题就是,Cypress不支持跨域访问,而我的测试需要跨域怎么办?

今天在Cypress中国群内,有同学抛出了以下这个待发行的解决方案,我看了后顿时觉得好香,特记录之。(永远不要怀疑Cypress开发团队的愿景:The web has evolved. Finally, testing has too.)

跨域访问的问题

看过我Cypress书的同学都应该明白,Cypress里进行跨域访问会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 关注iTesting,跟万人测试团一起成长。
describe('iTesting测试', function () {
    it(`[This is a demo test`, function () {
        cy.visit('https://www.cypress.io/')
        cy.contains('Login').invoke('removeAttr', 'target').click({force: true})
        //这里点击google登录,会跨域,所以报错
        cy.contains('Log in with Google').click()
    });
});

报错的信息通常如下所示:

为了避免这个错误,如果我们使用的是Chrome浏览器进行测试,我们通常在cypress.json文件夹里添加如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chromeWebSecurity:false

有时候,我们不想在cypress.json里配置,也可以直接在运行命令行参数时,指定参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn cypress open --config chromeWebSecurity=false

但这个方案不总是有效。像当前这个情况就是无效的。

这个时候怎么办?

当前的解决方案是尽量的拆Case,从而保证在一条测试运行里不进行跨域访问。比如,我的这条case实际上是通过google登录,那么我可以在这条case里直接访问登录的那个url,而不必访问cypress.io, 但是这个是很简单的情况,实际测试中,很复杂,我们必须要拆分测试用例,而这个操作很不方便。好在Cypress团队也注意到了这个问题。在即将发布的9.6.0版本中,Cypress将支持跨域访问。

Cypress支持跨域 -- cy.origin()

在即将发布的9.6.0版本中,我们可以通过cy.origin()命令来支持跨域访问。要启用cy.origin(),我们需要在cypress.json中配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ "experimentalSessionAndOrigin": true}

此时,你就可以使用了,cy.origin()的语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cy.origin(url, callbackFn)
cy.origin(url, options, callbackFn)

注意:

url: 这个url是cy.origin执行回调的那个次要来源(假设在A domain下进行某个操作会跳转到domain B,那么A就是主要来源,B就是次要来源)。

options: 这个参数是一个普通的 JavaScript 对象,它将被序列化并从主要来源发送到次要来源。从那里它将被反序列化并作为第一个也是唯一的参数传递给回调函数。该参数的args对象(注意这个对象,看后续的代码)是唯一可以将数据注入回调的机制,因为回调不是闭包,并且不保留对声明它的 JavaScript 上下文的访问。

callbackFn: 此参数包含要在次要来源中执行的Cypress命令的函数。Cypress将触发此函数并从当前Cypress实例传递到次要源并进行评估。

实践

举个例子吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 关注iTesting,跟万人测试团一起成长。
describe('iTesting测试', function () {
    it(`This is a demo`, function () {
        cy.visit('https://www.cypress.io/')
        cy.contains('Login').invoke('removeAttr', 'target').click({force: true})
        //这里点击google登录,会跨域,所以报错
        cy.contains('Log in with Google').click()
        // 这个url填你的地址,可以手工copy过来
        cy.origin("https://accounts.google.com/o/oauth2/auth/identifier?response_type=code&redirect_uri=https%3A%2F%2Fauth.cypress.io%2Flogin%2Fcallback&scope=email%20profile&state=vJHVGMmWHCZr7cEG-u8Si9JuLhh2uD9V&client_id=976680234070-jlotbgdqfah46f34o4oheoqkrng39jn9.apps.googleusercontent.com&hl=zh-CN&flowName=GeneralOAuthFlow", () => {
            cy.get("input[type="email"]").type('kevin.cai@google.com');// 这里用户名写死了。
            cy.contains('Next').click()
            cy.get("input[type='password']").type('你的密码')//密码也是一样写死了。
            cy.contains('Next').click()
            //登录成功,断言
            cy.url().should('include', 'https://dashboard.cypress.io/welcome') 
    });
});

更进一步 -- 重用

可以看到,上面的是个通过SSO登录的例子,那么实际上,登录应该是个通用的操作,我们把它写到support/commands.js 文件下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cypress.Commands.add("googleLogin", (email, password) => {
  cy.visit('https://www.cypress.io/')
  cy.contains('Login').invoke('removeAttr', 'target').click({force: true})
  //这里点击google登录
  cy.contains('Log in with Google').click()
  
  // 关注iTesting,跟万人测试团一起成长。
  cy.origin(
    "登录地址",
    { args: [email, password] }, // args 对象,划重点
    ([email, password]) => {
      cy.get("input[type="email"]").type(email); // args对象用法
      cy.contains('Next').click()
      cy.get("input[type='password']").type(password);
      cy.contains('Next').click()
    }
  );

  //登录成功,断言
  cy.url().should('include', 'https://dashboard.cypress.io/welcome') 
});

通过这样的方式,我们就可以直接在测试用例里调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
beforeEach(() => {
  cy.googleLogin('用户名iTesting', '密码');
});

使用cy.session()加速鉴权

记得 你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权 这篇文章不?我们来再次update下我们的最终代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cypress.Commands.add("login", (email, password) => {
  cy.session([email, password], () => {
      cy.visit('https://www.cypress.io/')
      cy.contains('Login').invoke('removeAttr', 'target').click({force: true})
      //这里点击google登录
      cy.contains('Log in with Google').click()

      // 关注iTesting,跟万人测试团一起成长。
      cy.origin(
        "登录地址",
        { args: [email, password] },
        ([email, password]) => {
          cy.get("input[type="email"]").type(email);
          cy.contains('Next').click()
          cy.get("input[type='password']").type(password);
          cy.contains('Next').click()
        }
      );

      //登录成功,断言
      cy.url().should('include', 'https://dashboard.cypress.io/welcome') 
  });
});

使用的方式一样,直接在测试代码里调用即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
beforeEach(() => {
  cy.googleLogin('用户名iTesting', '密码');
});

注意:

cy.origin()需要升级Cypress到最新的9.6.0,截止本文发布时(2022/04/27),官方还没有release 9.6.0版本。

作者: Kevin Cai, 江湖人称蔡老师。 过期两性情感专家,非著名测试开发。 技术路线的坚定支持者,始终相信Nobody can be somebody。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
图像处理的仿射变换与透视变换
  这一周主要在研究图像的放射变换与透视变换,目前出现的主要问题是需要正确识别如下图中的编码标志点圆心。 1.当倾斜角较小时:
3D视觉工坊
2020/12/11
1.5K0
图像处理的仿射变换与透视变换
图像各向异性滤波
各向异性概念 各向异性(英文名称:anisotropy)是指材料在各方向的力学和物理性能呈现差异的特性。晶体的各向异性即沿晶格的不同方向,原子排列的周期性和疏密程度不尽相同,由此导致晶体在不同方向的物理化学特性也不同,这就是晶体的各向异性。亦称“非均质性”。物体的全部或部分物理、化学等性质随方向的不同而各自表现出一定的差异的特性。即在不同的方向所测得的性能数值不同。对图像来说各向异性就是在每个像素点周围四个方向上梯度变化都不一样,滤波的时候我们要考虑图像的各向异性对图像的影响,而各向同性显然是说各个方向的
OpenCV学堂
2018/04/04
2.4K0
图像各向异性滤波
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
vv彭
2020/10/27
4.1K0
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
    


OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
【opencv实践】仿射变换和透视变换
上面这副图就是我们今天要处理的了,我们想把它从拍照视角变成鸟瞰图,这是机器人导航中的常用手段,以便在该平面上进行规划和导航。
周旋
2020/06/04
5.7K1
实战 | OpenCV实现多角度模板匹配(详细步骤 + 代码)
本文将介绍使用OpenCV实现多角度模板匹配的详细步骤 + 代码。(来源公众号:OpenCV与AI深度学习)
Color Space
2022/05/26
13.7K0
实战 | OpenCV实现多角度模板匹配(详细步骤 + 代码)
C#使用OpenCV进行答题卡识别
type表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数),由type()返回,但是返回值是int型,不是OpenCV预定义的宏(CV_8UC1, CV_64FC1…),也就是说你用type函数得到的只是一个int型的数值,比如CV_8UC1返回的值是0,而不是CV_8UC1。
码客说
2022/09/09
2.9K1
C#使用OpenCV进行答题卡识别
【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】
本文出现的数据结果和码源见:https://download.csdn.net/download/sinat_39620217/18269470
汀丶人工智能
2022/12/21
3K0
【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】
【从零学习OpenCV 4】图像仿射变换
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。
小白学视觉
2019/11/30
9540
常用数据增广方法,解决数据单一问题
寄语:本文将对传统图像算法的数据增广方式进行学习,以最常用的平移和旋转为例,帮助大家梳理几何变换的概念和应用,并对其在OpenCV的框架下进行了实现。
Datawhale
2020/05/29
2.4K0
OpenCV极坐标变换函数warpPolar的使用
前阵子在做方案时,得了几张骨钉的图片,骨科耗材批号效期管理一直是比较麻烦的,贴RFID标签成本太高,所以一般考虑还是OCR的识别比较好,因为本身骨钉的字符是按圆印上去的,直接截取图片进行OCR没法识别,需要经过图像处理后再识别,所以这篇就是学习一下OpenCV的极坐标变换函数。
Vaccae
2023/12/14
5260
OpenCV极坐标变换函数warpPolar的使用
OpenCV消除高亮illuminationChange函数的使用
上一篇《OpenCV极坐标变换函数warpPolar的使用》中介绍了极坐标变换的使用,文中提到过因为手机拍的照片,部分地方反光厉害。OpenCV本身也有一个消除高亮的函数,今天这篇就是来了解一下消除高亮函数的使用,就结果来说,有效果,但不多。
Vaccae
2023/12/19
1.8K0
OpenCV消除高亮illuminationChange函数的使用
C#调用OpenCV开发简易版美图工具
本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,下面我们先来做开发前的准备工作。
Kiba518
2019/10/09
2K0
C#调用OpenCV开发简易版美图工具
opencv图像角点提取
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179735.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
5720
OpenCV图像处理笔记(二):图片操作进阶
一、图像模糊 1、模糊原理 Smooth/Blur 是图像处理中最简单和常用的操作之一 使用该操作的原因之一就为了给图像预处理时候减低噪声 使用Smooth/Blur操作其背后是数学的卷积计算 通常这
MiChong
2020/09/24
1.2K0
OpenCV图像处理笔记(二):图片操作进阶
OpenCV 图片缩放
对图像进行缩放的最简单方法就是调用OpenCV中resize函数。resize函数可以将源图像精确地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。
AI异构
2020/07/29
3.6K0
OpenCV 图片缩放
【走进OpenCV】重映射与仿射变换
其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的。
小白学视觉
2019/10/24
1.2K0
OpenCV图像处理03-矩阵的掩膜操作
03-矩阵的掩膜操作 #include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace std; using namespace cv; int main() { Mat src, dst; src = imread("D:\\heroRcData\\opencvProject\\arrowImg\\01\\01.jpg"); if (!src.data) { cout << "could not lo
yangjiao
2021/03/04
3420
【失败也分享】C++ OpenCV人脸Delaunay三角形提取及仿射变换的使用
最近这几篇OpenCV相关的文章都是与人脸有关,其实最主要是就是想做人脸替换的小试验,大概流程是:
Vaccae
2021/03/12
1.7K0
OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
一、霍夫直线变换 1、霍夫直线变换 Hough Line Transform用来做直线检测 前提条件 – 边缘检测已经完成 平面空间到极坐标空间转换 2、霍夫直线变换介绍 对于任意一条直线上的所有点来说 变换到极坐标中,从[0~360]空间,可以得到r的大小 属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线 3、相关API 标准的霍夫变换 cv::HoughLines从平面坐标转换到霍夫空间,最终输出是
MiChong
2020/09/24
3.1K0
OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
【OpenCV】Chapter3.图像的仿射变换
仿射变换其实包含了一系列的操作:平移,缩放,旋转等,不过所有的操作都可以通过这个仿射变换矩阵来实现。
zstar
2022/09/22
1.3K0
【OpenCV】Chapter3.图像的仿射变换
推荐阅读
相关推荐
图像处理的仿射变换与透视变换
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验