【发布时间】:2021-09-29 13:47:20
【问题描述】:
我正在对元素列表(HTML 表格)编写一组测试。
由于测试仍在进行中,我收到了很多垃圾数据,我想在每次运行前清理这些数据。
所以,我正在尝试删除 before() 挂钩中的所有行。我想删除的过程应该是:
- 按名称搜索产品
- 点击第一行中的删除图标
- 等待确认对话框
- 点击“是”
- 从步骤
2重复,直到没有剩余行
这是迄今为止我在输入搜索输入后调用的函数:
function deleteAllFoundProducts() {
cy.get('tbody tr').then(rows => {
if (rows.length < 1) return // if no rows remain, terminate recursion
cy.get('span[title="Delete"]', {timeout: 10000}).first().click()
cy.get('.tBtn[title="Yes"]').click().then(() => {
cy.get('.loader', {timeout: 10000}).should('not.exist') // wait for list to reappear
deleteAllFoundProducts() // try again
})
})
}
问题是——即使在删除最后一行后,该函数仍继续运行,并且由于没有 span[title="Delete"] 而出错。
[编辑]
仔细检查后,我发现一张空表仍然只有一行 - 带有 No records found 文本。我以为这根本不是一个行。因此,错误是由不包含删除图标的行引起的。我应该早点注意到的。
这是删除了不必要的 Angular 内容的相关 HTML:
<tbody class="p-element p-datatable-tbody" ng-reflect-value="" ng-reflect-template="[object Object]">
<tr>
<td colspan="6">
<my-loader ng-reflect-loading="false">
</my-loader>
<div class="p-2">No matching records found. </div>
</td>
</tr>
</tbody>
我想,解决方案是检查该行是否包含带有文本“未找到记录”的元素,如果不包含则执行删除。但我不知道该怎么做。任何帮助仍将不胜感激。
【问题讨论】:
-
你能分享一下你的表格的 HTML 吗?
-
您是否考虑过从后端删除数据(假设您正在使用一个)?即通过公开一个删除数据的端点,然后在赛普拉斯生命周期挂钩中调用该端点。这样你就可以让你的测试用例相对简单。
标签: javascript cypress