Azure Microsoft Playwright TypeScript 测试
Azure Playwright Workspaces SDK for TypeScript
利用云托管浏览器和集成的 Azure 门户报告大规模运行 Playwright 测试。
> 迁移通知: @azure/microsoft-playwright-testing 将于 2026 年 3 月 8 日 停用。请改用 @azure/playwright。详见 迁移指南。
安装
# 推荐:自动生成配置
npm init @azure/playwright@latest
手动安装
npm install @azure/playwright --save-dev
npm install @playwright/test@^1.47 --save-dev
npm install @azure/identity --save-dev要求:
- Playwright 版本 1.47+(基础用法)
- Playwright 版本 1.57+(Azure reporter 功能)
环境变量
PLAYWRIGHT_SERVICE_URL=wss://eastus.api.playwright.microsoft.com/playwrightworkspaces/{workspace-id}/browsers身份验证
Microsoft Entra ID (推荐)
# 使用 Azure CLI 登录
az login// 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,
credential: new DefaultAzureCredential(),
})
);
自定义凭据
import { ManagedIdentityCredential } from "@azure/identity";
import { createAzurePlaywrightConfig } from "@azure/playwright";
export default defineConfig(
config,
createAzurePlaywrightConfig(config, {
credential: new ManagedIdentityCredential(),
})
);
核心工作流
服务配置
// 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(),
})
);
运行测试
npx playwright test --config=playwright.service.config.ts --workers=20使用 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(),
}),
{
reporter: [
["html", { open: "never" }],
["@azure/playwright/reporter"],
],
}
);
手动浏览器连接
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 br
owser.newContext();
const page = await context.newPage();
await page.goto("https://example.com");
await expect(page).toHaveTitle(/Example/);
await browser.close();
});
## 配置选项type PlaywrightServiceAdditionalOptions = {
serviceAuthType?: "ENTRA_ID" | "ACCESS_TOKEN"; // 默认值: ENTRA_ID
os?: "linux" | "windows"; // 默认值: linux
runName?: string; // 用于 Portal 的自定义运行名称
connectTimeout?: number; // 默认值: 30000ms
exposeNetwork?: string; // 默认值: <loopback>
credential?: TokenCredential; // Entra ID 必需项
};
### ServiceOS 枚举import { ServiceOS } from "@azure/playwright";
// 可用值
ServiceOS.LINUX // "linux" - 默认
ServiceOS.WINDOWS // "windows"
### ServiceAuth 枚举import { ServiceAuth } from "@azure/playwright";
// 可用值
ServiceAuth.ENTRA_ID // 推荐 - 使用凭据 (credential)
ServiceAuth.ACCESS_TOKEN // 使用 PLAYWRIGHT_SERVICE_ACCESS_TOKEN 环境变量
## CI/CD 集成
GitHub Actions
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
## 核心类型import {
createAzurePlaywrightConfig,
getConnectOptions,
ServiceOS,
ServiceAuth,
ServiceEnvironmentVariable,
} from "@azure/playwright";
import type {
OsType,
AuthenticationType,
BrowserConnectOptions,
PlaywrightServiceAdditionalOptions,
} from "@azure/playwright";
## 从旧版本包迁移
| 旧版本 (@azure/microsoft-playwright-testing) | 新版本 (@azure/playwright) |
|---------------------------------------------|---------------------------|
| getServiceConfig() | createAzurePlaywrightConfig() |
| timeout 选项 | connectTimeout 选项 |
| runId 选项 | runName 选项 |
| useCloudHostedBrowsers 选项 | 已移除 (默认始终启用) |
| @azure/microsoft-playwright-testing/reporter | @azure/playwright/reporter |
| 隐式凭据 | 显式 credential 参数 |
迁移前 (旧版本)
export default defineConfig(
config,
getServiceConfig(config, {
os: ServiceOS.LINUX,
timeout: 30000,
useCloudHostedBrowsers: true,
}),
{
reporter: [["@azure/microsoft-playwright-testing/reporter"]],
}
);
### 迁移后 (新版本)import { createAzurePlaywrightConfig, ServiceOS } from "@azure/playwright";
import { DefaultAz_
ureCredential } from "@azure/identity";
export default defineConfig(
config,
createAzurePlaywrightConfig(config, {
os: ServiceOS.LINUX,
connectTimeout: 30000,
credential: new DefaultAzureCredential(),
}),
{
reporter: [
["html", { open: "never" }],
["@azure/playwright/reporter"],
],
}
);
最佳实践
1. 使用 Entra ID 认证 — 比访问令牌(access tokens)更安全
2. 提供明确的凭据 — 始终传递 credential: new DefaultAzureCredential()
3. 启用 Artifacts — 在配置中设置 trace: "on-first-retry" 和 video: "retain-on-failure"
4. 扩展 Worker 数量 — 并行执行时使用 --workers=20 或更高
5. 选择区域 — 选择距离测试目标最近的区域
6. 优先配置 HTML 报告器 — 使用 Azure 报告器时,请将 HTML 报告器置于 Azure 报告器之前
适用场景
本技能适用于执行概览中所描述的工作流或操作。局限性
- 仅在任务明确符合上述范围时使用此技能。
- 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
- 如果缺少必要的输入、权限、安全边界或成功标准,请停止并请求澄清。