Playwright on GitHub Actions: faster E2E runs with browsers that stay installed
Your Playwright suite takes far longer on GitHub Actions than on your laptop, and the team waits for the slow one on every pull request. Part of the gap is setup: each job downloads three browsers and installs their system packages before the first test. The rest is cores: on a private repository's ubuntu-latest, Playwright runs one worker.
Skipbox runs the same workflow on your account's own machine, where the browsers stay installed between jobs and a job gets up to 16 vCPU, for a flat $39 a month with unlimited minutes. Moving is one line, runs-on: skipbox.
How Playwright runs on GitHub Actions
Playwright's own CI setup is three commands in one job: npm ci, npx playwright install --with-deps (the browsers and the system packages they need), and npx playwright test, with the HTML report uploaded as an artifact even when tests fail. npm init playwright@latest writes it to .github/workflows/playwright.yml.
Two things set its speed:
| GitHub-hosted runner | Skipbox | |
|---|---|---|
| Browsers | Downloaded and installed on every job. Playwright advises against caching them, since a restore takes about as long | Stay installed on your machine between jobs |
| Workers (default: half the cores) | 1 on a private repository's 2-core ubuntu-latest | Half of 4, 8 or 16 vCPU, by label |
Sharding with --shard=1/4 splits the suite across jobs, but each shard repeats npm ci and the browser install, and on per-minute billing each shard's setup is billed again.
What a slow suite costs
End-to-end tests are the last check before merge, so the whole team waits on them. A 20-minute suite on 30 pull request pushes a day is 10 hours of waiting, and the same suite on a loop against staging runs all day. Flaky failures that only show up on a slow runner add re-runs on top.
On per-minute billing every one of those minutes is billed:
| Minutes a month (4 vCPU) | GitHub | Skipbox S | You save each month |
|---|---|---|---|
| 10,000 | $102 | $39 | $63 |
| 20,000 | $222 | $39 | $183 |
| 30,000 | $342 | $39 | $303 |
| Always on | $500.40 | $39 | $461.40 |
GitHub's figures are after GitHub Team's included usage. Your own minutes go in the calculator on the home page.
E2E minutes are growing fastest. Coding agents open pull requests at all hours, each one runs the suite, and teams that used to run E2E nightly now run it on every push.
Making it fast yourself
On GitHub-hosted runners, the usual list:
- Shard the suite across a matrix, then merge the blob reports in a final job
- Raise timeouts, because a 2-core runner renders slower than a laptop
- Switch to Playwright's Docker image and keep its tag in step with your Playwright version
- Pay for larger runners per minute, or run your own self-hosted runner and keep its browsers, packages and OS up to date
Each step is more YAML to own and more minutes to pay. Skipbox keeps the browsers on the disk and gives the job the cores.
What Skipbox gives your suite
Browsers that stay. Each plan comes with your account's own machine, kept between jobs. Playwright's browsers in ~/.cache/ms-playwright, npm's cache and your Docker images are on the disk when the next job starts, so npx playwright install --with-deps finds them there.
Workers that scale. Pick the size by label. More vCPU means more default workers, and more memory means more browsers open at once:
| Label | Machine | Price |
|---|---|---|
skipbox | 4 vCPU · 16 GB | $39 a month (S) |
skipbox-8x16 | 8 vCPU · 16 GB | $79 a month (M) |
skipbox-16x32 | 16 vCPU · 32 GB | $149 a month (L) |
Unlimited minutes. Shards, retries and re-runs don't change the bill, and Skipbox jobs use no GitHub minutes, so a GitHub budget never stops them.
Nothing to maintain. The image is Ubuntu 24.04 with passwordless sudo and the system libraries Playwright's browsers need. Skipbox updates it, cleans up after every job, and rebuilds a machine that fails its health check.
Moving is one line
name: Playwright Tests
on: [push, pull_request]
jobs:
test:
runs-on: skipbox # was ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: lts/*
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
- uses: actions/upload-artifact@v5
if: "!cancelled()"
with:
name: playwright-report
path: playwright-report/
- Sign in to Skipbox with GitHub.
- Install the Skipbox GitHub App and pick the repositories.
- Change
runs-onand push.
Security
- The machine is your account's alone. No other company's jobs run on it.
- After every job, the runner's credentials, processes and containers are wiped. The browsers and caches stay. From 13 November 2026, your checkout and its build output (Cargo's
target/) stay on your own machine for your next jobs; Clean every job gives each job a fresh machine. - Code from people without write access (such as pull requests from forks) runs on a fresh, throwaway machine.
The details are in how jobs are isolated.
Try it
The trial is free for 7 days or 3,000 job-minutes, whichever comes first, with no card. Change the Playwright job to runs-on: skipbox, run it twice, and compare the second run's step timings with GitHub's.
FAQ
How do I run Playwright tests in GitHub Actions?
In one job: npm ci, npx playwright install --with-deps, npx playwright test, then upload the playwright-report folder as an artifact in a step that runs even when tests fail. npm init playwright@latest writes that workflow for you. To run it on Skipbox, change runs-on to skipbox.
Why are Playwright tests slow on GitHub Actions?
Two reasons. Every job starts on a new VM, so it downloads Chromium, Firefox and WebKit and installs their system packages before the first test. And Playwright's default workers are half the CPU cores, which is 1 worker on a private repository's 2-core ubuntu-latest. Skipbox keeps the browsers on your machine between jobs and gives a job 4, 8 or 16 vCPU.
Should I cache Playwright browsers in GitHub Actions?
Playwright advises against it on runners that start from a new VM: restoring the cache takes about as long as downloading the browsers, and on Linux the system packages can't be cached. On Skipbox there is nothing to cache. The browsers stay in ~/.cache/ms-playwright on your machine, and the next job finds them there.
How many workers does Playwright use on GitHub Actions?
By default half of the machine's logical CPU cores: 1 on a private repository's ubuntu-latest, which has 2. Each worker drives its own browser, so more workers need more cores and more memory. On Skipbox, runs-on: skipbox-8x16 gives 8 vCPU and 16 GB.
Can I try Playwright on Skipbox for free?
Yes. The trial is 7 days or 3,000 job-minutes, whichever comes first, with no card, on 4 vCPU and 16 GB. Change the Playwright job's runs-on to skipbox and run it twice.
Updated November 11, 2026