GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

azure-microsoft-playwright-testing-ts

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.

Ciza · 0 points · 19 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_azure-sdk-typescript_skills_azure-microsoft-playwright-testing-ts-e58528d.zip · 2 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-typescript/skills/azure-microsoft-playwright-testing-ts
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

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

# Recommended: Auto-generates config
npm init @azure/playwright@latest

# Manual installation
npm install @azure/playwright --save-dev
npm install @playwright/test@^1.47 --save-dev
npm install @azure/identity --save-dev

Requirements:

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

Environment Variables

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

Authentication

Microsoft Entra Token Credential (Recommended)

# Sign in with Azure CLI
az login
// playwright.service.config.ts
import { 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

import { ManagedIdentityCredential } from "@azure/identity";
import { createAzurePlaywrightConfig } from "@azure/playwright";

export default defineConfig(
  config,
  createAzurePlaywrightConfig(config, {
    credential: new ManagedIdentityCredential(),
  })
);

Core Workflow

Service Configuration

// playwright.service.config.ts
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,
    connectTimeout: 30000,
    exposeNetwork: "<loopback>",
    credential: new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]}),
  })
);

Run Tests

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

With Azure Reporter

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

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

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

import { ServiceOS } from "@azure/playwright";

// Available values
ServiceOS.LINUX   // "linux" - default
ServiceOS.WINDOWS // "windows"

ServiceAuth Enum

import { ServiceAuth } from "@azure/playwright";

// Available values
ServiceAuth.ENTRA_ID      // Recommended - uses credential
ServiceAuth.ACCESS_TOKEN  // Use PLAYWRIGHT_SERVICE_ACCESS_TOKEN env var

CI/CD Integration

GitHub Actions

name: playwright-ts
on: [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

- 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

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 option connectTimeout option
runId option runName option
useCloudHostedBrowsers option Removed (always enabled)
@azure/microsoft-playwright-testing/reporter @azure/playwright/reporter
Implicit credential Explicit credential parameter

Before (Old)

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)

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
Files (skills)
  • SKILL.md 8.6 KB
    ---
    name: azure-microsoft-playwright-testing-ts
    description: 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.
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
      package: '@azure/playwright'
    ---
    
    # 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](https://aka.ms/mpt/migration-guidance).
    
    ## Installation
    
    ```bash
    # Recommended: Auto-generates config
    npm init @azure/playwright@latest
    
    # Manual installation
    npm install @azure/playwright --save-dev
    npm install @playwright/test@^1.47 --save-dev
    npm 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}/browsers
    AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
    ```
    
    ## Authentication
    
    ### Microsoft Entra Token Credential (Recommended)
    
    ```bash
    # Sign in with Azure CLI
    az login
    ```
    
    ```typescript
    // playwright.service.config.ts
    import { 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.ts
    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,
        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 values
    ServiceOS.LINUX   // "linux" - default
    ServiceOS.WINDOWS // "windows"
    ```
    
    ### ServiceAuth Enum
    
    ```typescript
    import { ServiceAuth } from "@azure/playwright";
    
    // Available values
    ServiceAuth.ENTRA_ID      // Recommended - uses credential
    ServiceAuth.ACCESS_TOKEN  // Use PLAYWRIGHT_SERVICE_ACCESS_TOKEN env var
    ```
    
    ## CI/CD Integration
    
    ### GitHub Actions
    
    ```yaml
    name: playwright-ts
    on: [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` option | `connectTimeout` option |
    | `runId` option | `runName` option |
    | `useCloudHostedBrowsers` option | Removed (always enabled) |
    | `@azure/microsoft-playwright-testing/reporter` | `@azure/playwright/reporter` |
    | Implicit credential | Explicit `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
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related