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(); });
关键调整说明
等待 gremlins 执行完成:
gremlins 的unleash是异步执行的,默认不会返回 Promise,所以我们手动用 Promise 包裹,监听 horde 的stop事件来标记执行结束,同时通过setTimeout限制集群运行时长,避免无限执行导致超时。正确捕获页面错误:
用变量pageError存储捕获到的页面错误,最后断言该变量为 null,替代原代码中错误的expect(page).not.toThrow()写法。提前注册错误监听:
把page.on('pageerror')放在页面跳转前,确保能捕获页面加载过程和 gremlins 执行期间的所有未处理异常。
内容的提问来源于stack exchange,提问作者skellig
相关产品推荐
相关产品推荐

