Cypress如何在.then()块外取值实现随机选择搜索结果
Cypress实现随机选择搜索结果条目
你的问题核心是没搞懂Cypress的异步执行机制——所有cy.*命令都是异步加入队列执行的,同步代码会先跑,所以在.then()外面根本拿不到异步获取的元素数量或集合。另外代码里还有个小错误:invoke('val')是用来取表单元素的value值的,a标签没有这个属性,这么写拿不到有效数据。
直接把所有依赖搜索结果的操作放在同一个.then()回调里就能解决,完整代码如下:
// 先获取所有搜索结果的a标签元素 cy.get(this.SEARCH_RESULT + ' > a').then($elements => { const resultCount = $elements.length; cy.log(`Found ${resultCount} results for search term: ${searchTerm}`); // 生成0到结果数-1之间的随机索引 const randomIndex = Math.floor(Math.random() * resultCount); // 点击随机选中的条目 $elements.eq(randomIndex).click(); });
如果一定要用别名存储元素集合,也可以这么写:
// 给搜索结果元素集合设置别名 cy.get(this.SEARCH_RESULT + ' > a').as('searchResults'); // 通过别名获取元素并处理 cy.get('@searchResults').then($elements => { const resultCount = $elements.length; const randomIndex = Math.floor(Math.random() * resultCount); $elements.eq(randomIndex).click(); });
之所以之前的写法失效,是因为:
- 同步声明的
let countOfElements在.then()执行前就已经被读取了,此时还没拿到真实的结果数量 cy.get('@searchEntries')是异步命令,不能直接作为参数传给同步的getRandomNumberBetweenTwoValues函数,必须在.then()里等待它执行完成后再用结果
内容的提问来源于stack exchange,提问作者Stefanie Uhl
相关产品推荐
相关产品推荐

