Skip to main content
rule official · GitHub

playwright-dotnet — GitHub Copilot rule for test generation

This rule guides GitHub Copilot when it creates or edits Playwright tests in C#. Use it to shape test structure, locators, and assertions.

Install into GitHub Copilot · Manually: put the files in place All methods and platforms ↓
.github/instructions/playwright-dotnet.instructions.md
Open on GitHub

What playwright-dotnet does

The rule applies across the project and steers Playwright .NET test generation. It recommends grouping related checks, deriving test classes from PageTest, and naming files with the <FeatureOrPage>Tests.cs pattern. For page interactions, it favors locators based on roles, labels, or text; for checks, it uses retrying Expect() assertions.

The instructions cover NUnit, xUnit, and MSTest, along with grouping actions using Test.StepAsync() and checking accessibility structure with ToMatchAriaSnapshotAsync. Tests can be run with dotnet test, then refined based on failures. Since applyTo is **, the rule can affect Copilot work beyond the test directory.

What it helps with

  • generate Playwright UI tests in C#
  • group checks by application feature
  • choose locators based on roles or text
  • assert a page URL or accessibility structure
  • investigate failures after running dotnet test

Example prompts for the agent

  • Write a C# Playwright test that searches for a movie by title and checks the results.
  • Organize this test into steps and use role-based locators.
  • Check the URL after navigation, then run the tests with dotnet test.

How to install playwright-dotnet

Manually: put the files in place

.github/instructions/playwright-dotnet.instructions.md

The applyTo field sets which files it applies to

Step by step, with commands for each platform: AGENTS.md vs CLAUDE.md: what they are and which one to use

Questions about playwright-dotnet

How do I install playwright-dotnet in GitHub Copilot?

Add .github/instructions/playwright-dotnet.instructions.md to the project.

What does playwright-dotnet do?

It guides Copilot in writing and organizing Playwright .NET tests, including locator choices and assertion style.

Which test frameworks does the rule cover?

Its instructions include NUnit, xUnit, and MSTest setup and test attributes.

Source text

playwright-dotnet.instructions.md · MIT
---
description: 'Playwright .NET test generation instructions'
applyTo: '**'
---

# Playwright .NET Test Generation Instructions

## Test Writing Guidelines

### Code Quality Standards

- **Locators**: Prioritize user-facing, role-based locators (`GetByRole`, `GetByLabel`, `GetByText`, etc.) for resilience and accessibility. Use `await Test.StepAsync()` to group interactions and improve test readability and reporting.
- **Assertions**: Use auto-retrying web-first assertions. These assertions use `Expect()` from Playwright assertions (e.g., `await Expect(locator).ToHaveTextAsync()`). Avoid checking visibility unless specifically testing for visibility changes.
- **Timeouts**: Rely on Playwright's built-in auto-waiting mechanisms. Avoid hard-coded waits or increased default timeouts.
- **Clarity**: Use descriptive test and step titles that clearly state the intent. Add comments only to explain complex logic or non-obvious interactions.

### Test Structure

- **Usings**: Start with `using Microsoft.Playwright;` and either `using Microsoft.Playwright.Xunit;` or `using Microsoft.Playwright.NUnit;` or `using Microsoft.Playwright.MSTest;` for MSTest.
- **Organization**: Create test classes that inherit from `PageTest` (available in NUnit, xUnit, and MSTest packages) or use `IClassFixture<PlaywrightFixture>` for xUnit with custom fixtures. Group related tests for a feature in the same test class.
- **Setup**: Use `[SetUp]` (NUnit), `[TestInitialize]` (MSTest), or constructor initialization (xUnit) for setup actions common to all tests (e.g., navigating to a page).
- **Titles**: Use the appropriate test attribute (`[Test]` for NUnit, `[Fact]` for xUnit, `[TestMethod]` for MSTest) with descriptive method names following C# naming conventions (e.g., `SearchForMovieByTitle`).

### File Organization

- **Location**: Store all test files in a `Tests/` directory or organize by feature.
- **Naming**: Use the convention `<FeatureOrPage>Tests.cs` (e.g., `LoginTests.cs`, `SearchTests.cs`).
- **Scope**: Aim for one test class per major application feature or page.

### Assertion Best Practices

- **UI Structure**: Use `ToMatchAriaSnapshotAsync` to verify the accessibility tree structure of a component. This provides a comprehensive and accessible snapshot.
- **Element Counts**: Use `ToHaveCountAsync` to assert the number of elements found by a locator.
- **Text Content**: Use `ToHaveTextAsync` for exact text matches and `ToContainTextAsync` for partial matches.
- **Navigation**: Use `ToHaveURLAsync` to verify the page URL after an action.

## Example Test Structure

```csharp
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
using static Microsoft.Playwright.Assertions;

namespace PlaywrightTests;

public class MovieSearchTests : PageTest
{
    public override async Task InitializeAsync()
    {
        await base.InitializeAsync();
        // Navigate to the application before each test
        await Page.GotoAsync("https://debs-obrien.github.io/playwright-movies-app");
    }

    [Fact]
    public async Task SearchForMovieByTitle()
    {
        await Test.StepAsync("Activate and perform search", async () =>
        {
            await Page.GetByRole(AriaRole.Search).ClickAsync();
            var searchInput = Page.GetByRole(AriaRole.Textbox, new() { Name = "Search Input" });
            await searchInput.FillAsync("Garfield");
            await searchInput.PressAsync("Enter");
        });

        await Test.StepAsync("Verify search results", async () =>
        {
            // Verify the accessibility tree of the search results
            await Expect(Page.GetByRole(AriaRole.Main)).ToMatchAriaSnapshotAsync(@"
                - main:
                  - heading ""Garfield"" [level=1]
                  - heading ""search results"" [level=2]
                  - list ""movies"":
                    - listitem ""movie"":
                      - link ""poster of The Garfield Movie The Garfield Movie rating"":
                        - /url: /playwright-movies-app/movie?id=tt5779228&page=1
                        - img ""poster of The Garfield Movie""
                        - heading ""The Garfield Movie"" [level=2]
            ");
        });
    }
}
```

## Test Execution Strategy

1. **Initial Run**: Execute tests with `dotnet test` or using the test runner in your IDE
2. **Debug Failures**: Analyze test failures and identify root causes
3. **Iterate**: Refine locators, assertions, or test logic as needed
4. **Validate**: Ensure tests pass consistently and cover the intended functionality
5. **Report**: Provide feedback on test results and any issues discovered

## Quality Checklist

Before finalizing tests, ensure:

- [ ] All locators are accessible and specific and avoid strict mode violations
- [ ] Tests are grouped logically and follow a clear structure
- [ ] Assertions are meaningful and reflect user expectations
- [ ] Tests follow consistent naming conventions
- [ ] Code is properly formatted and commented

© github · MIT · github/awesome-copilot

Similar IDE rules

All IDE rules for Testing and QA →

From the same set861

The whole set →
power-apps-code-apps Guides GitHub Copilot on Power Apps Code Apps standards using TypeScript, React, and Vite. Enforces correct SDK usage, PAC CLI structures, and Power BI embedding. ★ 40,418repo stars power-apps-canvas-yaml This rule guides GitHub Copilot when editing Canvas Apps YAML and Power Fx formulas. Use it to shape screens, controls, components, and data connections. ★ 40,418repo stars playwright-typescript This rule tells Copilot how to write Playwright tests: role-based locators, auto-retrying assertions, one file per feature. Useful when an agent writes the tests. ★ 40,418repo stars playwright-python Guides GitHub Copilot to write Python browser tests with Pytest. Enforces role-based locators, auto-retrying assertions, and clean test structure. ★ 40,418repo stars php-symfony This rule steers Copilot toward official Symfony practices: project layout, dependency injection, Doctrine, Twig and testing. Useful when you keep re-explaining conventions in chat. ★ 40,418repo stars php-mcp-server Instructions for GitHub Copilot on developing Model Context Protocol servers in PHP 8.2+. Guides the assistant to use official SDK attributes and clean project structures. ★ 40,418repo stars performance-optimization This rule helps spot web performance issues tied to Core Web Vitals and review possible fixes. Use it when working on page loading, rendering, or layout stability. ★ 40,418repo stars pcf-tooling A rule that tells Copilot to use Microsoft Power Platform CLI for building, debugging and deploying Power Apps code components. ★ 40,418repo stars

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor