如何获取Cypress.Chainable<JQuery<HTMLElement>>中的指定元素
问题解答
是否支持直接下标取值?
不存在类似const a = TransactionsPage.tableRows[0]的同步下标取值方法。
原因是TransactionsPage.tableRows的返回值Cypress.Chainable<JQuery<HTMLElement>>是异步链式对象,不是同步可访问的DOM元素数组/类数组对象。同步代码执行时,Cypress还没完成DOM查询、等待的异步流程,根本拿不到实际的元素集合,自然无法通过下标直接取值。
获取指定位置元素的最优方案
不需要遍历元素,直接使用Cypress内置的.eq()方法即可,这是官方提供的按索引提取集合内元素的原生API,性能最优、写法最简洁,且自动继承Cypress的元素等待、重试机制,不会出现时序问题。.eq()方法传入的索引从0开始计数,支持传入负数代表从集合末尾反向计数。
代码示例
- 获取第1个元素(和你当前使用的
.first()效果完全一致):
TransactionsPage.tableRows.eq(0).click();
- 获取第N个元素(例如下标为2的第三个元素):
TransactionsPage.tableRows.eq(2).click();
- 获取最后1个元素:
TransactionsPage.tableRows.eq(-1).click();
如果你确实需要把指定位置的元素存到变量中使用,也不能用同步赋值的写法,必须在.then()回调中接收resolve后的元素对象:
TransactionsPage.tableRows.eq(0).then($targetRow => { const a = $targetRow; // 所有使用变量a的逻辑都需要写在这个回调作用域内 a.click(); });
注意:不要为了同步拿元素去用
async/await或者硬写固定等待时间,会破坏Cypress本身的重试等待逻辑,提升用例的不稳定性。
内容的提问来源于stack exchange,提问作者bobby bobby
相关产品推荐
相关产品推荐

