typescript 在TS中查找用于Assert对话框消息的Web-FirstAssert

vc9ivgsu  于 2023-04-22  发布在  TypeScript
关注(0)|答案(3)|浏览(108)

现在在Playwright中,我们有一个expect assertions的列表,它可以重试,直到达到超时限制。现在在这个列表中,我找不到任何可以Assert文本的东西。
这是我的测试:

page.on('dialog', async (dialog) => {
  expect(dialog.message()).toContain('I am a JS Alert')
  await dialog.accept()
})
await page.locator('text=Click for JS Alert').click()

我希望用一些可以重试的东西来替换这个expect(dialog.message()).toContain('I am a JS Alert'),直到超时。

hsvhsicv

hsvhsicv1#

如果您期望定位器,则单个Assert有一个超时:

await expect(page.locator(selector)).toHaveText('Sign in', { timeout: 10000 });

你也可以在全局级别设置期望超时。

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

const config: PlaywrightTestConfig = {
  expect: {
    timeout: 10 * 1000,
  },
};
export default config;

如果使用对话框和方法,则没有超时,因为dialog.message()返回纯字符串,因为它侦听对话框事件。
据我所知,你能做的最好的就是用try catch,或者while循环,直到对话框消息继续所需的消息(用watchDog)。

nmpmafwu

nmpmafwu2#

最新版本的playwright 1.21允许你这样做:
新方法expect.poll等待任意条件:

// Poll the method until it returns an expected result.
await expect.poll(async () => {
  const response = await page.request.get('https://api.example.com');
  return response.status();
}).toBe(200);

poll支持大多数同步匹配器,如.toBe()、.toContain()等。

5jdjgkvh

5jdjgkvh3#

有几种方法可以做到这一点,这取决于你的需要。
假设你一次只弹出一个对话框,你可以使用一个promised对话框处理程序并重试:

import {expect, test} from "@playwright/test"; // ^1.30.0

// Warning: doesn't have a timeout (relies on test timeout)
const acceptNextDialog = page =>
  new Promise(resolve =>
    page.once("dialog", async dialog => {
      await dialog.accept();
      resolve(await dialog.message());
    })
  );

test.beforeEach(async ({page}) => {
  await page.setContent(`
<button>Click to generate random number from 0 to 9 inclusive</button>
<script>
document.querySelector("button").addEventListener("click", e => {
  alert(~~(Math.random() * 10));
});
</script>
  `);
});

test("eventually shows '1' in the dialog", async ({page}) => {
  await expect(async () => {
    const message = acceptNextDialog(page);
    await page.getByRole("button").click();
    expect(await message).toBe("1");
  }).toPass({timeout: 20_000});
});

测试中的示例页面有一个按钮,它触发一个对话框,对话框中显示一个从0到9的随机数。我们Assert最终对话框显示数字"1"
更改测试以检查文本"asdf",您将看到它如预期的那样失败。
轮询也是可能的,并且可能比重试更精确:

await expect.poll(async () => {
  const message = acceptNextDialog(page);
  await page.getByRole("button").click();
  return message;
}).toBe("1");

相关问题