Artillery+Playwright压测:页面报错后如何继续执行后续流程?
Playwright压测中单个Flow失败导致Artillery终止的处理方案
问题描述
使用Playwright结合Artillery进行压测时,配置了abcWorkflow和defWorkflow两个flowFunction,但当第一个flow(如abcWorkflow)出现Playwright TimeoutError等错误时,整个Artillery运行会立即终止。需要实现页面操作失败后,继续执行下一个flowFunction或下一个worker。
现有配置文件(artillery.yml)
config: processor: "./processor.ts" engines: playwright: { launchOptions: { headless: true }, contextOptions: { ignoreHTTPSErrors: true }, } environments: dev: target: "mywebsite" phases: - duration: 5min arrivalRate: 1 maxVusers: 1 name: "testing" scenarios: - engine: playwright name: ABC-Workflow flowFunction: "abcWorkflow" - engine: playwright name: DEF-Workflow flowFunction: "defWorkflow"
现有处理器文件(processor.ts)
import { Page } from 'playwright'; import { BEP, FEP } from '@pages'; import { request } from '@playwright/test'; export async function abcWorkflow(page: Page, vuContext: any, events: any, test: any, next: any): Promise<void> { const bepLoginPage = new BEP.LoginPage(page); await bepLoginPage.loginAs('User1'); await bepLoginPage.doAbcStff(); } export async function defWorkflow(page: Page, vuContext: any, events: any, test: any, next: any): Promise<void> { const bepLoginPage = new BEP.LoginPage(page); await bepLoginPage.loginAs('User1'); await bepLoginPage.doDefStff(); }
解决方案
1. 在Flow函数中添加异常捕获与处理
最直接有效的方式是在每个flowFunction中用try/catch捕获所有可能的异常,确保单个步骤失败不会终止整个进程,同时通过next()方法触发后续流程执行。
修改后的processor.ts示例:
import { Page } from 'playwright'; import { BEP, FEP } from '@pages'; import { request } from '@playwright/test'; export async function abcWorkflow(page: Page, vuContext: any, events: any, test: any, next: any): Promise<void> { try { const bepLoginPage = new BEP.LoginPage(page); await bepLoginPage.loginAs('User1'); await bepLoginPage.doAbcStff(); } catch (error) { // 记录错误信息,可根据需求扩展日志逻辑 console.error('[ABC-Workflow 执行失败]', error); // 也可通过events事件上报错误到Artillery统计 events.emit('error', { message: 'ABC-Workflow failed', error }); } finally { // 无论成功或失败,都调用next()确保流程继续执行 next(); } } export async function defWorkflow(page: Page, vuContext: any, events: any, test: any, next: any): Promise<void> { try { const bepLoginPage = new BEP.LoginPage(page); await bepLoginPage.loginAs('User1'); await bepLoginPage.doDefStff(); } catch (error) { console.error('[DEF-Workflow 执行失败]', error); events.emit('error', { message: 'DEF-Workflow failed', error }); } finally { next(); } }
2. 调整Artillery配置增强容错性
在Artillery的配置文件中,针对Playwright引擎添加容错相关配置,进一步避免进程终止:
- 在
engines.playwright下添加exitOnError: false,阻止单个错误终止整个测试 - 如需调试可启用
disableErrorReporting,生产压测建议保留错误上报以便分析
示例配置调整:
engines: playwright: { launchOptions: { headless: true }, contextOptions: { ignoreHTTPSErrors: true }, exitOnError: false # 阻止单个错误终止测试 }
3. 确保Worker上下文隔离
Playwright引擎默认会为每个虚拟用户(VU)创建独立的浏览器上下文,确保单个VU的错误不会影响其他VU的运行。如果遇到跨VU影响的情况,可在flowFunction中显式重置页面状态(如await page.goto('/')),避免上下文污染。
内容的提问来源于stack exchange,提问作者Fenixs
相关产品推荐
相关产品推荐

