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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:43:15