You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright获取Div内链接并行检查200状态码报错及实现方法

Playwright实现批量链接状态检查及报错解决

能否实现需求?

完全可以通过Playwright实现你的需求:提取页面链接、并行检查HTTP状态码200。

当前报错原因

你遇到的Error: Playwright Test did not expect test() to be called here,是因为在一个test()内部嵌套调用了另一个test()。Playwright的测试规则明确要求:test()只能在describe块的顶层或文件顶层定义,不允许在测试用例内部动态创建子测试。

解决方法及修正代码

以下提供两种符合要求的实现方案,均支持并行检查:

方案一:单个测试内并行请求(轻量高效)

这种方案在一个测试用例里,通过Promise.all并行发起所有链接的HTTP请求,不需要创建多个测试用例,适合快速批量验证:

const { test, expect } = require('@playwright/test');

test.describe(`@Header Tests`, () => {
  test(`@smoke Validate all header links give a status of 200`, async ({ page, context }) => {
    // 访问目标页面
    await page.goto(".....some url.....");

    // 提取所有有效a标签链接
    const elements = page.locator("section#mega-nav a");
    const links = await elements.evaluateAll((items) =>
      items
        .map(item => item.href)
        .filter(href => href && !href.includes("javascript:"))
    );

    // 并行发起所有链接的HTTP请求(用context.request.get更轻量,无需加载页面)
    const checkResults = await Promise.all(
      links.map(async (link) => {
        const response = await context.request.get(link);
        return { link, statusCode: response.status() };
      })
    );

    // 逐个验证状态码是否为200
    checkResults.forEach(({ link, statusCode }) => {
      expect(statusCode, `链接 ${link} 返回状态码 ${statusCode}`).toBe(200);
    });
  });
});

方案二:动态生成独立测试用例(Playwright自动并行)

这种方案会为每个链接生成独立的测试用例,Playwright默认会并行执行这些测试,适合需要单独查看每个链接测试结果的场景:

const { test, expect } = require('@playwright/test');

test.describe(`@Header Tests`, () => {
  let validLinks = [];

  // 在所有测试前一次性提取链接
  test.beforeAll(async ({ page }) => {
    await page.goto(".....some url.....");
    const elements = page.locator("section#mega-nav a");
    validLinks = await elements.evaluateAll((items) =>
      items
        .map(item => item.href)
        .filter(href => href && !href.includes("javascript:"))
    );
  });

  // 在describe顶层动态生成每个链接的测试用例
  for (const link of validLinks) {
    test(`@smoke 检查链接状态码:${link}`, async ({ context }) => {
      const response = await context.request.get(link);
      expect(response.status()).toBe(200);
    });
  }
});

关键优化点

  • 用context.request.get替代page.goto:前者仅发送HTTP请求获取响应,不需要渲染页面,比后者效率高很多,适合批量状态检查场景。
  • 并行执行:两种方案都避免了串行循环的低效问题,方案一通过Promise.all并行请求,方案二利用Playwright的测试并行机制自动执行。

内容的提问来源于stack exchange,提问作者theprogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:49:57