主要目标是访问输入字段并提交一些数据。 问题 - 这些元素位于一个 iframe 中(我们不能添加任何属性,如 id 等),它被包装到另一个 iframe 中(我能够通过 id 访问它)。 可以使用
cy.frameLoaded('#3ds-iframe');
访问顶部 iframe
无法使用 cy.frameLoaded('#cko-3ds2-iframe');
或 cy.frameLoaded('[name="cko-3ds2-iframe"]')
访问下部 iframe
提前致谢
这是我发现的一种适用于嵌套 iframe 的方法,至少适用于非常简单的 HTML。
使用
.enter()
(属于 cypress-iframe
包的一部分),移动到第一个 iframe 内。
使用同一包中的
getBody()
助手,定位第二个 iframe。
使用传统的 Cypress 命令(来自在 Cypress 中使用 iframe)来提取嵌套 iframe 的主体。
.within()
将下一个命令集中在第二个 iframe 内。
cy.enter('#iframe1').then(getBody => {
getBody().find('#iframe2')
.its('0.contentDocument')
.its('body').within(() => {
// working inside nested iframe
cy.get('div').should('contain', 'Inside iframe2')
})
})
如果第二个 iframe 的加载时间比外部 iframe 的加载时间长,则可能需要额外的步骤。 cypress-iframe
命令仅检查外帧的内容,但希望内帧在该时间段内也准备就绪。
<iframe id="iframe1" width="300" height="200" src="./iframe2.html">
#document
<html>
<head></head>
<body>
<iframe id="iframe2" width="300" height="200" src="./iframe-content.html">
#document
<html>
<head></head>
<body>
<div>Inside iframe2</div>
</body>
</html>
</iframe>
</body>
</html>
</iframe>