Azure Microsoft Playwright Testing Ts

by microsoft354361d83247MITListed Oct 8, 2026Updated Oct 8, 2026

Run Playwright tests at scale using Azure Playwright Workspaces (formerly Microsoft Playwright Testing). Use when scaling browser tests across cloud-hosted browsers, integrating with CI/CD pipelines, or publishing test results to the Azure portal.

FeaturedInstructions onlyDevOps & CloudSoftware Development
AI-generated overview

Guides running Playwright browser tests at scale on Azure Playwright Workspaces with cloud browsers and portal reporting.

What it does
This skill provides instructions for configuring the @azure/playwright TypeScript SDK so Playwright tests run on cloud-hosted browsers in Azure Playwright Workspaces. It covers installation, environment variables, Microsoft Entra and custom credential authentication, service configuration, running tests, the Azure reporter, manual browser connection, configuration options, and CI/CD integration for GitHub Actions and Azure Pipelines. It also documents migration from the retired @azure/microsoft-playwright-testing package to @azure/playwright.
When to use it
Use it when scaling browser tests across cloud-hosted browsers, integrating Playwright tests with CI/CD pipelines, or publishing test results to the Azure portal. It also fits projects migrating from the older Microsoft Playwright Testing package.
Requirements
Requires Node.js and npm, Playwright 1.47+ (1.57+ for Azure reporter features), and the @azure/playwright, @playwright/test, and @azure/identity packages. Needs an Azure Playwright Workspaces service URL, Azure credentials (for example via az login or managed identity), and network access to Azure. It ships no scripts; it is instructions only.

Azure Playwright Workspaces SDK for TypeScript

Run Playwright tests at scale with cloud-hosted browsers and integrated Azure portal reporting.

Migration Notice: @azure/microsoft-playwright-testing is retired on March 8, 2026. Use @azure/playwright instead. See migration guide.

Installation

bash
# Recommended: Auto-generates confignpm init @azure/playwright@latest
# Manual installationnpm install @azure/playwright --save-devnpm install @playwright/test@^1.47 --save-devnpm install @azure/identity --save-dev

Requirements:

  • Playwright version 1.47+ (basic usage)
  • Playwright version 1.57+ (Azure reporter features)

Environment Variables

bash
PLAYWRIGHT_SERVICE_URL=wss://eastus.api.playwright.microsoft.com/playwrightworkspaces/{workspace-id}/browsersAZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production

Authentication

Microsoft Entra Token Credential (Recommended)

bash
# Sign in with Azure CLIaz login
typescript
// playwright.service.config.tsimport { defineConfig } from "@playwright/test";import { createAzurePlaywrightConfig, ServiceOS } from "@azure/playwright";import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity";import config from "./playwright.config";
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]});// Or use a specific credential directly in production:// See https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes// const credential = new ManagedIdentityCredential();
export default defineConfig(  config,  createAzurePlaywrightConfig(config, {    os: ServiceOS.LINUX,    credential,  }));

Custom Credential

typescript
import { ManagedIdentityCredential } from "@azure/identity";import { createAzurePlaywrightConfig } from "@azure/playwright";
export default defineConfig(  config,  createAzurePlaywrightConfig(config, {    credential: new ManagedIdentityCredential(),  }));

Core Workflow

Service Configuration

typescript
// playwright.service.config.tsimport { defineConfig } from "@playwright/test";import { createAzurePlaywrightConfig, ServiceOS } from "@azure/playwright";import { DefaultAzureCredential } from "@azure/identity";import config from "./playwright.config";
export default defineConfig(  config,  createAzurePlaywrightConfig(config, {    os: ServiceOS.LINUX,    connectTimeout: 30000,    exposeNetwork: "<loopback>",    credential: new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]}),  }));

Run Tests

bash
npx playwright test --config=playwright.service.config.ts --workers=20

With Azure Reporter

typescript
import { defineConfig } from "@playwright/test";import { createAzurePlaywrightConfig, ServiceOS } from "@azure/playwright";import { DefaultAzureCredential } from "@azure/identity";import config from "./playwright.config";
export default defineConfig(  config,  createAzurePlaywrightConfig(config, {    os: ServiceOS.LINUX,    credential: new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]}),  }),  {    reporter: [      ["html", { open: "never" }],      ["@azure/playwright/reporter"],    ],  });

Manual Browser Connection

typescript
import playwright, { test, expect, BrowserType } from "@playwright/test";import { getConnectOptions } from "@azure/playwright";
test("manual connection", async ({ browserName }) => {  const { wsEndpoint, options } = await getConnectOptions();  const browser = await (playwright[browserName] as BrowserType).connect(wsEndpoint, options);  const context = await browser.newContext();  const page = await context.newPage();
  await page.goto("https://example.com");  await expect(page).toHaveTitle(/Example/);
  await browser.close();});

Configuration Options

typescript
type PlaywrightServiceAdditionalOptions = {  serviceAuthType?: "ENTRA_ID" | "ACCESS_TOKEN";  // Default: ENTRA_ID  os?: "linux" | "windows";                        // Default: linux  runName?: string;                                // Custom run name for portal  connectTimeout?: number;                         // Default: 30000ms  exposeNetwork?: string;                          // Default: <loopback>  credential?: TokenCredential;                    // REQUIRED for Entra ID};

ServiceOS Enum

typescript
import { ServiceOS } from "@azure/playwright";
// Available valuesServiceOS.LINUX   // "linux" - defaultServiceOS.WINDOWS // "windows"

ServiceAuth Enum

typescript
import { ServiceAuth } from "@azure/playwright";
// Available valuesServiceAuth.ENTRA_ID      // Recommended - uses credentialServiceAuth.ACCESS_TOKEN  // Use PLAYWRIGHT_SERVICE_ACCESS_TOKEN env var

CI/CD Integration

GitHub Actions

yaml
name: playwright-tson: [push, pull_request]
permissions:  id-token: write  contents: read
jobs:  test:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4
      - name: Azure Login        uses: azure/login@v2        with:          client-id: ${{ secrets.AZURE_CLIENT_ID }}          tenant-id: ${{ secrets.AZURE_TENANT_ID }}          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - run: npm ci            - name: Run Tests        env:          PLAYWRIGHT_SERVICE_URL: ${{ secrets.PLAYWRIGHT_SERVICE_URL }}        run: npx playwright test -c playwright.service.config.ts --workers=20

Azure Pipelines

yaml
- task: AzureCLI@2  displayName: Run Playwright Tests  env:    PLAYWRIGHT_SERVICE_URL: $(PLAYWRIGHT_SERVICE_URL)  inputs:    azureSubscription: My_Service_Connection    scriptType: pscore    inlineScript: |      npx playwright test -c playwright.service.config.ts --workers=20    addSpnToEnvironment: true

Key Types

typescript
import {  createAzurePlaywrightConfig,  getConnectOptions,  ServiceOS,  ServiceAuth,  ServiceEnvironmentVariable,} from "@azure/playwright";
import type {  OsType,  AuthenticationType,  BrowserConnectOptions,  PlaywrightServiceAdditionalOptions,} from "@azure/playwright";

Migration from Old Package

Old (@azure/microsoft-playwright-testing)New (@azure/playwright)
getServiceConfig()createAzurePlaywrightConfig()
timeout optionconnectTimeout option
runId optionrunName option
useCloudHostedBrowsers optionRemoved (always enabled)
@azure/microsoft-playwright-testing/reporter@azure/playwright/reporter
Implicit credentialExplicit credential parameter

Before (Old)

typescript
import { getServiceConfig, ServiceOS } from "@azure/microsoft-playwright-testing";
export default defineConfig(  config,  getServiceConfig(config, {    os: ServiceOS.LINUX,    timeout: 30000,    useCloudHostedBrowsers: true,  }),  {    reporter: [["@azure/microsoft-playwright-testing/reporter"]],  });

After (New)

typescript
import { createAzurePlaywrightConfig, ServiceOS } from "@azure/playwright";import { DefaultAzureCredential } from "@azure/identity";
export default defineConfig(  config,  createAzurePlaywrightConfig(config, {    os: ServiceOS.LINUX,    connectTimeout: 30000,    credential: new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]}),  }),  {    reporter: [      ["html", { open: "never" }],      ["@azure/playwright/reporter"],    ],  });

Best Practices

  1. Use Microsoft Entra Token Credential — More secure than access tokens
  2. Use DefaultAzureCredential for local development; use ManagedIdentityCredential or WorkloadIdentityCredential for production
  3. Enable artifacts — Set trace: "on-first-retry", video: "retain-on-failure" in config
  4. Scale workers — Use --workers=20 or higher for parallel execution
  5. Region selection — Choose region closest to your test targets
  6. HTML reporter first — When using Azure reporter, list HTML reporter before Azure reporter

Source and attribution

Source:microsoft/skillsin.github/plugins/azure-sdk-typescript/skills/azure-microsoft-playwright-testing-tsat commit354361d

License: MIT

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal