BROWSER

Browser vs Playwright Test

Microsoft's browser automation framework, and its TypeScript test runner.

Compared against Playwright 1.62.1, Browser 20.3.0

This is not really a competition, because Browser library is built on Playwright. Every keyword here ends up as a Playwright call. When Playwright gets faster, we get faster. When it gains an API, we can expose it.

So the honest comparison is not Browser against Playwright. It is Robot Framework against Playwright Test, the TypeScript test runner — two different answers to how do you write and organise tests, over the same automation engine.

What we do not have

First, because a comparison page that lists only its own strengths is marketing.

We have the Playwright API. We do not have Playwright Test. Concretely, expect() and its web-first assertions do not map to Browser keywords 1:1. Playwright's assertion library is large, specific and very well made; Browser's getters cover the same ground for the things people actually assert, but they are not a drop-in translation.

Nor do we have the Playwright Test runner's fixtures, projects, sharded parallelism or HTML report. Robot Framework has its own answers to all of those — but they are Robot Framework's answers, so porting a Playwright Test suite is a rewrite rather than a translation.

What we offer instead

Four things, all of which come from Robot Framework rather than from us.

1. Readability

The same test, written both ways:

*** Settings ***Library    Browser*** Test Cases ***Has Title    New Page    https://playwright.dev/    Get Title    contains    PlaywrightGet Started Link    New Page    https://playwright.dev/    ${element}=    Get Element By Role    LINK    name=Get started    Click    ${element}    ${heading}=    Get Element By Role    HEADING    name=Installation    Get Element States    ${heading}    contains    visibleGet Started Link [Alternative]    New Page    https://playwright.dev/    Click    a >> "Get started"    Get Element States    h1 >> "Installation"    contains    visiblePlaywright Test    New Page    https://playwright.dev/    Get Title    matches   Playwright    Get Attribute    "Get started"    href    ==    /docs/intro    Click    "Get started"    Get Url    matches    .*intro
Robot Framework27 linesUTF-8
import { test, expect } from '@playwright/test';test('has title', async ({ page }) => {  await page.goto('https://playwright.dev/');  await expect(page).toHaveTitle(/Playwright/);});test('get started link', async ({ page }) => {  await page.goto('https://playwright.dev/');  await page.getByRole('link', { name: 'Get started' }).click();  await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();});test('Playwright Test', async ({ page }) => {  await page.goto('https://playwright.dev/');  await expect(page).toHaveTitle(/Playwright/);  const getStarted = page.getByText('Get started');  await expect(getStarted).toHaveAttribute('href', '/docs/intro');  await getStarted.click();  await expect(page).toHaveURL(/.*intro/);});
TypeScript21 linesUTF-8

27 lines vs 21

  • Same engine underneath, same auto-waiting, same role selectors.
  • The Robot Framework file has no async/await, no braces, no arrow functions and no fixture argument.

The right-hand file is good TypeScript. The point is that it is TypeScript: to read it you need to know what async means, why every line needs await, what destructuring { page } does, and what a fixture is. The left-hand file needs none of that.

2. Easier to learn

A tester who has never automated anything can write a useful Robot Framework test on their first day. The syntax is a keyword, then its arguments, separated by spaces.

Reaching the same point in Playwright Test means learning JavaScript's asynchronous model first — not the syntax, the model. A missing await is a test that passes while the application is broken, and it looks nothing like a mistake.

3. Business logic, expressed as business language

Keyword-driven testing is the real feature here, and it is bigger than readability.

You build vocabulary. Log in as an approved supplier, Submit a claim over the excess, The claim should be routed to manual review — each a keyword, composed of other keywords, all the way down to Click. The test reads as the business process, and the log reads the same way: every compound keyword is a collapsible step in the report, not a flattened list of clicks.

That is what makes a Robot Framework report something you can hand to a domain expert. Not the styling — the structure.

4. Cross-technology testing

Robot Framework is a general-purpose automation framework that happens to be very good at web. One suite, one report, one syntax across:

Also in the same testWith

Playwright Test tests web applications. You can call an API from a Playwright test — the request fixture is good — but when one scenario spans a web UI, a message queue and a mainframe, you are assembling a framework. Robot Framework already is one.

Our clear recommendation

We mean this, and we are not burying it in small type at the bottom:

Those four conditions are the whole decision. Break any one of them — a tester who is not a developer, a system that is not only a web application, an auditor who has to read the report — and Robot Framework starts earning its keep. Meet all four, and Playwright Test is the better fit, and we would rather you were productive than loyal.

Thank you

Browser library exists because Playwright exists. The auto-waiting, the role selectors, the trace viewer, three engines under one API — we did not build any of that. We made it available to Robot Framework.

Best regards from our side to an awesome open-source project.