如何将调用重定向到赛普拉斯中的顶部对象?



在我的应用程序代码中,有很多对"top 对象"的调用(如 100+(引用 window.top,例如top.$("title")等。现在,我在使用 Cypress 执行端到端测试时遇到了问题。尝试登录应用程序时,有一些调用top.$(...)但 DevTools 显示Uncaught TypeError: top.$ is not a function。这导致我和我的团队发现我们的应用程序试图达到的"顶部"是赛普拉斯环境本身。

来这里之前我尝试过的事情是:

1( 尝试使用引用我们应用程序的窗口对象存根 window.top。这导致我们被告知 window.top 是一个只读对象。

2(研究Cypress是否有某种配置,可以巧妙地将调用重定向到我们代码中的顶部,成为我们应用程序中最顶层的环境。我们认为我们可能不是唯一遇到此问题的人。

如果有文章,我找不到,所以我来问是否有办法做到这一点,或者是否有人知道替代解决方案?

我们考虑的另一个解决方案是:研究命名窗口对象,以便我们可以按名称而不是"窗口"或"顶部"引用它们。如果没有办法通过赛普拉斯完成我想要做的事情,我认为我们愿意这样做作为最后的手段,但希望我们不必改变这一点,因为我们不确定它会预先分解多少应用程序。

@Mikkel 不太确定我可以提供什么代码才有用,但这是导致 Cypress 抛出未捕获异常的代码

if (sample_condition) {
top.$('title').text(...).find('content') // Our iframe
} else {
top.$('title').text(page_title)
}

在我们的代码中还有更多实例可以访问顶部对象,但它们通常是相似的。我们发现问题的根本原因是,在赛普拉斯中,对"top"的调用实际上与赛普拉斯交互,而不是我们的应用程序的预期环境。

这可能不是对您的问题的直接回答,它只是扩展了您对有关我用于将信息从一个脚本传递到另一个脚本的技术的更多信息的请求。我试图在同一个脚本中执行此操作但没有成功 - 主要是因为.then()的异步性质阻止了它的工作。

在这个片段中,我从sessionStorage中读取了几个id,并将它们保存到json文件中。

//
// At this point the cart is set up, and in sessionStorage
// So we save the details to a fixtures file, which is read
// by another test script (e2e-purchase.js)
//
cy.window().then(window => {
const contents = {
memberId: window.sessionStorage.getItem('memberId'),
cartId: window.sessionStorage.getItem('mycart')
}
cy.writeFile(`tests/cypress/fixtures/cart.json`, contents)
})

在另一个脚本中,它将文件加载为固定装置(fixtures/cart.json(以拉入几个id。

cy.fixture(`cart`).then(cart  => {
cy.visit(`/${cart.memberId}/${cart.cartId}`)
})    

相关内容

最新更新