如何通过 Typescript Playwright 中的单个断言来验证相似定位器的列表

问题描述 投票:0回答:2

我有一个定位器数组,我需要运行一个断言来验证它是否包含某些文本。我知道这可以循环完成,但这似乎是一种乏味的方法,我想改进它。

Tedius 方法:

  let textIsPresent : boolean = false;

  for (let entry of arrayOfLocators) {
    if(arrayOfLocators[entry].innerText().toContain("myText")){
       textIsPresent = true;
       break;
    }
  }

  expect(textIsPresent).toBe(true)

有更好的方法吗?例如,使用匿名函数甚至内置智能函数?我不太擅长 Javascript/Typescript,希望得到任何支持。谢谢你

javascript typescript automation e2e-testing playwright
2个回答
0
投票
await expect(locator).toHaveText(['Text 1', 'Text 2', 'Text 3']);

注意:如果您传递一个数组作为期望值,则期望为:

  • 定位器解析为元素列表。
  • 元素的数量等于数组中期望值的数量。
  • 列表中的元素具有与预期数组值匹配的文本,按顺序一一匹配。

例如,考虑以下列表:

<ul>
  <li>Text 1</li>
  <li>Text 2</li>
  <li>Text 3</li>
</ul>

让我们看看如何使用断言:

// ✓ Has the right items in the right order
await expect(page.locator('ul > li')).toHaveText(['Text 1', 'Text 2', 'Text 3']);

// ✖ Wrong order
await expect(page.locator('ul > li')).toHaveText(['Text 3', 'Text 2', 'Text 1']);

// ✖ Last item does not match
await expect(page.locator('ul > li')).toHaveText(['Text 1', 'Text 2', 'Text']);

// ✖ Locator points to the outer list element, not to the list items
await expect(page.locator('ul')).toHaveText(['Text 1', 'Text 2', 'Text 3']);

希望这有帮助!


0
投票

这是一种安全的方法,与剧作家的网络优先断言方法一致。

const keyword = 'for'

await expect(async () => {
  const items = await page.locator('div.listItems');
  items.forEach(item => {
    expect(item, `list item should contain '${keyword}'`).toContain(keyword);
  });
}
).toPass({ timeout: 5000 });

使用这种方法,await Expect(async () =>块内的函数将被轮询并重试最多 5 秒,直到它通过或超时失败。

© www.soinside.com 2019 - 2024. All rights reserved.