[Playwright][12] 踩坑记录:为什么 locator.count() 不会自动等待
在 HPC Dashboard 的 Job 自动化测试中我需要验证日期筛选前后的 Job 数量。在测试中我发现locator.count() 只会获取当前页面上的元素数量。如果页面数据还没加载出来可能返回 0。而 toHaveCount() 会在一定时间内反复检查元素数量直到符合预期或超时。1. locator.count() 为什么可能返回 0例如constjobIdspage.getByText(/^Job ID:/);constcountawaitjobIds.count();expect(count).toBeGreaterThan(0);count()会立即查询当前匹配的元素数量。如果 Job 列表还在异步加载即使稍后会显示多个 Job此时也可能返回0。需要注意Playwright 的自动等待机制并不适用于所有 Locator 方法。count()不会为了等待元素出现而自动重试。2. 实际项目中的处理方式在 Job Explorer 的日期筛选测试中我采用了以下写法constjobIdspage.getByText(/^Job ID:/);awaitexpect(jobIds.first()).toBeVisible();constoriginalCountawaitjobIds.count();expect(originalCount).toBeGreaterThan(0);先通过toBeVisible()等待第一个 Job 出现再获取当前数量。之后修改日期范围使用toHaveCount()验证筛选结果awaitstartDate.fill(2025-10-01);awaitendDate.fill(2025-10-02);awaitexpect(jobIds).toHaveCount(0);toHaveCount(0)会自动反复重试直到页面中的 Job 数量变为 0或者等待超时。3. count() 和 toHaveCount() 的区别方法自动重试适用场景locator.count()否获取当前元素数量expect(locator).toHaveCount(n)是验证异步更新后的元素数量expect(locator).toBeVisible()是等待目标元素可见还有一个细节等待第一个 Job 可见并不代表整个列表已经加载完成。如果测试依赖精确的初始总数最好等待明确的加载完成状态。4. 总结这次实践让我认识到Playwright 的 Locator 方法和自动重试断言并不是一回事。对于异步加载或动态更新的页面应该优先使用expect()提供的自动重试断言而不是通过固定等待时间或立即读取数量来判断页面状态。