Selenium → Playwright migration

Your Selenium suite is passing. That is not the same as working.

We migrate Selenium suites to Playwright — and find the defects the green build was hiding. Free read-only assessment. Findings with file and line, in 48 hours.

22-test public suite migrated · 5 defects it was passing with · you keep the code

Selenium · mvn test[INFO] Tests run: 25, Failures: 0
[INFO] BUILD SUCCESS
Same run · database| Admin | 0 | ← disabled by the tests
Playwright · npx playwright test26 passed (1.3m) · 4 workers · 0 XPath · 1 login
Same 22 tests1,394563 lines · 23/23 assertions proven to fail
Watch — a real suite, start to finish

A real Selenium suite

22 tests. Page objects. Properly written.

Public repo, Java, TestNG, data-driven. Better structured than most suites we audit.

Run it

Green.

Every test passes. This is what the team sees every day.

Same run, one query later

The suite disabled the admin account — and reported success.

One test clicked the wrong row, saw "Successfully Updated", and passed. Intermittent. Nobody would ever find it.

Migrated to Playwright

Same 22 tests. Every one proven able to fail before it counts.

Runs anywhere, in parallel, from a clean checkout. Admin still works.

Read the five findings ↓
$ mvn test
[INFO] Running testCases.TC001_VerifyApplicationLaunch …
[INFO] Tests run: 25, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
 
mysql> SELECT status FROM ohrm_user WHERE user_name='Admin';
| 0 | ← disabled by the test suite
 
$ npx playwright test
26 passed (1.3m) · 4 workers · 0 XPath · 1 login
mysql> SELECT status FROM ohrm_user WHERE user_name='Admin';
| 1 | ← still enabled
$
Scroll

Green is not proof.

A test that cannot fail is not a test. Most Selenium suites we read have several — and they have been passing for years.

The findings

Five defects one real suite was passing with

Found by migrating it, not by running it. None of these ever goes red.

01

It disables the admin account and reports success

"The second button in the results container", clicked before the search filters. On a slow instance that is row one — Admin. The assertion sees "Successfully Updated" and passes, because a user was updated. The wrong one.

On a shared QA environment this is an outage, caused by the tests, reported as a pass.
02

Enable parallel runs and different tests fail every time

Two static fields carry state between classes. Nothing declares it; only the order in the suite file holds it together. Four identical parallel runs: 7, 3, 2 and 0 failures.

Run four was fully green. A team that sees that run ships it.
03

User creation never waits for the save

It works only because the next assertion happens to block long enough. Move the code — any maintainer eventually will — and three tests downstream fail on a record that was never created.

The failure class Playwright removes by construction: every action and assertion waits.
04

Three validation tests pass whichever field was checked

They assert on the first "Required" hint on the page, not the one for the field under test.

A test that cannot fail correctly.
05

It cannot run on a clean install of its own application

One specific database with two specific employees, two security policies switched off, and a real display session. None of it written down.

No onboarding, no CI, no verifying a restore — without a day of hand-fixing first.

These are not sloppiness. They are what happens to any UI suite that waits on pages instead of records. The same ones turn up in production suites at companies with test teams.

What you get

The same tests, without the things that make them fragile

Lines of test code
1,3940
same 22 tests
XPath locators
590
role and label based instead
UI logins per run
200
session reused across tests
Assertions proven able to fail
0 / 23
each broken once, on record

Before

  • Browser launched and quit for every test
  • Test data hard-coded; tests share records through static fields
  • Setup done by clicking through screens — three-quarters of the runtime
  • Runs on one configured machine, headed only
  • Passes by luck: waits live wherever an assertion happened to block

After

  • One browser per worker, a fresh context per test, safe in parallel
  • Every test creates its own data through the API and cleans up on failure too
  • Components and flows, no page-object inheritance, zero XPath
  • Runs anywhere: local, CI, headless, from a clean checkout
  • Every assertion deliberately broken once and proven to fail before it counts

How it works

Start free. Pay only once you have seen the findings.

Step 1 · Free

Read-only assessment

Read access to the test repo — a collaborator invite or a zip. Within 48 hours: what is done well, what is costing you, what migration would and would not change. Every finding with file and line.

No charge, no obligation
Step 2

Pilot: ten tests, one week

Pick the ten that break most. We convert them, running in your CI. Fixed price agreed up front. You keep the code whatever you decide next.

Fixed price
Step 3

Full migration and handover

The rest of the suite the same way, then a recorded two-hour handover — add a test, read a trace, debug a failure — so your team runs it from day one.

Quoted after the assessment
Optional

Release Guard

A migrated suite decays as features ship. We keep it alive: new coverage, flakes fixed inside a day, nothing merges on red.

Monthly · cancel any month

About MigrateQA

A specialist practice. One job, done properly.

We do Selenium-to-Playwright migrations and nothing else. Playwright is what we work in every day; Selenium is what we spent years maintaining before that.

The engineer who audits your suite is the engineer who migrates it — no handoffs, no juniors, no account managers. Findings in the report are the findings in the pull request. Everything up to the handover call happens asynchronously in your repo and your CI, on hours that overlap UK afternoons and US mornings.

Every number on this page traces to a log. The migration repo — original suite, migrated suite, the Docker environment, the mutation-sweep results including the one we had to throw out — is shared privately with anyone considering an assessment.

How we work

Before trusting a green check, confirm the check can go red. Every migrated test is deliberately broken once and proven to fail before it counts.

Findings say what the evidence supports and no more. When a number cannot be measured cleanly, the report says so instead of rounding up.

Nothing is installed, deleted or run against a client system without being written down first.

Questions

The four things people ask first

Couldn't our own team do this?

Yes. They have had years and haven't, because migration never wins against a feature deadline. You are not buying a skill your team lacks — you are buying the only two weeks anyone will ever spend on it.

Couldn't we just speed up the Selenium suite instead?

Partly. Reusing the browser and running in parallel gets time back — if the tests are independent. On the suite above they were not, and parallelism broke them. Playwright gives you the independence, the built-in waiting, traces on failure and half the code to maintain. The speed is a side effect.

Do you need access to our environments?

No. The assessment is read-only on the test repository. The pilot runs in your CI with credentials you control. Nothing runs against your environments from our side.

What if you disappear halfway?

That is what the pilot is for. Fixed price, one week, and you keep every line of converted code whatever happens next. Nobody has to trust us for a full migration — only for ten tests, once.

Send the repo. Get the findings in 48 hours.

If nothing turns up, you have lost an hour of our time and none of yours.

hello@migrateqa.com