# Reference > Engines > Playwright

# Playwright engine

## Overview

Artillery's Playwright engine is the glue between Artillery & Playwright. The engine takes care of setting up headless browsers, running your Playwright test code, and collecting and emitting performance metrics.

This page provides a reference for all configuration options of Artillery's Playwright integration. You can also learn more about load testing with Playwright in the detailed guide for [using Playwright at scale](/docs/playwright).

## Usage

The Playwright engine is built into Artillery and does not need to be installed separately.

### Create your test definition

Tests can be defined in one of two ways:

* Fully in TypeScript&#x20;
* With a combination of YAML for Artillery configuration, and TypeScript/JS for Playwright code

#### Tab

Create test definition Create a new Artillery test definition in  \`hello-world.ts\` : \`import \{ type Config, type Scenario } from 'artillery';

export const config: Config = \{
&#x20; target: 'https://www.artillery.io',
&#x20; engines: \{
&#x20;   playwright: \{
&#x20;     // Enable Playwright trace recording
&#x20;     // Requires an Artillery Cloud account for viewing traces:
&#x20;     // https://www.artillery.io/docs/get-started/get-artillery#set-up-cloud-reporting
&#x20;     trace: \{
&#x20;       enabled: true
&#x20;     }
&#x20;   }
&#x20; }
};

export const scenarios: Scenario\[]  = \[\{
&#x20; engine: 'playwright',
&#x20; testFunction: helloWorld
}];

async function helloWorld(page) \{
&#x20; await page.goto('https://www.artillery.io/');
&#x20; await page.click('text=Docs');
}\`

#### Tab

Create Artillery config -  \`hello-world.yml\` Create a new Artillery test definition in  \`hello-world.yml\` : \`config:
&#x20; target: https://www.artillery.io
&#x20; \# Load the Playwright engine:
&#x20; engines:
&#x20;   playwright: \{}
&#x20; \# Path to JavaScript file that defines Playwright test functions
&#x20; \# TypeScript is also supported
&#x20; processor: './flows.js'
scenarios:
&#x20; \- engine: playwright
&#x20;   testFunction: helloWorld\` Create a Playwright test function -  \`flows.js\` Create a test function in  \`flows.js\` : \`module.exports = \{ helloWorld };

async function helloWorld(page) \{
&#x20; // The "page" argument is instance of Playwright Page class:
&#x20; // https://playwright.dev/docs/api/class-page/

&#x20; // Go to https://artillery.io/
&#x20; await page.goto('https://www.artillery.io/');
&#x20; // Click text=Docs
&#x20; await page.click('text=Docs');
}\`

### Run your test

#### Tab

\`npx artillery run hello-world.ts\`

#### Tab

\`npx artillery run hello-world.yml\`

Artillery automatically records front-end performance metrics for [perceived load speed](https://web.dev/user-centric-performance-metrics/#types-of-metrics) such as LCP and FCP for different pages navigated to during the test. See [Metrics reported by the engine](#metrics-reported-by-the-engine) for a full list of metrics reported by the Playwright engine.

```
--------------------------------
Summary report @ 11:24:53(+0100)
--------------------------------

vusers.created.total: ....................................... 1
vusers.completed: ........................................... 1
vusers.session_length:
  min: ...................................................... 5911.7
  max: ...................................................... 5911.7
  mean: ..................................................... 5911.7
  median: ................................................... 5944.6
  p95: ...................................................... 5944.6
  p99: ...................................................... 5944.6
browser.page.FCP.https://artillery.io/:
  min: ...................................................... 1521.1
  max: ...................................................... 1521.1
  mean: ..................................................... 1521.1
  median: ................................................... 1525.7
  p95: ...................................................... 1525.7
  p99: ...................................................... 1525.7
browser.page.LCP.https://artillery.io/:
  min: ...................................................... 1521.1
  max: ...................................................... 1521.1
  mean: ..................................................... 1521.1
  median: ................................................... 1525.7
  p95: ...................................................... 1525.7
  p99: ...................................................... 1525.7
browser.page.FCP.https://artillery.io/docs/:
  min: ...................................................... 205.3
  max: ...................................................... 205.3
  mean: ..................................................... 205.3
  median: ................................................... 206.5
  p95: ...................................................... 206.5
  p99: ...................................................... 206.5
browser.page.LCP.https://artillery.io/docs/:
  min: ...................................................... 205.3
  max: ...................................................... 205.3
  median: ................................................... 206.5
  p95: ...................................................... 206.5
  p99: ...................................................... 206.5
```

## Configuration

### Playwright / browser configuration options

| Name                                                            | Valid Options                                                                                                             | Description                                                                                                                                                                                                                                                                        |
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `launchOptions`                                                 | Playwright's [`browserType.launch()`](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) options | Configure the browser instance started by Playwright                                                                                                                                                                                                                               |
| `contextOptions`                                                | Playwright's [`browser.newContext()`](https://playwright.dev/docs/api/class-browser#browser-new-context) options     | Configure browser contexts created for each virtual user                                                                                                                                                                                                                           |
| `defaultNavigationTimeout`                                      | Number (in seconds)                                                                                                       | Shorthand for setting [`setDefaultNavigationTimeout()`](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-navigation-timeout) and [`setDefaultTimeout()`](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-default-timeout) |
| `extendedMetrics`                                               | \`false\`  (default)   \`true\`                                                                     | Report [additional metrics](#extended-metrics).                                                                                                                                                                                                                                    |
| `aggregateByName`                                               | \`false\`  (default)   \`true\`                                                                     | Group metrics by scenario name rather than by URL.                                                                                                                                                                                                                                 |
| `showAllPageMetrics`                                            | \`false\`  (default)   \`true\`                                                                     | Send Web Vital metrics for all pages. By default, Artillery only displays Web Vital metrics for a URL that starts with the `config.target` URL. This avoids reporting metrics for third-party pages and iframes.                                                                   |
| `useSeparateBrowserPerVU`  | \`false\`  (default)   \`true\`                                                                     | Use a separate browser for each virtual user (instead of a new [browser context](https://playwright.dev/docs/browser-contexts)). This will require a lot more CPU and memory and **is not recommended for most tests**.                                                                      |
| `testIdAttribute`          | String                                                                                                                    | The attribute used by locator [`page.getByTestId`](https://playwright.dev/docs/api/class-framelocator#frame-locator-get-by-test-id) in Playwright.                                                                                                               |
| `trace` | Object (see below) | Configuration for recording Playwright Traces |
| `stripQueryString`  | \`false\`  (default)   \`true\` | Remove query strings from page URLs when generating metrics. Useful when query parameters create too many distinct metric names. |
| `normalizeQueryString`  | \`true\`  (default)   \`false\` | Normalize query string values in metrics. Numeric values are replaced with `NUMBER` and string values with `STRING`. For example, `/page?id=123` becomes `/page?id=NUMBER`. |

### Tracing configuration

Artillery can automatically record Playwright traces for virtual users that fail. This can be helpful for debugging any issues uncovered by the load test. Recorded traces are uploaded to [Artillery Cloud](https://app.artillery.io) and can be viewed under the **Traces** tab in the test report.

You will need to [create an Artillery Cloud account](/docs/get-started/artillery-cloud) and run your test with `--record` flag to use this feature.

| Name     | Valid Options                                                                 | Description                                                                                           |
| -------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| `enabled` | \`false\`  (default)   \`true\`                         | Enable or disable recording of Playwright traces                                                    |
| `maxConcurrentRecordings` | Number (default: 5)                                                             | The number of virtual users that will be recording a trace at the same time  |

> **Info:** For performance reasons, only a subset of active virtual users record traces at any given time. If a virtual user succeeds, the trace is discarded. This means that some tests with only a small number of failing virtual users may not produce any traces. You can tweak the `maxConcurrentRecordings` setting to increase the likelihood of capturing traces for failing virtual users.

#### Customizing `maxConcurrentRecordings`

You can increase the value of `maxConcurrentRecordings` to increase the likelihood of capturing traces for failing VUs.

In distributed tests this setting is applied **per worker**, e.g. if you run a distributed load test on Azure ACI with 20 workers like this:

```sh
artillery run-aci hello-world.yml --count 20
```

Each of those 20 workers will be recording up to `maxConcurrentRecordings` traces at a time.

See the [load testing with Playwright](/docs/playwright) guide for more information on how trace recordings work.

### `$rewriteMetricName` hook

If you need to customize the names of metrics emitted by Playwright load test, you can use a `$rewriteMetricName` hook to rewrite metric names on-the-fly.

This can be used to group metrics from distinct URLs & pages requested during the test under a single metric name in the report. A common use-case is to report metrics for a page that's loaded with many different query parameters under a single metric name.

#### Defining the function

The `$rewriteMetricName` hook is a function that takes two arguments:

1. the original metric name, e.g. `browser.page.TTFB.https://example.com/page?query=1`
2. metric type (one of `histogram`, `counter`, or `rate`).

The function should return the new metric name as a string.

Example of a `$rewriteMetricName` function that groups metrics for all checkout pages under one metric name:

```js
function $rewriteMetricName(metricName, metricType) {
  if (metricName.includes('/checkout?promoid=')) {
    return 'browser.page.checkout';
  } else {
    return metricName;
  }
}
```

#### Loading the function

If your test configuration is defined with YAML, export `$rewriteMetricName` function from a JS/TypeScript file and load it with the `config.processor` option.

If your test is defined fully in TypeScript, export `$rewriteMetricName` from the test script:

```ts
    import { Page } from '@playwright/test';

    export const config = {
      target: 'https://www.artillery.io',
      engines: {
        playwright: {}
      }
    };

    export const scenarios = [{
      engine: 'playwright',
      testFunction: helloWorld
    }];

    async function helloWorld(page: Page) {
      await page.goto('https://www.artillery.io/');
      await page.click('text=Docs');
    }

    export function $rewriteMetricName(metricName: string, metricType: string) {
      if (metricName.includes('/checkout?promoid=')) {
        return 'browser.page.checkout';
      } else {
        return metricName;
      }
    }
```

### `config.target` is Playwright's `baseURL`

The `config.target` is automatically set as the [`baseURL`](https://playwright.dev/docs/api/class-testoptions#test-options-base-url) for the Playwright test. This means that you can use relative URLs (e.g. `page.goto('/docs')`) in your Playwright scripts, and they will be resolved relative to the `config.target` URL.

If you are not using relative URLs in your test script, full URLs will still work as usual.

## Test function API

### Page argument

By default, only the `page` argument (see Playwright's [`page` API](https://playwright.dev/docs/api/class-page/)) is required for functions that implement Playwright scenarios, e.g.:

```js
module.exports = { helloFlow };

async function helloFlow(page) {
  // Go to https://artillery.io/
  await page.goto('https://artillery.io/');
}
```

### Virtual user context and events arguments

The functions also have access to the virtual user context, which can be used for several purposes:

* Accessing scenario (and environment) variables for different virtual users (`vuContext.vars`);
* Getting the current virtual user ID (`vuContext.vars.$uuid`);
* Getting the scenario definition for the scenario currently being run by the virtual user (`vuContext.scenario`), including its name.

Additionally, the `events` argument can be used to [track custom metrics](/docs/reference/extension-apis).

```js
module.exports = { helloFlow };

async function helloFlow(page, vuContext, events) {
  // Increment custom counter:
  events.emit('counter', `user.${vuContext.scenario.name}.page_loads`, 1);
  // Go to https://artillery.io/
  await page.goto('https://artillery.io/');
}
```

### `test.step` argument

The final argument of the function is `test`, which contains the `step` property. The API for `test.step` is similar to Playwright's own `test.step`, which allows you to re-use similar code. The purpose in Artillery is slightly different: to emit custom metrics that represent how long each step takes.

```js
async function loginSearchAndLogout(page, vuContext, events, test) {
  //1. add this line to your scenario function to use test.step helper:
  const { step } = test;

  const userid = vuContext.vars.userid;
  const recordid = vuContext.vars.recordid;

  //2. wrap any logic you have in steps (sometimes you might already have something like this done from existing Playwright tests)
  await step('landing_page', async () => {
    await page.goto('https://internaltesturl.com/landing');
  });

  await step('submit_login', async () => {
    await page.getByLabel('id-label').fill(`${userid}`);
    await page.getByLabel('Password').fill(`${password}`);
    await page.getByRole('button', { name: 'Submit' }).click();
  });

  await step('search_record', async () => {
    await page.getByPlaceholder('enter request id').fill(`${recordid}`);
    await page.getByRole('button', { name: 'Go' }).click();
    await page.locator('css=button.avatar-button').click();
  });

  await step('logout', async () => {
    await page.getByText('Logout').click();
  });
}
```

The above code will now emit custom metrics for each step in addition to the default metrics:

```
browser.step.landing_page:
  min: ......................................................................... 87
  max: ......................................................................... 150
  mean: ........................................................................ 118.5
  median: ...................................................................... 89.1
  p95: ......................................................................... 89.1
  p99: ......................................................................... 89.1
browser.step.submit_login:
  min: ......................................................................... 300
  max: ......................................................................... 716
  mean: ........................................................................ 571.6
  median: ...................................................................... 561.2
  p95: ......................................................................... 561.2
  p99: ......................................................................... 561.2
browser.step.search_record:
  min: ......................................................................... 287
  max: ......................................................................... 801
  mean: ........................................................................ 544.6
  median: ...................................................................... 290.1
  p95: ......................................................................... 290.1
  p99: ......................................................................... 290.1
browser.step.logout:
  min: ......................................................................... 52
  max: ......................................................................... 334
  mean: ........................................................................ 193.1
  median: ...................................................................... 140.2
  p95: ......................................................................... 200.4
  p99: ......................................................................... 200.4
```

## Metrics reported by the engine

In addition to the [default metrics](../reported-metrics#metrics-reported-by-artillery) reported by Artillery, the Playwright engine reports the following metrics:

| Metric                                                                               | Type                                                | Description                                                                                                                                                                   |
| ------------------------------------------------------------------------------------ | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `browser.http_requests`                                                              | Counter (count)          | Number of HTTP requests made by all virtual users during this time period.                                                                                                    |
| `browser.page.codes.<code>`                     | Counter (count)          | Number of different HTTP status codes, e.g. `browser.page.codes.200` is the number of `200 OK` requests.                                                                      |
| `errors.pw_failed_assertion.<assertion_type>`  | Counter (count)          | When available, Artillery will display the name of failed assertions (e.g. `toBeVisible`). Defaults to `errors.<error.message>` if not possible to parse the assertion error. |
| `browser.page.TTFB.<page_url>.<aggregation>`                                         | Histogram (milliseconds) | [Time To First Byte](https://web.dev/articles/ttfb) (Web Vital metric) measurement for a specific `page_url`.                                                                 |
| `browser.page.FCP.<page_url>.<aggregation>`                                          | Histogram (milliseconds) | [First Contentful Paint](https://web.dev/articles/fcp) (Web Vital metric) measurement for a specific `page_url`.                                                              |
| `browser.page.LCP.<page_url>.<aggregation>`                                          | Histogram (milliseconds) | [Largest Contentful Paint](https://web.dev/articles/lcp) (Core Web Vital metric) measurement for a specific `page_url`.                                                       |
| `browser.page.FID.<page_url>.<aggregation>`                                          | Histogram (milliseconds) | [First Input Delay](https://web.dev/articles/fid) (Core Web Vital metric) measurement for a specific `page_url` (if available).                                               |
| `browser.page.INP.<page_url>.<aggregation>`     | Histogram (milliseconds) | [Interaction to Next Paint](https://web.dev/articles/inp) (Core Web Vital metric) measurement for a specific `page_url` (if available).                                       |
| `browser.page.CLS.<page_url>.<aggregation>`                                          | Histogram (shift score)  | [Cumulative Layout Shift](https://web.dev/articles/cls) (Core Web Vital metric) measurement for a specific `page_url` (if available).                                         |

### Extended metrics

If `extendedMetrics` is enabled, the following metrics are also reported:

| Metric                                                 | Type                                                | Description                                                                                                                                                                        |
| ------------------------------------------------------ | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `browser.page.domcontentloaded`                        | Counter (count)          | Number of [DOM Content Loaded](https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event) events across all pages.                                          |
| `browser.page.domcontentloaded.<page_url>`             | Counter (count)          | Number of [DOM Content Loaded](https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event) events for a specific `page_url`.                                 |
| `browser.page.dominteractive.<aggregation>`            | Histogram (milliseconds) | Measurement of time taken for DOM to [become interactive](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming/domInteractive), across all pages.          |
| `browser.page.dominteractive.<page_url>.<aggregation>` | Histogram (milliseconds) | Measurement of time taken for DOM to [become interactive](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming/domInteractive), for a specific `page_url`. |
| `browser.memory_used_mb.<aggregation>`                 | Histogram (megabytes)    | Measurement of `usedJSHeapSize`.                                                                                                                                                   |

If `test.step()` API is used, the following additional histogram is reported:

* `browser.step.<step_name>.<aggregation>` (milliseconds) - measurement of time taken for each step in the scenario.

### Auto-instrumentation of Web Vitals

Artillery automatically tracks the following Web Vitals metrics for every page load in your test:

* [LCP](https://web.dev/articles/lcp) (Largest Contentful Paint)
* [CLS](https://web.dev/articles/cls) (Cumulative Layout Shift)
* [INP](https://web.dev/articles/inp) (Interaction to Next Paint)
* [TTFB](https://web.dev/articles/ttfb) (Time To First Byte)
* [FCP](https://web.dev/articles/fcp) (First Contentful Paint)
* [FID](https://web.dev/articles/fid) (First Input Delay)

The metrics are tracked using Google's [`web-vitals`](https://github.com/GoogleChrome/web-vitals) library. Artillery injects the library into the context of each page and [Page event handlers](https://playwright.dev/docs/api/class-page#events) are set up to collect those metrics.

> **Warning:** If you have any code that modifies the `Page` object provided as the first argument to the test function, you need to make sure that it doesn't overwrite the page context, or reset event handlers. If either of those is reset, then automatic collection of Web Vitals metrics won't work.

## Examples

### Example 1: turn off headless mode

You can turn off the default headless mode to see the browser window for local debugging by setting the [`headless`](https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-headless) option.

> **Info:** For tests executing in distributed mode, e.g. on AWS Fargate or Azure ACI, headless mode is enforced regardless of config.

#### Tab

\`export const config = \{
&#x20; engines: \{
&#x20;   playwright: \{
&#x20;     launchOptions: \{
&#x20;       headless: false
&#x20;     }
&#x20;   }
&#x20; }
};\`

#### Tab

\`config:
&#x20; engines:
&#x20;   playwright:
&#x20;     launchOptions:
&#x20;       headless: false\`

### Example 2: set extra HTTP headers

This example sets the [`extraHTTPHeaders`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-extra-http-headers) option for the browser context that is created by the engine.

#### Tab

\`export const config = \{
&#x20; engines: \{
&#x20;   playwright: \{
&#x20;     contextOptions: \{
&#x20;       extraHTTPHeaders: \{
&#x20;         'x-my-header': 'my-value'
&#x20;       }
&#x20;     }
&#x20;   }
&#x20; }
};\`

#### Tab

\`config:
&#x20; engines:
&#x20;   playwright:
&#x20;     contextOptions:
&#x20;       extraHTTPHeaders:
&#x20;         x-my-header: my-value\`

### Example 3: Record Playwright Traces

> **Info:** You will need to [create an Artillery Cloud account](/docs/get-started/artillery-cloud) and run your test with `--record` flag to use this feature. Once enabled, traces for failing virtual users will be uploaded to the Artillery Cloud dashboard. Trace recording works for both tests running locally, and distributed tests (on AWS or Azure).

#### Tab

\`export const config = \{
&#x20; target: 'https://www.artillery.io',
&#x20; engines: \{
&#x20;   playwright: \{
&#x20;     trace: \{
&#x20;       enabled: true
&#x20;     }
&#x20;   }
&#x20; }
};\`

#### Tab

\`config:
&#x20; target: https://www.artillery.io
&#x20; engines:
&#x20;   \# Enable trace recordings:
&#x20;   playwright:
&#x20;     trace:
&#x20;       enabled: true\`

### Example 4: Normalize or strip query strings in metrics

By default, Artillery normalizes query string values in metrics to reduce the number of distinct metric names. This is useful when your pages have dynamic query parameters like user IDs or session tokens.

For example, if your test navigates to `/search?id=123` and `/search?id=456`, both will be reported under the metric name `/search?id=NUMBER` instead of creating separate metrics for each unique ID.

#### Tab

\`export const config = \{
&#x20; target: 'https://www.example.com',
&#x20; engines: \{
&#x20;   playwright: \{
&#x20;     // Enabled by default - normalizes query string values:
&#x20;     // /page?id=123 -> /page?id=NUMBER
&#x20;     // /page?name=john -> /page?name=STRING
&#x20;     normalizeQueryString: true,

&#x20;     // Or strip query strings entirely:
&#x20;     // /page?id=123 -> /page
&#x20;     stripQueryString: false
&#x20;   }
&#x20; }
};\`

#### Tab

\`config:
&#x20; target: https://example.com
&#x20; engines:
&#x20;   playwright:
&#x20;     \# Enabled by default - normalizes query string values:
&#x20;     \# /page?id=123 -> /page?id=NUMBER
&#x20;     \# /page?name=john -> /page?name=STRING
&#x20;     normalizeQueryString: true

&#x20;     \# Or strip query strings entirely:
&#x20;     \# /page?id=123 -> /page
&#x20;     stripQueryString: false\`

Without normalization, a test that visits pages with unique query parameters would generate metrics like:

```
browser.page.TTFB.https://example.com/search?id=1
browser.page.TTFB.https://example.com/search?id=2
browser.page.TTFB.https://example.com/search?id=3
...
```

With `normalizeQueryString: true` (default), these are consolidated into:

```
browser.page.TTFB.https://example.com/search?id=NUMBER
```

With `stripQueryString: true`, the query string is removed entirely:

```
browser.page.TTFB.https://example.com/search
```

## Playwright compatibility

Each release of Artillery depends on a specific version of Playwright (the [`playwright`](https://www.npmjs.com/package/playwright) and `@playrwight/test` npm packages). That is the version of Playwright (and the corresponding Chromium browser binary) that will be available in AWS Fargate and Azure ACI containers. Playwright releases are usually backwards-compatible, but if your Playwright code depends on a feature that was introduced in a newer version of Playwright than the one bundled with Artillery, you will need to wait until a new version of Artillery is released.

| Artillery version                                                                                                                                                   | Playwright version                                                     |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [2.0.30](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.30)                                                                                    | [1.58.1](https://github.com/microsoft/playwright/releases/tag/v1.58.1) |
| [2.0.29](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.29)                                                                                    | [1.58.0](https://github.com/microsoft/playwright/releases/tag/v1.58.0) |
| [2.0.28](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.28)                                                                                    | [1.57.0](https://github.com/microsoft/playwright/releases/tag/v1.57.0) |
| [2.0.27](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.27)                                                                                    | [1.56.1](https://github.com/microsoft/playwright/releases/tag/v1.56.1) |
| [2.0.26](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.26)                                                                                    | [1.55.0](https://github.com/microsoft/playwright/releases/tag/v1.55.0) |
| [2.0.25](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.25)                                                                                    | [1.55.0](https://github.com/microsoft/playwright/releases/tag/v1.55.0) |
| [2.0.24](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.24)                                                                                    | [1.54.2](https://github.com/microsoft/playwright/releases/tag/v1.54.2) |
| [2.0.23](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.23)                                                                                    | [1.52.0](https://github.com/microsoft/playwright/releases/tag/v1.52.0) |
| [2.0.22](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.22)                                                                                    | [1.49.1](https://github.com/microsoft/playwright/releases/tag/v1.49.1) |
| [2.0.21](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.21)                                                                                    | [1.48.0](https://github.com/microsoft/playwright/releases/tag/v1.48.0) |
| [2.0.20](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.20)                                                                                    | [1.45.3](https://github.com/microsoft/playwright/releases/tag/v1.45.3) |
| [2.0.19](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.19)                                                                                    | [1.45.3](https://github.com/microsoft/playwright/releases/tag/v1.45.3) |
| [2.0.18](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.18)                                                                                    | [1.45.2](https://github.com/microsoft/playwright/releases/tag/v1.45.2) |
| [2.0.17](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.17)                                                                                    | [1.45.0](https://github.com/microsoft/playwright/releases/tag/v1.45.0) |
| [2.0.16](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.16) - [2.0.15](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.15) | [1.44.1](https://github.com/microsoft/playwright/releases/tag/v1.44.1) |
| [2.0.14](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.14) - [2.0.12](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.12) | [1.44.0](https://github.com/microsoft/playwright/releases/tag/v1.44.0) |
| [2.0.11](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.11) - [2.0.10](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.10) | [1.43.1](https://github.com/microsoft/playwright/releases/tag/v1.43.1) |
| [2.0.9](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.9) - [2.0.7](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.7)     | [1.42.1](https://github.com/microsoft/playwright/releases/tag/v1.42.1) |
| [2.0.6](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.6)                                                                                      | [1.41.2](https://github.com/microsoft/playwright/releases/tag/v1.41.2) |
| [2.0.5](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.5)                                                                                      | [1.41.0](https://github.com/microsoft/playwright/releases/tag/v1.41.0) |
| [2.0.4](https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.4) - [2.0.0-38](https://github.com/artilleryio/artillery/releases/tag/v2.0.0-38)        | [1.39.0](https://github.com/microsoft/playwright/releases/tag/v1.39.0) |
