NodeJS 剧作家如何等待匹配多个元素的定位器不可见

db2dz4w8  于 2023-03-29  发布在  Node.js
关注(0)|答案(3)|浏览(107)

我试图等待一个元素,表明一个页面仍在加载,并存在于页面上多次,不可见(想想表与加载数据占位符)。
Playwright文档建议使用Locators是最佳实践,因此我最初尝试通过执行以下操作来实现这一点:

locator.waitFor({state: "hidden")

然而,由于定位器是严格的,并且只允许匹配一个元素而导致的错误。
我现在用下面的代码来做:

page.waitForSelector(".foo .bar", {state: "hidden"})

这是不理想的,有几个原因:

  • 我将页面元素作为定位器存储在页面对象模型中,您似乎无法访问定位器的选择器,这意味着选择器在代码中是重复的
  • 我相信page.waitForSelector会使用一个不推荐的ElementHandle

有什么方法可以关闭Locator的严格性约束吗?或者使用Locator来实现这一点。我知道你可以在Locator上执行.count,它匹配多个元素,但是我还没有找到一个好的方法来将它与等待计数为0结合起来。

ercv8c1e

ercv8c1e1#

我希望它会工作,这段代码将检查下一个元素每次前一个消失

while (await page.locator('.foo .bar').first().isVisible()) { //do nothing }
8ulbf1ek

8ulbf1ek2#

最后我使用evaluateAll方法实现了这个功能。示例代码:

async waitForAllHidden(locator: Locator, timeout: number = 10000) {
    const start = Date.now()
    const elementsVisible = async () => (await locator.evaluateAll(elements => elements.map(element => element.hidden))).includes(false)

    while (await elementsVisible()) {
        if (start + timeout < Date.now()) {
            throw(`Timeout waiting for all elements to be hidden. Locator: ${locator}. Timeout: ${timeout}ms`);
        }
    }
    console.log(`All elements hidden: ${locator}`)
}
llycmphe

llycmphe3#

使用toHaveCount()(添加于:v1.20)

await expect(locator).toHaveCount(0,{timeout:10000});

超时:为了避免无限循环,可以全局配置超时,或者将其作为函数调用中的参数传递。

// playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
  expect: {
    timeout: 10000
  },
});

参考:https://github.com/microsoft/playwright/issues/11988
我怎么能Assert一个元素不在剧作家的页面上?

相关问题