Azure.ResourceManager.Playwright.NET实战用 ARM 管理平面 SDK 编排 Microsoft Playwright Testing 工作区【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,445 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/gh_mirrors/an/agentic-awesome-skills本指南以仓库中azure-resource-manager-playwright-dotnet技能文档为主体系统讲解如何通过 .NET 的 Azure Resource ManagerARM管理平面 SDK——Azure.ResourceManager.Playwright——对 Microsoft Playwright Testing 工作区进行全生命周期管理创建、查询、更新、配额检查、名称可用性与删除。读完本文你将能够用一段可复现的 C# 代码完成建工作区 → 取 Data Plane URI → 交给测试执行 SDK 跑规模化 Playwright 用例的完整链路并掌握 ARM 异步长操作、错误处理与认证的最佳实践。⚠️ 管理平面 vs 测试执行本文所讲的 SDKAzure.ResourceManager.Playwright负责创建工作区、管理配额、检查名称可用性等资源管理类操作测试执行 SDKAzure.Developer.MicrosoftPlaywrightTesting.NUnit负责把 Playwright 测试放到云浏览器上规模化执行。二者分工不同、相互衔接下文第 8 节会给出两者的集成方式。1. 技能来源与本仓库中的定位该技能在仓库中的本体为 plugins/agentic-awesome-skills-claude/skills/azure-resource-manager-playwright-dotnet/SKILL.mdFront Matter 标注了risk: critical、source: community社区来源技能。根据 docs/sources/microsoft-skills-attribution.json 的归属记录该技能来自微软官方 skills 仓库原始路径为dotnet/compute/playwright是微软技能集在 AAS 中的镜像收录之一同时它也登记在 data/catalog.json 的技能目录中canonical_id与目录pathskills/azure-resource-manager-playwright-dotnet/SKILL.md与镜像目录一一对应便于 Agent 通过目录发现并精准加载。2. 安装在 .NET 项目中通过dotnet add package安装两个包dotnet add package Azure.ResourceManager.Playwright dotnet add package Azure.IdentityAzure.ResourceManager.Playwright管理平面 SDK 本体提供工作区、配额等 ARM 资源的客户端与数据模型Azure.Identity提供DefaultAzureCredential等认证凭据类型是调用 ARM API 的前提。当前版本稳定版 v1.0.0预览版 v1.0.0-beta.1。按你的项目对 API 稳定性的要求选择版本预览版通常包含尚未 GA 的新特性。3. 环境变量与身份认证3.1 环境变量AZURE_SUBSCRIPTION_IDyour-subscription-id # 服务主体认证可选 AZURE_TENANT_IDtenant-id AZURE_CLIENT_IDclient-id AZURE_CLIENT_SECRETclient-secretAZURE_SUBSCRIPTION_ID是必须的用于定位目标订阅后三个变量仅在以服务主体Service Principal身份运行时使用本地开发时通常不需要设置。3.2 使用 DefaultAzureCredential 建立客户端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}));要点DefaultAzureCredential会按既定顺序尝试多种凭据源本地 Azure CLI 登录、环境变量中的服务主体、托管标识等无需在代码里硬编码任何密钥这也是技能文档反复强调绝不硬编码密钥的原因ArmClient是整个 ARM SDK 的统一入口所有资源客户端都通过它向下导航订阅通过标准的 ARM 资源 ID/subscriptions/{id}解析为SubscriptionResource。4. 资源层级Resource Hierarchy管理平面 SDK 遵循 ARM 的资源嵌套模型结构如下ArmClient └── SubscriptionResource ├── PlaywrightQuotaResource (订阅级配额) └── ResourceGroupResource └── PlaywrightWorkspaceResource └── PlaywrightWorkspaceQuotaResource (工作区级配额)理解这个层级对写出正确的代码至关重要配额Quota分为两级——订阅级配额挂在SubscriptionResource下工作区级配额挂在PlaywrightWorkspaceResource下而工作区本身必须挂在某个ResourceGroupResource之下。所有导航都应通过Get*系列方法逐级下钻而不是手工拼接资源 ID。5. 核心工作流7 个典型操作5.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});关键细节PlaywrightWorkspaceData的构造必须传入AzureLocation此处为WestUS3这是工作区的部署区域CreateOrUpdateAsync返回 ARM 的长时间运行操作Long-Running Operation, LROWaitUntil.Completed表示阻塞等待部署完成后再返回创建成功后应立即保存两个关键输出DataplaneUri后续测试执行要用和WorkspaceId工作区唯一标识。5.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}); }ExistsAsync是先探测再操作的惯用模式可避免对不存在的资源直接调用GetAsync抛出RequestFailedException404。5.3 列出工作区// 在资源组内列出 await foreach (var workspace in workspaceCollection.GetAllAsync()) { Console.WriteLine($Workspace: {workspace.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}); }两种粒度资源组级workspaceCollection.GetAllAsync()与订阅级subscription.GetPlaywrightWorkspacesAsync()。注意await foreach异步流式迭代适合工作区数量较多的场景。5.4 更新工作区var patch new PlaywrightWorkspacePatch { Tags { [Team] Dev Exp, [Environment] Staging, [UpdatedAt] DateTime.UtcNow.ToString(o) } }; var updatedWorkspace await workspace.Value.UpdateAsync(patch);PlaywrightWorkspacePatch是增量更新载荷本例通过 Tag 记录环境迁移Production → Staging与最近更新时间ISO 8601 格式无需重建整个工作区对象。5.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(Name is available!); } else { Console.WriteLine($Name unavailable: {result.Value.Message}); Console.WriteLine($Reason: {result.Value.Reason}); }在创建前先做名称预检ResourceType必须使用资源提供程序的完整类型名Microsoft.LoadTestService/playwrightWorkspaces。当名称不可用时通过Reason与Message获取不可用的具体原因如已被占用、非法命名等。5.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}); }配额查询必须指定AzureLocation配额是区域性的返回结果包含Limit配额上限与Used当前已用量可用于容量规划与成本预警。5.7 删除工作区// 删除长时间运行操作 await workspace.Value.DeleteAsync(WaitUntil.Completed);删除同样返回 ARM 长操作WaitUntil.Completed会等待资源真正释放完毕。6. 关键类型参考类型用途ArmClient所有 ARM 操作的统一入口PlaywrightWorkspaceResource代表一个 Playwright Testing 工作区PlaywrightWorkspaceCollection工作区 CRUD 的集合客户端PlaywrightWorkspaceData工作区创建/响应载荷PlaywrightWorkspacePatch工作区更新载荷PlaywrightQuotaResource订阅级配额信息PlaywrightWorkspaceQuotaResource工作区级配额信息PlaywrightExtensionsARM 资源的扩展方法GetPlaywrightWorkspaces、GetPlaywrightQuotasAsync等PlaywrightCheckNameAvailabilityContent名称可用性检查请求PlaywrightExtensions值得单独说明ARM SDK 普遍采用扩展方法模式把子资源客户端如resourceGroup.GetPlaywrightWorkspaces()以扩展方法形式挂在父资源上这就是第 4 节资源层级得以用Get*链式导航的底层机制。7. 工作区属性说明属性说明DataplaneUri运行测试的 URI形如https://api.dataplane.{guid}.domain.com测试执行配置的核心依赖WorkspaceId工作区唯一标识GUIDRegionalAffinity启用/禁用测试执行的区域亲和性LocalAuth启用/禁用本地认证访问令牌ProvisioningState当前预配状态Succeeded、Failed 等DataplaneUri是连接管理平面与执行平面的桥梁管理平面创建出的工作区地址正是执行平面跑测试时要去连接的服务地址。8. 与测试执行 SDK 的集成创建好工作区后用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 负责产出DataplaneUri执行 SDK 通过读取PLAYWRIGHT_SERVICE_URL环境变量或等价配置把测试流量导向该工作区从而在云端浏览器上规模化运行。9. 相关 SDK 一览SDK用途安装Azure.ResourceManager.Playwright管理平面本文主题dotnet add package Azure.ResourceManager.PlaywrightAzure.Developer.MicrosoftPlaywrightTesting.NUnit在云端规模化运行 NUnit Playwright 测试dotnet add package Azure.Developer.MicrosoftPlaywrightTesting.NUnit --prereleaseAzure.Developer.PlaywrightPlaywright 客户端库dotnet add package Azure.Developer.Playwright三者的职责边界管理平面管资源NUnit 测试执行包管跑测试Azure.Developer.Playwright则是面向数据平面的客户端库。实际落地时通常组合使用。10. 最佳实践优先WaitUntil.Completed对于必须完成后才能继续后续步骤的操作如创建后立即取DataplaneUri阻塞等待完成需要并行或手动轮询时用WaitUntil.Started让 LRO 立即返回由你自行决定轮询节奏适合多个工作区并行创建等场景始终使用DefaultAzureCredential绝不硬编码密钥本地走 CLI 登录、CI 走服务主体/托管标识处理RequestFailedExceptionARM API 的所有错误都通过该异常向上抛使用CreateOrUpdateAsync做幂等操作同一资源重复提交不会报错天然支持声明式创建通过Get*方法导航层级如resourceGroup.GetPlaywrightWorkspaces()保持与资源树一致创建后妥善保存DataplaneUri它是后续测试执行配置的输入建议持久化到配置中心或环境变量。11. 错误处理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}); }HTTP 状态码映射409冲突典型场景配合ExistsAsync预检后仍出现的资源已存在、400请求不合法参数/载荷校验失败兜底分支输出Status、ErrorCode、Message三要素方便快速定位 ARM 服务端返回的完整错误信息。12. API 信息与适用边界API 信息资源提供程序Resource ProviderMicrosoft.LoadTestService默认 API 版本2025-09-01资源类型Microsoft.LoadTestService/playwrightWorkspaces这说明 Playwright Testing 工作区在 ARM 侧归属于负载测试LoadTestService资源提供程序API 版本由 SDK 内置维护一般无需手工指定。使用时机When to Use本技能适用于执行文档概述中所描述的工作流或操作凡是涉及以代码方式预配/管理 Microsoft Playwright Testing 工作区的任务都属于其适用范围。限制Limitations仅当任务与该技能描述的范围明确匹配时使用本技能不要把输出当作环境特定验证、测试或专家评审的替代品当缺少必要的输入、权限、安全边界或成功标准时应停下来向用户澄清而不是猜测执行。这套范围匹配 → 明确输入 → 设置安全边界 → 定义成功标准的约束也正是本仓库技能体系中 SKILL.md 规范文档 所倡导的技能自描述与自约束模式让 Agent 在复杂任务中既可用、又可审计、又可兜底。将本技能与仓库目录中同源的azure-microsoft-playwright-testing-tsTypeScript 版docs/sources/microsoft-skills-attribution.json 对照使用可以覆盖 .NET 与 TypeScript 两条技术栈的管理平面需求。【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,445 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/gh_mirrors/an/agentic-awesome-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
