Azure 资源管理器 Playwright .NET
Azure.ResourceManager.Playwright (.NET)
用于通过 Azure Resource Manager 部署和管理 Microsoft Playwright Testing 工作区的管理平面 SDK。
> ⚠️ 管理平面 vs 测试执行
> - 本 SDK (Azure.ResourceManager.Playwright):创建工作区、管理配额、检查名称可用性
> - 测试执行 SDK (Azure.Developer.MicrosoftPlaywrightTesting.NUnit):在云端浏览器上大规模运行 Playwright 测试
安装
dotnet add package Azure.ResourceManager.Playwright
dotnet add package Azure.Identity当前版本:稳定版 v1.0.0,预览版 v1.0.0-beta.1
环境变量
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
用于服务主体身份验证(可选)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>身份验证
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Playwright;
// 始终使用 DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
// 获取订阅
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
资源层级
ArmClient
└── SubscriptionResource
├── PlaywrightQuotaResource (订阅级配额)
└── ResourceGroupResource
└── PlaywrightWorkspaceResource
└── PlaywrightWorkspaceQuotaResource (工作区级配额)核心工作流
1. 创建 Playwright 工作区
using Azure.ResourceManager.Playwright;
using Azure.ResourceManager.Playwright.Models;
// 获取资源组
var resourceGroup = await subscription
.GetResourceGroupAsync("my-resource-group");
// 定义工作区
var workspaceData = new PlaywrightWorkspaceData(AzureLocation.WestUS3)
{
// 可选:配置区域亲和性和本地身份验证
RegionalAffinity = PlaywrightRegionalAffinity.Enabled,
LocalAuth = PlaywrightLocalAuth.Enabled,
Tags =
{
["Team"] = "Dev Exp",
["Environment"] = "Production"
}
};
// 创建工作区(长时间运行的操作)
var workspaceCollection = resourceGroup.Value.GetPlaywrightWorkspaces();
var operation = await workspaceCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-playwright-workspace",
workspaceData);
PlaywrightWorkspaceResource workspace = operation.Value;
// 获取用于运行测试的数据平面 URI
Console.WriteLine($"Data Plane URI: {workspace.Data.DataplaneUri}");
Console.WriteLine($"Workspace ID: {workspace.Data.WorkspaceId}");
2. 获取现有工作区
// 通过名称获取
var workspace = await workspaceCollection.GetAsync("my-playwright-workspace");
// 或先检查是否存在
bool exists = await workspaceCollection.ExistsAsync("my-playwright-workspace");
if (exists)
{
var existingWorkspace = await workspaceCollection.GetAsync("my-playwright-workspace");
Console.WriteLine($"Workspace found: {existingWorkspace.Value.Data.Name}");
}
3. 列出工作区
// 列出资源组中的工作区
await foreach (var workspace in workspaceCollection.GetAllAsync())
{
Console.WriteLine($"Workspace: {workspace.Data.Name}");
}// 跨订阅列出
await foreach (var workspace in subscription.GetPlaywrightWorkspacesAsync())
{
Console.WriteLine($"Workspace: {workspace.Data.Name}");
}
### 4. 更新工作区var patch = new PlaywrightWorkspacePatch
{
Tags =
{
["Team"] = "Dev Exp",
["Environment"] = "Staging",
["UpdatedAt"] = DateTime.UtcNow.ToString("o")
}
};
var updatedWorkspace = await workspace.Value.UpdateAsync(patch);
### 5. 检查名称可用性using Azure.ResourceManager.Playwright.Models;
var checkRequest = new PlaywrightCheckNameAvailabilityContent
{
Name = "my-new-workspace",
ResourceType = "Microsoft.LoadTestService/playwrightWorkspaces"
};
var result = await subscription.CheckPlaywrightNameAvailabilityAsync(checkRequest);
if (result.Value.IsNameAvailable == true)
{
Console.WriteLine("名称可用!");
}
else
{
Console.WriteLine($"名称不可用: {result.Value.Message}");
Console.WriteLine($"原因: {result.Value.Reason}");
}
### 6. 获取配额信息// 订阅级配额
await foreach (var quota in subscription.GetPlaywrightQuotasAsync(AzureLocation.WestUS3))
{
Console.WriteLine($"Quota: {quota.Data.Name}");
Console.WriteLine($" Limit: {quota.Data.Limit}");
Console.WriteLine($" Used: {quota.Data.Used}");
}
// 工作区级配额
var workspaceQuotas = workspace.Value.GetAllPlaywrightWorkspaceQuota();
await foreach (var quota in workspaceQuotas.GetAllAsync())
{
Console.WriteLine($"Workspace Quota: {quota.Data.Name}");
}
### 7. 删除工作区// 删除(长时间运行的操作)
await workspace.Value.DeleteAsync(WaitUntil.Completed);
## 关键类型参考
| 类型 | 用途 |
|------|---------|
| ArmClient | 所有 ARM 操作的入口点 |
| PlaywrightWorkspaceResource | 表示一个 Playwright Testing 工作区 |
| PlaywrightWorkspaceCollection | 用于工作区 CRUD 的集合 |
| PlaywrightWorkspaceData | 工作区创建/响应的有效负载 |
| PlaywrightWorkspacePatch | 工作区更新的有效负载 |
| PlaywrightQuotaResource | 订阅级配额信息 |
| PlaywrightWorkspaceQuotaResource | 工作区级配额信息 |
| PlaywrightExtensions | ARM 资源的扩展方法 |
| PlaywrightCheckNameAvailabilityContent | 名称可用性检查请求 |
工作区属性
| 属性 | 描述 |
|----------|-------------|
| DataplaneUri | 运行测试的 URI(例如 https://api.dataplane.{guid}.domain.com) |
| WorkspaceId | 唯一的工作区标识符 (GUID) |
| RegionalAffinity | 启用/禁用测试执行的区域亲和性 |
| LocalAuth | 启用/禁用本地身份验证(访问令牌) |
| ProvisioningState | 当前配置状态(Succeeded, Failed 等) |
最佳实践
1. 对于必须在继续之前完成的操作,请使用 WaitUntil.Completed
2. 当您想要手动轮询或并行运行操作时,请使用 WaitUntil.Started
3. 始终使用 DefaultAzureCredential —— 切勿硬编码密钥
4. 使用 RequestFailedException 处理 ARM API 错误
5. 对于幂等操作,请使用 CreateOrUpdateAsync
6. 通过 Get* 方法导航资源层级
方法(例如:resourceGroup.GetPlaywrightWorkspaces())
7. 在工作区创建后存储 DataplaneUri,用于测试执行配置
错误处理
try
{
var operation = await workspaceCollection.CreateOrUpdateAsync(
WaitUntil.Completed, workspaceName, workspaceData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
Console.WriteLine("Workspace already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
Console.WriteLine($"Bad request: {ex.Message}");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}
## 与测试执行的集成
创建工作区后,使用 DataplaneUri 来配置 Playwright 测试:
// 1. 创建工作区 (使用本 SDK)
var workspace = await workspaceCollection.CreateOrUpdateAsync(
WaitUntil.Completed, "my-workspace", workspaceData);
// 2. 获取服务 URL
var serviceUrl = workspace.Value.Data.DataplaneUri;
// 3. 为测试执行设置环境变量
Environment.SetEnvironmentVariable("PLAYWRIGHT_SERVICE_URL", serviceUrl.ToString());
// 4. 使用 Azure.Developer.MicrosoftPlaywrightTesting.NUnit 运行测试
// (测试执行需使用独立包)
``
相关 SDK
| SDK | 用途 | 安装命令 |
|-----|---------|---------|
| Azure.ResourceManager.Playwright | 管理平面 (本 SDK) | dotnet add package Azure.ResourceManager.Playwright |Azure.Developer.MicrosoftPlaywrightTesting.NUnit
| | 大规模运行 NUnit Playwright 测试 | dotnet add package Azure.Developer.MicrosoftPlaywrightTesting.NUnit --prerelease |Azure.Developer.Playwright
| | Playwright 客户端库 | dotnet add package Azure.Developer.Playwright |
API 信息
- 资源提供程序: Microsoft.LoadTestService
- 默认 API 版本: 2025-09-01
- 资源类型: Microsoft.LoadTestService/playwrightWorkspaces`
文档链接
使用场景
本技能适用于执行概述中描述的工作流或操作。局限性
- 仅在任务明确符合上述范围时使用本技能。
- 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
- 如果缺少必要的输入、权限、安全边界或成功标准,请停止操作并寻求澄清。