请帮我想办法只计算非空表行。我尝试使用它:
cy.get("#TableId")
.find("tr")
.then((rows) => {
rows.toArray().forEach((element) => {
if (element.innerHTML.should('be.not.empty')) {
//rows.index(element) will give you the row index
cy.log(rows.index(element));
}
});
});
但是它抛出一个错误
这取决于你的目标。
这里有一个使用各种表达方式的实验,你可以选择一个适合你要求的。
不要忘记将
tbody
添加到表格选择器,因为您要排除标题行。
测试 HTML
<table>
<tbody>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><span></span></td>
<td></td>
</tr>
<tr>
<td>some-text</td>
<td></td>
</tr>
<tr>
<td>some-text</td>
<td>another-text</td>
</tr>
</tbody>
</table>
测试代码
cy.get('table tbody tr')
.each((tr, index) => {
console.group('row', index, tr.html().replaceAll('\n', ''))
const expressions = [
"tr.html()",
"tr[0].innerHTML",
"tr.find('td').toArray().map(td => td.innerHTML).join('')",
"tr.text()",
"tr.text().trim().replaceAll('\\n', '')",
]
const results = expressions.reduce((acc,e) => {
acc[e] = eval(e)
return acc
}, {})
console.table(results)
console.groupEnd()
})
输出
.should()
和 .includes()
是赛普拉斯验证函数,不应用于确定分支。相反,您可以直接检查 innerText 的.length
以确定您的代码路径。 (Chai 的 .empty
断言,当在 String 上运行时,检查变量的长度是否为 0)
cy.get("#TableId")
.find("tr")
.then((rows) => {
rows.toArray().forEach((element) => {
if (element.innerHTML.length !== 0) { // may need to use `element.text()` instead of `element.innerHTML`
cy.log(rows.index(element));
}
});
});