📄 playwright-python/dotnet/docs/intro

File: intro.md | Updated: 11/18/2025

Source: https://playwright.dev/dotnet/docs/intro

Skip to main content

On this page

Introduction


Playwright was created specifically to accommodate the needs of end-to-end testing. Playwright supports all modern rendering engines including Chromium, WebKit, and Firefox. Test on Windows, Linux, and macOS, locally or on CI, headless or headed with native mobile emulation.

You can choose to use MSTest, NUnit, or xUnit base classes that Playwright provides to write end-to-end tests. These classes support running tests on multiple browser engines, parallelizing tests, adjusting launch/context options and getting a Page /BrowserContext instance per test out of the box. Alternatively you can use the library to manually write the testing infrastructure.

  1. Start by creating a new project with dotnet new. This will create the PlaywrightTests directory which includes a UnitTest1.cs file:
  • MSTest

  • NUnit

  • xUnit

  • xUnit v3

    dotnet new nunit -n PlaywrightTestscd PlaywrightTests

    dotnet new mstest -n PlaywrightTestscd PlaywrightTests

    dotnet new xunit -n PlaywrightTestscd PlaywrightTests

    dotnet new xunit3 -n PlaywrightTestscd PlaywrightTests

  1. Install the necessary Playwright dependencies:
  • MSTest

  • NUnit

  • xUnit

  • xUnit v3

    dotnet add package Microsoft.Playwright.NUnit

    dotnet add package Microsoft.Playwright.MSTest

    dotnet add package Microsoft.Playwright.Xunit

    dotnet add package Microsoft.Playwright.Xunit.v3

  1. Build the project so the playwright.ps1 is available inside the bin directory:

    dotnet build

  2. Install required browsers. This example uses net8.0, if you are using a different version of .NET you will need to adjust the command and change net8.0 to your version.

    pwsh bin/Debug/net8.0/playwright.ps1 install

If pwsh is not available, you will have to install PowerShell .

Add Example Tests


Edit the UnitTest1.cs file with the code below to create an example end-to-end test:

  • MSTest
  • NUnit
  • xUnit
  • xUnit v3

UnitTest1.cs

using System.Text.RegularExpressions;using System.Threading.Tasks;using Microsoft.Playwright;using Microsoft.Playwright.NUnit;using NUnit.Framework;namespace PlaywrightTests;[Parallelizable(ParallelScope.Self)][TestFixture]public class ExampleTest : PageTest{    [Test]    public async Task HasTitle()    {        await Page.GotoAsync("https://playwright.dev");        // Expect a title "to contain" a substring.        await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));    }    [Test]    public async Task GetStartedLink()    {        await Page.GotoAsync("https://playwright.dev");        // Click the get started link.        await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();        // Expects page to have a heading with the name of Installation.        await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();    } }

UnitTest1.cs

using System.Text.RegularExpressions;using Microsoft.Playwright;using Microsoft.Playwright.MSTest;namespace PlaywrightTests;[TestClass]public class ExampleTest : PageTest{    [TestMethod]    public async Task HasTitle()    {        await Page.GotoAsync("https://playwright.dev");        // Expect a title "to contain" a substring.        await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));    }    [TestMethod]    public async Task GetStartedLink()    {        await Page.GotoAsync("https://playwright.dev");        // Click the get started link.        await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();        // Expects page to have a heading with the name of Installation.        await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();    } }

UnitTest1.cs

using System.Text.RegularExpressions;using Microsoft.Playwright;using Microsoft.Playwright.Xunit;namespace PlaywrightTests;public class UnitTest1: PageTest{    [Fact]    public async Task HasTitle()    {        await Page.GotoAsync("https://playwright.dev");        // Expect a title "to contain" a substring.        await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));    }    [Fact]    public async Task GetStartedLink()    {        await Page.GotoAsync("https://playwright.dev");        // Click the get started link.        await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();        // Expects page to have a heading with the name of Installation.        await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();    } }

UnitTest1.cs

using System.Text.RegularExpressions;using Microsoft.Playwright;using Microsoft.Playwright.Xunit.v3;namespace PlaywrightTests;public class UnitTest1: PageTest{    [Fact]    public async Task HasTitle()    {        await Page.GotoAsync("https://playwright.dev");        // Expect a title "to contain" a substring.        await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));    }    [Fact]    public async Task GetStartedLink()    {        await Page.GotoAsync("https://playwright.dev");        // Click the get started link.        await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();        // Expects page to have a heading with the name of Installation.        await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();    } }

Running the Example Tests


By default tests will be run on Chromium. This can be configured via the BROWSER environment variable, or by adjusting the launch configuration options . Tests are run in headless mode meaning no browser will open up when running the tests. Results of the tests and test logs will be shown in the terminal.

dotnet test

See our doc on Running and Debugging Tests to learn more about running tests in headed mode, running multiple tests, running specific configurations etc.

System requirements


  • Playwright is distributed as a .NET Standard 2.0 library. We recommend .NET 8.
  • Windows 11+, Windows Server 2019+ or Windows Subsystem for Linux (WSL).
  • macOS 14 Ventura, or later.
  • Debian 12, Debian 13, Ubuntu 22.04, Ubuntu 24.04, on x86-64 and arm64 architecture.

What's next