Cypress测试iframe内链接点击时stub window.open调用超时问题
报错核心原因
触发超时的两个核心问题:
- 你当前stub的是测试主页面的顶层
window对象,iframe属于独立的浏览上下文,有自己专属的window实例,父页面注入的stub逻辑不会生效到iframe内部,根本拦不到iframe里触发的操作 - 普通带href属性的
<a>标签,只要没设置target="_blank",点击默认是直接修改当前上下文的location.href完成跳转,根本不会调用window.open方法,你从一开始就stub错了拦截目标
对应修复方法
根据a标签的实际跳转逻辑选对应写法就行:
标签带target="_blank"、点击会新开标签页的场景
这种场景才需要拦截window.open,注意必须把stub注入到iframe自身的window对象上,不要用顶层页面的window:
// 先获取iframe自身的window对象 cy.getIframeBody().then(iframeBody => { const iframeWindow = iframeBody[0].ownerDocument.defaultView cy.stub(iframeWindow, 'open').as('windowOpen') }) cy.getIframeBody().find('#container a').click() // 直接用stub自带的断言校验传参,不需要额外存值 cy.get('@windowOpen').should('be.calledWith', '你预期的目标URL xyz')
普通同上下文跳转场景(无target属性、或target为_self)
这种场景根本不会触发window.open,别白费力气stub,直接阻止默认跳转后校验href属性即可,稳定性更高:
cy.getIframeBody().find('#container a').as('jumpLink') // 移除target属性、阻止默认跳转,避免iframe跳走导致上下文丢失测试挂掉 cy.get('@jumpLink').invoke('removeAttr', 'target') cy.get('@jumpLink').click() // 直接读取元素href属性做断言,没有时序问题 cy.get('@jumpLink').should('have.attr', 'href', 'xyz')
避坑提醒
不要在stub的callsFake回调里写cy.wrap(url).as('href')这类Cypress命令,Cypress命令是走异步队列执行的,很容易出现别名还没注册就跑到后续断言步骤的时序问题,直接用cy.stub自带的调用参数断言就足够,不需要额外存值绕弯。
内容的提问来源于stack exchange,提问作者user19463335
相关产品推荐
相关产品推荐

