Cypress嵌套.within与.then时删除子行的测试问题
解决EditParentAndChildren页面的Cypress测试上下文问题
核心问题
编写测试时,因使用.within()进入子行上下文后无法跳出,导致无法定位页面提交按钮;同时子行删除后无法通过root().closest()恢复上层上下文,且难以正确存储父级/子级文本用于后续断言。
测试代码实现
// 1. 导航至目标页面 cy.visit('/edit-parent-and-children') // 2. 记录父级名称(存为Cypress别名) cy.get('.parent-name-selector') // 替换为实际父级名称元素选择器 .invoke('text') .as('parentName') // 3. 选择首个子行,记录名称并执行删除 cy.get('.child-row-selector') // 替换为实际子行元素选择器 .first() .then($childRow => { // 4. 记录子行名称(存为Cypress别名) const childName = $childRow.find('.child-name-selector').text() // 替换为实际子级名称选择器 cy.wrap(childName).as('childName') // 5. 点击该行删除按钮 $childRow.find('.delete-btn-selector').click() // 替换为实际删除按钮选择器 }) // 6. 保存修改(直接从全局上下文定位提交按钮,无需进入子行上下文) cy.get('.save-btn-selector').click() // 替换为实际保存按钮选择器 // 7. 导航至查看页面 cy.visit('/view-parent-and-children') // 替换为实际查看页面路由 // 8. 验证父级存在、已删除子级不存在 cy.get('@parentName').then(parentName => { cy.get('.view-page-parent-selector').should('contain', parentName) // 替换为查看页面父级元素选择器 }) cy.get('@childName').then(childName => { cy.get('.view-page-children-container').should('not.contain', childName) // 替换为查看页面子级列表容器选择器 })
关键优化点
- 避免
.within()上下文陷阱:直接通过.then()获取子行DOM元素,操作删除后自动回到全局上下文,无需额外跳出操作。 - 正确存储文本到别名:使用
cy.invoke('text')结合.as()存储父级名称,通过cy.wrap().as()存储子级名称,符合Cypress命令链规则,可在后续断言中调用。 - 全局上下文定位提交按钮:删除子行后直接从全局上下文查找保存按钮,无需依赖已删除的子行DOM结构。
内容的提问来源于stack exchange,提问作者Ron Newcomb
相关产品推荐
相关产品推荐

