剧作家脚本在循环元素时超时

Playwright script timing out when looping through elements

我收到一个错误:Timeout of 30000ms exceeded.

我如何与剧作家合作才不会超时?如果可能的话,我不想增加超时时间。代码循环遍历 <a href 的大列表,确保没有死的 link 和其他不需要的内容。它按预期工作,只是在 link 检查的前 30 秒后它崩溃了。我只能检查前 15 links 左右。

 --snip--
 test("Test all links do not 404", async ({ page }) => {
   const genericTests = new GenericTests(page);
   //await page.setDefaultTimeout( 1000 * 60 * 5 );  (changing the timeout here did not work)
   await genericTests.testAllLinks()
 });
export class GenericTests {
   --snip--
   async testAllLinks() {
      let context = await this.page.context();
      //await context.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
      let allLinks = this.page.locator("a[href]");
      let allLinksCount = await allLinks.count();
      for(var i=0; i<allLinksCount; i++) {
        let nthLink = await this.allLinks.nth(i);
        //snip logic to verify the link, deal with duplicates etc..
        let [newPage] = await Promise.all([
            context.waitForEvent("page"),
            nthLink.click({"modifiers": ["Control"], "force": true})
        ]);
        //await newPage.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
        await newPage.waitForLoadState();
        await newPage.bringToFront();
        const page404 = new Page404(newPage);
        page404.testPageForVariousProblems();
        //snip logic to check for 404s
      }
   }
}

这里有两个超时.. 示例中显示的超时不相关,因为每个浏览器实例和每个导航都在快速执行并且没有超时,整体测试和整体测试套件超时。

有一个可以在第一个代码块中更改的每次测试超时:

test("Test all links do not 404", async ({ page }) => {
    test.setTimeout(0);  //  <-- here
    --snip--

这也可以全局更改(见下文),但对于这种特殊情况,这最有意义。

并且 playwright.config.ts 中的所有测试都有一个全局设置:

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

const config: PlaywrightTestConfig = {
     timeout: 30000 
    ,globalTimeout: 600000 // <-- entire test suite
    --snip--
};
export default config;

代码执行良好,无需额外说明代码“按预期工作”以及问题中所述。

通常情况下,添加额外的超时时间并不是一个好主意,测试应该在 30 秒内完成。但对我有用的是 -

test.describe('Failover tool', async () => {
    test('my pet test', async ({ failoverClusterUpdatesPage }) => {
        test.setTimeout(0);
        await whateverTest();
    });
});

在超时中传递 0 将覆盖现有的 30 秒限制并将其设置为无限期。