如何从cy.origin中获取yielded value以供外部使用?
如何从cy.origin中获取yielded value以供外部使用?
我之前也踩过这个坑!你遇到的undefined问题,本质上是两个原因:一是cy.origin()会在独立的跨域浏览器上下文里运行,内部变量没法直接穿透到外部;二是Cypress所有命令都是异步队列执行的,直接同步赋值肯定拿不到结果。
下面给你两种靠谱的解决方法,都是我实际用过的:
方法一:用闭包变量 + .then() 捕获返回值
先声明一个外部变量,然后在cy.origin()内部return需要的值,最后通过.then()把异步返回的值存到变量里——注意一定要在Cypress的异步命令链里使用这个值,不能同步调用。
示例代码:
// 先声明一个闭包变量,用来存从origin拿到的值 let capturedValue; cy.origin('https://你的跨域域名.com', () => { // 在跨域页面里获取目标值,比如某个元素的文本或输入框内容 const targetValue = document.querySelector('#user-name').textContent; // 关键:return这个值,让cy.origin()把它yield出来 return targetValue; }).then(originResult => { // 这里就能拿到origin返回的值了 capturedValue = originResult; cy.log(`从跨域页面拿到的值:${capturedValue}`); // 也可以直接在这里做断言或后续操作 expect(capturedValue).to.equal('预期的用户名'); }); // 如果要在后续命令里用,必须放在cy.then()或其他异步命令里 cy.then(() => { expect(capturedValue).to.not.be.undefined; // 这里可以继续用capturedValue做其他测试逻辑 });
方法二:用Cypress.env()存储值
如果需要在整个测试用例甚至多个用例里复用这个值,可以把它存在Cypress的环境变量里,这样任何地方都能访问到:
示例代码:
cy.origin('https://你的跨域域名.com', () => { const inputValue = Cypress.$('#search-input').val(); return inputValue; }).then(originValue => { // 把值存入环境变量 Cypress.env('originSearchValue', originValue); }); // 后续在任意位置获取 cy.then(() => { const storedValue = Cypress.env('originSearchValue'); expect(storedValue).to.include('测试关键词'); });
避坑提醒:别犯这个同步赋值的错误
很多人一开始会这么写,结果必然得到undefined:
// ❌ 错误写法!同步变量赋值赶不上异步命令的执行 let wrongValue; cy.origin('https://你的跨域域名.com', () => { wrongValue = Cypress.$('#user-name').textContent; }); cy.log(wrongValue); // 这里会打印undefined!
原因很简单:Cypress的命令是按队列异步执行的,cy.log()会在cy.origin()完成之前就运行了,此时wrongValue还没被赋值。
总之核心思路就是:利用Cypress的异步命令链,通过.then()捕获cy.origin()返回的值,在异步上下文里使用它,别试图同步获取异步命令的结果~
备注:内容来源于stack exchange,提问作者aldrine00
相关产品推荐
相关产品推荐

