[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FD7S2ASCKKQH8070P19JRP":3,"skill-same:01M6FD7S2ASCKKQH8070P19JRP":55},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":30,"frontMatter":31,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":35,"repositoryHtmlUrl":36,"repositoryHomepageUrl":37,"ownerHtmlUrl":38,"ownerBlogUrl":6,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M6FD7S2ASCKKQH8070P19JRP","azure-resource-manager-playwright-dotnet",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmicrosoft\u002Fskills\u002Fazure-resource-manager-playwright-dotnet\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27],"playwright","dotnet","azure","azure resource manager playwright dotnet","azure resource manager","2026-11-10 10:12:30",false,"# Azure.ResourceManager.Playwright (.NET)\n\nManagement plane SDK for provisioning and managing Microsoft Playwright Testing workspaces via Azure Resource Manager.\n\n> **⚠️ Management vs Test Execution**\n> - **This SDK (Azure.ResourceManager.Playwright)**: Create workspaces, manage quotas, check name availability\n> - **Test Execution SDK (Azure.Developer.MicrosoftPlaywrightTesting.NUnit)**: Run Playwright tests at scale on cloud browsers\n\n## Installation\n\n```bash\ndotnet add package Azure.ResourceManager.Playwright\ndotnet add package Azure.Identity\n```\n\n**Current Versions**: Stable v1.0.0, Preview v1.0.0-beta.1\n\n## Environment Variables\n\n```bash\nAZURE_SUBSCRIPTION_ID=\u003Cyour-subscription-id>\n# For service principal auth (optional)\nAZURE_TENANT_ID=\u003Ctenant-id>\nAZURE_CLIENT_ID=\u003Cclient-id>\nAZURE_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.Playwright;\n\n\u002F\u002F Always use DefaultAzureCredential\nvar credential = new DefaultAzureCredential();\nvar armClient = new ArmClient(credential);\n\n\u002F\u002F Get subscription\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\");\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\n```\n\n## Resource Hierarchy\n\n```\nArmClient\n└── SubscriptionResource\n    ├── PlaywrightQuotaResource (subscription-level quotas)\n    └── ResourceGroupResource\n        └── PlaywrightWorkspaceResource\n            └── PlaywrightWorkspaceQuotaResource (workspace-level quotas)\n```\n\n## Core Workflow\n\n### 1. Create Playwright Workspace\n\n```csharp\nusing Azure.ResourceManager.Playwright;\nusing Azure.ResourceManager.Playwright.Models;\n\n\u002F\u002F Get resource group\nvar resourceGroup = await subscription\n    .GetResourceGroupAsync(\"my-resource-group\");\n\n\u002F\u002F Define workspace\nvar workspaceData = new PlaywrightWorkspaceData(AzureLocation.WestUS3)\n{\n    \u002F\u002F Optional: Configure regional affinity and local auth\n    RegionalAffinity = PlaywrightRegionalAffinity.Enabled,\n    LocalAuth = PlaywrightLocalAuth.Enabled,\n    Tags =\n    {\n        [\"Team\"] = \"Dev Exp\",\n        [\"Environment\"] = \"Production\"\n    }\n};\n\n\u002F\u002F Create workspace (long-running operation)\nvar workspaceCollection = resourceGroup.Value.GetPlaywrightWorkspaces();\nvar operation = await workspaceCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-playwright-workspace\",\n    workspaceData);\n\nPlaywrightWorkspaceResource workspace = operation.Value;\n\n\u002F\u002F Get the data plane URI for running tests\nConsole.WriteLine($\"Data Plane URI: {workspace.Data.DataplaneUri}\");\nConsole.WriteLine($\"Workspace ID: {workspace.Data.WorkspaceId}\");\n```\n\n### 2. Get Existing Workspace\n\n```csharp\n\u002F\u002F Get by name\nvar workspace = await workspaceCollection.GetAsync(\"my-playwright-workspace\");\n\n\u002F\u002F Or check if exists first\nbool exists = await workspaceCollection.ExistsAsync(\"my-playwright-workspace\");\nif (exists)\n{\n    var existingWorkspace = await workspaceCollection.GetAsync(\"my-playwright-workspace\");\n    Console.WriteLine($\"Workspace found: {existingWorkspace.Value.Data.Name}\");\n}\n```\n\n### 3. List Workspaces\n\n```csharp\n\u002F\u002F List in resource group\nawait foreach (var workspace in workspaceCollection.GetAllAsync())\n{\n    Console.WriteLine($\"Workspace: {workspace.Data.Name}\");\n    Console.WriteLine($\"  Location: {workspace.Data.Location}\");\n    Console.WriteLine($\"  State: {workspace.Data.ProvisioningState}\");\n    Console.WriteLine($\"  Data Plane URI: {workspace.Data.DataplaneUri}\");\n}\n\n\u002F\u002F List across subscription\nawait foreach (var workspace in subscription.GetPlaywrightWorkspacesAsync())\n{\n    Console.WriteLine($\"Workspace: {workspace.Data.Name}\");\n}\n```\n\n### 4. Update Workspace\n\n```csharp\nvar patch = new PlaywrightWorkspacePatch\n{\n    Tags =\n    {\n        [\"Team\"] = \"Dev Exp\",\n        [\"Environment\"] = \"Staging\",\n        [\"UpdatedAt\"] = DateTime.UtcNow.ToString(\"o\")\n    }\n};\n\nvar updatedWorkspace = await workspace.Value.UpdateAsync(patch);\n```\n\n### 5. Check Name Availability\n\n```csharp\nusing Azure.ResourceManager.Playwright.Models;\n\nvar checkRequest = new PlaywrightCheckNameAvailabilityContent\n{\n    Name = \"my-new-workspace\",\n    ResourceType = \"Microsoft.LoadTestService\u002FplaywrightWorkspaces\"\n};\n\nvar result = await subscription.CheckPlaywrightNameAvailabilityAsync(checkRequest);\n\nif (result.Value.IsNameAvailable == true)\n{\n    Console.WriteLine(\"Name is available!\");\n}\nelse\n{\n    Console.WriteLine($\"Name unavailable: {result.Value.Message}\");\n    Console.WriteLine($\"Reason: {result.Value.Reason}\");\n}\n```\n\n### 6. Get Quota Information\n\n```csharp\n\u002F\u002F Subscription-level quotas\nawait foreach (var quota in subscription.GetPlaywrightQuotasAsync(AzureLocation.WestUS3))\n{\n    Console.WriteLine($\"Quota: {quota.Data.Name}\");\n    Console.WriteLine($\"  Limit: {quota.Data.Limit}\");\n    Console.WriteLine($\"  Used: {quota.Data.Used}\");\n}\n\n\u002F\u002F Workspace-level quotas\nvar workspaceQuotas = workspace.Value.GetAllPlaywrightWorkspaceQuota();\nawait foreach (var quota in workspaceQuotas.GetAllAsync())\n{\n    Console.WriteLine($\"Workspace Quota: {quota.Data.Name}\");\n}\n```\n\n### 7. Delete Workspace\n\n```csharp\n\u002F\u002F Delete (long-running operation)\nawait workspace.Value.DeleteAsync(WaitUntil.Completed);\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ArmClient` | Entry point for all ARM operations |\n| `PlaywrightWorkspaceResource` | Represents a Playwright Testing workspace |\n| `PlaywrightWorkspaceCollection` | Collection for workspace CRUD |\n| `PlaywrightWorkspaceData` | Workspace creation\u002Fresponse payload |\n| `PlaywrightWorkspacePatch` | Workspace update payload |\n| `PlaywrightQuotaResource` | Subscription-level quota information |\n| `PlaywrightWorkspaceQuotaResource` | Workspace-level quota information |\n| `PlaywrightExtensions` | Extension methods for ARM resources |\n| `PlaywrightCheckNameAvailabilityContent` | Name availability check request |\n\n## Workspace Properties\n\n| Property | Description |\n|----------|-------------|\n| `DataplaneUri` | URI for running tests (e.g., `https:\u002F\u002Fapi.dataplane.{guid}.domain.com`) |\n| `WorkspaceId` | Unique workspace identifier (GUID) |\n| `RegionalAffinity` | Enable\u002Fdisable regional affinity for test execution |\n| `LocalAuth` | Enable\u002Fdisable local authentication (access tokens) |\n| `ProvisioningState` | Current provisioning state (Succeeded, Failed, etc.) |\n\n## Best Practices\n\n1. **Use `WaitUntil.Completed`** for operations that must finish before proceeding\n2. **Use `WaitUntil.Started`** when you want to poll manually or run operations in parallel\n3. **Always use `DefaultAzureCredential`** — never hardcode keys\n4. **Handle `RequestFailedException`** for ARM API errors\n5. **Use `CreateOrUpdateAsync`** for idempotent operations\n6. **Navigate hierarchy** via `Get*` methods (e.g., `resourceGroup.GetPlaywrightWorkspaces()`)\n7. **Store the DataplaneUri** after workspace creation for test execution configuration\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var operation = await workspaceCollection.CreateOrUpdateAsync(\n        WaitUntil.Completed, workspaceName, workspaceData);\n}\ncatch (RequestFailedException ex) when (ex.Status == 409)\n{\n    Console.WriteLine(\"Workspace already exists\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 400)\n{\n    Console.WriteLine($\"Bad request: {ex.Message}\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Integration with Test Execution\n\nAfter creating a workspace, use the `DataplaneUri` to configure your Playwright tests:\n\n```csharp\n\u002F\u002F 1. Create workspace (this SDK)\nvar workspace = await workspaceCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed, \"my-workspace\", workspaceData);\n\n\u002F\u002F 2. Get the service URL\nvar serviceUrl = workspace.Value.Data.DataplaneUri;\n\n\u002F\u002F 3. Set environment variable for test execution\nEnvironment.SetEnvironmentVariable(\"PLAYWRIGHT_SERVICE_URL\", serviceUrl.ToString());\n\n\u002F\u002F 4. Run tests using Azure.Developer.MicrosoftPlaywrightTesting.NUnit\n\u002F\u002F (separate package for test execution)\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.ResourceManager.Playwright` | Management plane (this SDK) | `dotnet add package Azure.ResourceManager.Playwright` |\n| `Azure.Developer.MicrosoftPlaywrightTesting.NUnit` | Run NUnit Playwright tests at scale | `dotnet add package Azure.Developer.MicrosoftPlaywrightTesting.NUnit --prerelease` |\n| `Azure.Developer.Playwright` | Playwright client library | `dotnet add package Azure.Developer.Playwright` |\n\n## API Information\n\n- **Resource Provider**: `Microsoft.LoadTestService`\n- **Default API Version**: `2025-09-01`\n- **Resource Type**: `Microsoft.LoadTestService\u002FplaywrightWorkspaces`\n\n## Documentation Links\n\n- [Azure.ResourceManager.Playwright API Reference](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fapi\u002Fazure.resourcemanager.playwright)\n- [Microsoft Playwright Testing Overview](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fplaywright-testing\u002Foverview-what-is-microsoft-playwright-testing)\n- [Quickstart: Run Playwright Tests at Scale](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fplaywright-testing\u002Fquickstart-run-end-to-end-tests)\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fmicrosoft\u002Fskills\u002Fazure-resource-manager-playwright-dotnet",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill azure-resource-manager-playwright-dotnet",{"tool":47,"command":48},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill azure-resource-manager-playwright-dotnet",{"tool":50,"command":51},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill azure-resource-manager-playwright-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmicrosoft\u002Fskills\u002Fazure-resource-manager-playwright-dotnet\u002FSKILL.md",true,[],[56,68,78,87,93,100],{"skillNo":57,"name":58,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":64,"publishedAt":28},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[61],{"categoryNo":62,"categoryName":63,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[65,66,67],"model","model hierarchy","model hierarchy skill",{"skillNo":69,"name":70,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":74,"publishedAt":28},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[73],{"categoryNo":62,"categoryName":63,"taxonomyType":20,"taxonomyTypeDesc":21},[75,76,77],"MCP","zoom","zoom mcp",{"skillNo":79,"name":80,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":28},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[84,85,86,76],"sdk","zoom apps sdk","apps",{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":28},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[89],{"skillNo":94,"name":95,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":99,"publishedAt":28},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[98],{"categoryNo":62,"categoryName":63,"taxonomyType":20,"taxonomyTypeDesc":21},[95],{"skillNo":101,"name":102,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":28},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[102]]