我最近开始了一个新的任务,使用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。