| name | azure-resource-manager-playwright-dotnet |
| description | ALWAYS use this when the request matches Azure Resource Manager Playwright Dotnet: Azure Resource Manager SDK for Microsoft Playwright Testing in .NET. |
Azure.ResourceManager.Playwright (.NET)
Selective Reading Rule
Start with:
references/senior-master-standard.md
references/usage-routing.md
references/quality-checklist.md
Then load only the inherited docs, scripts, assets, or examples that match the user's actual task.
Management plane SDK for provisioning and managing Microsoft Playwright Testing workspaces via Azure Resource Manager.
⚠️ Management vs Test Execution
- This SDK (Azure.ResourceManager.Playwright): Create workspaces, manage quotas, check name availability
- Test Execution SDK (Azure.Developer.MicrosoftPlaywrightTesting.NUnit): Run Playwright tests at scale on cloud browsers
Installation
dotnet add package Azure.ResourceManager.Playwright
dotnet add package Azure.Identity
Current Versions: Stable v1.0.0, Preview v1.0.0-beta.1
Environment Variables
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>
Authentication
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Playwright;
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
Resource Hierarchy
ArmClient
└── SubscriptionResource
├── PlaywrightQuotaResource (subscription-level quotas)
└── ResourceGroupResource
└── PlaywrightWorkspaceResource
└── PlaywrightWorkspaceQuotaResource (workspace-level quotas)
Core Workflow
1. Create Playwright Workspace
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;
Console.WriteLine($"Data Plane URI: {workspace.Data.DataplaneUri}");
Console.WriteLine($"Workspace ID: {workspace.Data.WorkspaceId}");
2. Get Existing Workspace
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. List Workspaces
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}");
}
4. Update Workspace
var patch = new PlaywrightWorkspacePatch
{
Tags =
{
["Team"] = "Dev Exp",
["Environment"] = "Staging",
["UpdatedAt"] = DateTime.UtcNow.ToString("o")
}
};
var updatedWorkspace = await workspace.Value.UpdateAsync(patch);
5. Check Name Availability
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}");
}
6. Get Quota Information
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. Delete Workspace
await workspace.Value.DeleteAsync(WaitUntil.Completed);
Key Types Reference
| Type | Purpose |
|---|
ArmClient | Entry point for all ARM operations |
PlaywrightWorkspaceResource | Represents a Playwright Testing workspace |
PlaywrightWorkspaceCollection | Collection for workspace CRUD |
PlaywrightWorkspaceData | Workspace creation/response payload |
PlaywrightWorkspacePatch | Workspace update payload |
PlaywrightQuotaResource | Subscription-level quota information |
PlaywrightWorkspaceQuotaResource | Workspace-level quota information |
PlaywrightExtensions | Extension methods for ARM resources |
PlaywrightCheckNameAvailabilityContent | Name availability check request |
Workspace Properties
| Property | Description |
|---|
DataplaneUri | URI for running tests (e.g., https://api.dataplane.{guid}.domain.com) |
WorkspaceId | Unique workspace identifier (GUID) |
RegionalAffinity | Enable/disable regional affinity for test execution |
LocalAuth | Enable/disable local authentication (access tokens) |
ProvisioningState | Current provisioning state (Succeeded, Failed, etc.) |
Best Practices
- Use
WaitUntil.Completed for operations that must finish before proceeding
- Use
WaitUntil.Started when you want to poll manually or run operations in parallel
- Always use
DefaultAzureCredential — never hardcode keys
- Handle
RequestFailedException for ARM API errors
- Use
CreateOrUpdateAsync for idempotent operations
- Navigate hierarchy via
Get* methods (e.g., resourceGroup.GetPlaywrightWorkspaces())
- Store the DataplaneUri after workspace creation for test execution configuration
Error Handling
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}");
}
Integration with Test Execution
After creating a workspace, use the DataplaneUri to configure your Playwright tests:
var workspace = await workspaceCollection.CreateOrUpdateAsync(
WaitUntil.Completed, "my-workspace", workspaceData);
var serviceUrl = workspace.Value.Data.DataplaneUri;
Environment.SetEnvironmentVariable("PLAYWRIGHT_SERVICE_URL", serviceUrl.ToString());
Related SDKs
| SDK | Purpose | Install |
|---|
Azure.ResourceManager.Playwright | Management plane (this SDK) | dotnet add package Azure.ResourceManager.Playwright |
Azure.Developer.MicrosoftPlaywrightTesting.NUnit | Run NUnit Playwright tests at scale | dotnet add package Azure.Developer.MicrosoftPlaywrightTesting.NUnit --prerelease |
Azure.Developer.Playwright | Playwright client library | dotnet add package Azure.Developer.Playwright |
API Information
- Resource Provider:
Microsoft.LoadTestService
- Default API Version:
2025-09-01
- Resource Type:
Microsoft.LoadTestService/playwrightWorkspaces
Documentation Links
When to Use
This skill is applicable to execute the workflow or actions described in the overview.
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.