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

Playwright结合gremlins.js做模糊测试遇超时问题求助

Playwright 结合 gremlins.js 模糊测试问题解决

你的核心问题出在两个地方:gremlins.js 的异步执行没被正确等待,以及页面错误的捕获和测试断言逻辑不对。原代码里 page.evaluate 调用 unleash 后会立即返回,Playwright 没等到 gremlins 集群执行完毕就开始后续操作,最终导致超时;同时 expect(page).not.toThrow() 的写法完全错误,page 对象本身不会抛出页面内的运行时错误。

修复后的测试代码

import { test, expect } from '@playwright/test';

const url = 'http://localhost:7002';
// const url = 'https://demo.playwright.dev/todomvc/#/';

test('fuzz monkey test', async ({ page }) => {
  // 初始化错误容器,用来捕获页面错误
  let pageError = null;

  // 提前注册页面错误监听,确保不会遗漏任何错误
  page.on('pageerror', (err) => {
    pageError = err;
  });

  // 注入 gremlins.js
  await page.addInitScript({
    path: './node_modules/gremlins.js/dist/gremlins.min.js',
  });

  await page.goto(url);

  // 执行 gremlins 集群,并等待其执行完成
  await page.evaluate(() => {
    return new Promise((resolve) => {
      const horde = gremlins.createHorde();
      // 设置集群运行时长(比如10秒,可根据需求调整)
      setTimeout(() => {
        horde.stop();
      }, 10000);
      // 当集群停止时,resolve Promise
      horde.on('stop', resolve);
      horde.unleash();
    });
  });

  // 断言页面未出现错误
  expect(pageError).toBeNull();
});

关键调整说明

  1. 等待 gremlins 执行完成:
    gremlins 的 unleash 是异步执行的,默认不会返回 Promise,所以我们手动用 Promise 包裹,监听 horde 的 stop 事件来标记执行结束,同时通过 setTimeout 限制集群运行时长,避免无限执行导致超时。

  2. 正确捕获页面错误:
    用变量 pageError 存储捕获到的页面错误,最后断言该变量为 null,替代原代码中错误的 expect(page).not.toThrow() 写法。

  3. 提前注册错误监听:
    把 page.on('pageerror') 放在页面跳转前,确保能捕获页面加载过程和 gremlins 执行期间的所有未处理异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:04:51