Azure 资源管理器 Playwright .NET

azure-resource-manager-playwright-dotnet
分类编程
作者Agentic Awesome Skills 社区
许可MIT
评分4.90/5
使用8.1K

Azure.ResourceManager.Playwright (.NET)

用于通过 Azure Resource Manager 部署和管理 Microsoft Playwright Testing 工作区的管理平面 SDK。

> ⚠️ 管理平面 vs 测试执行
> - 本 SDK (Azure.ResourceManager.Playwright):创建工作区、管理配额、检查名称可用性
> - 测试执行 SDK (Azure.Developer.MicrosoftPlaywrightTesting.NUnit):在云端浏览器上大规模运行 Playwright 测试

安装

bash
dotnet add package Azure.ResourceManager.Playwright
dotnet add package Azure.Identity

当前版本:稳定版 v1.0.0,预览版 v1.0.0-beta.1

环境变量

bash
AZURE_SUBSCRIPTION_ID=<your-subscription-id>

用于服务主体身份验证(可选)

AZURE_TENANT_ID=<tenant-id> AZURE_CLIENT_ID=<client-id> AZURE_CLIENT_SECRET=<client-secret>

身份验证

csharp
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}"));

资源层级

code
ArmClient
└── SubscriptionResource
    ├── PlaywrightQuotaResource (订阅级配额)
    └── ResourceGroupResource
        └── PlaywrightWorkspaceResource
            └── PlaywrightWorkspaceQuotaResource (工作区级配额)

核心工作流

1. 创建 Playwright 工作区

csharp
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. 获取现有工作区

csharp
// 通过名称获取
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. 列出工作区

csharp
// 列出资源组中的工作区
await foreach (var workspace in workspaceCollection.GetAllAsync())
{
    Console.WriteLine($"Workspace: {workspace.Data.Name}");
}
.Data.Name}"); Console.WriteLine($" Location: {workspace.Data.Location}"); Console.WriteLine($" State: {workspace.Data.ProvisioningState}"); Console.WriteLine($" Data Plane URI: {workspace.Data.DataplaneUri}"); }

// 跨订阅列出
await foreach (var workspace in subscription.GetPlaywrightWorkspacesAsync())
{
Console.WriteLine($"Workspace: {workspace.Data.Name}");
}

code
### 4. 更新工作区
csharp
var patch = new PlaywrightWorkspacePatch
{
Tags =
{
["Team"] = "Dev Exp",
["Environment"] = "Staging",
["UpdatedAt"] = DateTime.UtcNow.ToString("o")
}
};

var updatedWorkspace = await workspace.Value.UpdateAsync(patch);

code
### 5. 检查名称可用性
csharp
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}");
}

code
### 6. 获取配额信息
csharp
// 订阅级配额
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}");
}

code
### 7. 删除工作区
csharp
// 删除(长时间运行的操作)
await workspace.Value.DeleteAsync(WaitUntil.Completed);
code
## 关键类型参考

| 类型 | 用途 |
|------|---------|
| 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,用于测试执行配置

错误处理

csharp using Azure;

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}");
}

code
## 与测试执行的集成

创建工作区后,使用 DataplaneUri 来配置 Playwright 测试:

csharp
// 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`

文档链接

使用场景

本技能适用于执行概述中描述的工作流或操作。

局限性

  • 仅在任务明确符合上述范围时使用本技能。
  • 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请停止操作并寻求澄清。