柏树和应用程序使用window.top



我最近开始了一个新的任务,使用cypress编写e2e测试,但是…应用程序是基于iframe(我可以处理),但我的问题是它也使用了大量(我的意思是大量)的top.someFunction()。

那些top. somefunction()从top开始干扰cypress。被认为是柏树窗口,我以top.someFunction() is not a function这样的错误结束。

从开发人员的角度来看,大规模的重构似乎不是一个选择…我已经花了很多时间试图找到一种方法来让它工作,但我开始怀疑我们是否应该使用另一种自动化工具,但我真的想使用cypress…

我迷路了。

你有什么建议吗?

您可能只需要将调用包装在.then()中以使它们在命令链上执行。

在一个简单的测试使用这个HTML我可以调用top.someFunction内链

<script>
top.someFunction = () => 'someFunction called'
</script>
it('calls top.someFunction', () => {
cy.visit('html/top.html');
const result = top.someFunction() // fails with "top.someFunction is not a function"
// runs too soon - visit not yet executed

cy.then(() => {                    // put the call on the Cypress queue 
// to get the timing right
const result = top.someFunction()
expect(result).to.eq('someFunction called')     // passes
})
})

我遇到了这个答案,寻找如何使window.top.postMessage在柏树中正确工作。对我来说,解决方案就是简单地使用window.parent.postMessage。在我们的例子中,我们只关心向承载iframe的窗口发布消息,而不关心它向最顶层的窗口发布消息。

当不使用Cypress时,最上面的窗口是我们应用程序的窗口。当使用Cypress时,最上面的窗口为Cypress。

最新更新