Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

Playwright Test uses worker processes to run UI tests concurrently. By default, separate test files can run in parallel, while tests in a file run in order in the same worker. Set a worker limit to control local or CI load, then make tests independent of shared server-side data: each test gets its own browser context, but that does not isolate accounts, records, or other backend state.

What a Playwright worker does

A worker is an operating-system process managed by Playwright Test. Each worker has its own browser, and workers do not communicate with one another. Playwright creates a separate BrowserContext for each test, which isolates browser-side state such as cookies and local storage. It does not isolate anything your tests mutate on a shared server, database, filesystem, or external service. See the Playwright parallelism documentation.

By default, Playwright runs test files in parallel and runs the tests within a file in order in one worker. If a worker fails, Playwright may restart it; tests that run afterward can therefore execute in a different process. Treat each test as independently runnable rather than relying on a particular worker or execution order.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Set a worker limit

Use workers in the Playwright Test configuration to set a project-wide cap, or pass --workers on the command line. The API reference documents a default of half the logical CPU cores. That is a default, not a speed guarantee or a universally ideal setting; memory, application capacity, and shared test resources can limit useful concurrency. See configuration options and the TestConfig API.

#1 Best Overall
ELEGOO UNO R3 Smart Robot Car Kit V4 with Camera, Compatible with Arduino
  • BUILD, CODE & DRIVE YOUR OWN ROBOT CAR: Turn coding, electronics and engineering into a working programmable robot car you can assemble, program and drive; ideal for weekend family projects, STEM classrooms, coding clubs, robotics lessons and maker challenges
  • EXPLORE FPV, LINE TRACKING & OBSTACLE AVOIDANCE: Control the robot with the ELEGOO app or IR remote, view live FPV video through the onboard camera, follow black lines, avoid obstacles with the ultrasonic sensor and explore multiple interactive driving modes
  • BEGINNER-FRIENDLY BUILD WITH GUIDED WIRING: Keyed XH2.54 connectors help reduce wiring mistakes, while the illustrated tutorial and example programs guide beginners step by step from chassis assembly and module connection to programming and the first successful run
  • GO BEYOND ASSEMBLY WITH CREATIVE CODING: Program with Arduino IDE to explore movement, sensors and control logic, then modify example code to create custom routes, reactions and robotics experiments that develop coding, problem-solving and engineering skills
  • COMPLETE RECHARGEABLE STEM ROBOTICS KIT: Includes an ELEGOO UNO R3 controller board, ESP32-WROVER-based camera and Wi-Fi module, line-tracking and ultrasonic sensors, motors, IR remote and a 2000 mAh rechargeable lithium-ion battery; recommended for ages 8+ with adult guidance for first-time builders

Configure the cap in playwright.config.ts

import { defineConfig } from '@playwright/test';

export default defineConfig({
  workers: process.env.CI ? 2 : undefined,
  // Other test settings go here.
});

This example explicitly caps CI at two workers and leaves the local setting to Playwright’s default. Choose a CI cap based on the runner and the constraints of the system under test, then measure your own suite. If you need a machine-relative limit, Playwright also accepts a percentage of logical CPU cores, such as workers: '50%'.

Override it for one run

npx playwright test --workers=4
npx playwright test --workers=50%

CLI settings are useful for comparing worker caps without editing configuration. Keep the same test selection and environment when comparing runs; a larger worker count can increase contention rather than reduce elapsed time.

Choose the right parallelism granularity

Worker count is only one control. Playwright also lets you choose which tests may run concurrently. The ordinary scheduling unit is the file: files can run in parallel, while tests inside each file remain ordered unless you opt into parallel execution. Parallel tests must not depend on shared in-memory setup or on another test having already run.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Run a describe group in parallel

import { test, expect } from '@playwright/test';

test.describe('independent account views', () => {
  test.describe.configure({ mode: 'parallel' });

  test('shows the account overview', async ({ page }) => {
    await page.goto('/account');
    await expect(page.getByRole('heading', { name: 'Account' })).toBeVisible();
  });

  test('shows notification settings', async ({ page }) => {
    await page.goto('/account/notifications');
    await expect(page.getByRole('heading', { name: 'Notifications' })).toBeVisible();
  });
});

In parallel mode, tests in the group run independently and their hooks execute for each test; do not use a preceding test to prepare state for a later one. The tests above are only safe to run together if their account data and any writes they perform do not conflict.

Use fullyParallel when the whole suite is independent

export default defineConfig({
  fullyParallel: true,
});

fullyParallel makes individual tests eligible for parallel scheduling across files, rather than keeping the file as the scheduling unit. Enable it only when tests can safely run in any order and at the same time. It also affects how work is balanced when the suite is sharded across machines.

Rank #2
ELEGOO Mega 2560 R3 Project The Most Complete Starter Kit with Tutorial
  • 35+ Guided Electronics Projects: Progress from LEDs and buttons to RFID access, real-time clocks, motion and distance sensing, environmental monitoring, motor control and interactive displays for STEM learning, coding clubs and maker projects
  • More I/O and Memory for Larger Builds: The MEGA 2560 R3 provides 54 digital I/O pins, including 15 PWM outputs, 16 analog inputs, 4 hardware serial ports and 256 KB flash for projects that combine more sensors, controls and displays
  • 200+ Components for Prototyping: Includes LCD1602, RC522 RFID, RTC, DHT11, HC-SR501 PIR, ultrasonic and water-level sensors, GY-521, MAX7219, keypad, joystick, rotary encoder, relay, SG90 servo, stepper motor, DC motor, breadboard and more
  • Learn, Modify and Create: Follow 35+ guided lessons with example code, then adjust sensor thresholds, timing, display text, motor behavior and control logic to turn structured exercises into access systems, monitors, alarms and interactive projects
  • Organized for Repeatable Learning: Pre-soldered modules, a solderless breadboard, storage case and small-parts box reduce setup time and keep sensors, LEDs, ICs, wires and other components easy to find between projects

Prevent state collisions

Browser-context isolation is not backend isolation. Two tests can have separate pages and cookies yet overwrite the same user profile, delete the same record, or compete for one inbox. Make the data each test changes unique, or deliberately serialize access to resources that cannot be made unique.

  • Use unique backend records. Give each test its own user, order, or other mutable record. Include a run identifier and test identifier in generated names when useful, and remove test data in teardown where appropriate.
  • Use unique output paths. Screenshots, downloads, traces, and generated files should have test-scoped names or directories so parallel tests cannot overwrite one another.
  • Initialize test data through fixtures. Create the data a test needs as part of its setup instead of relying on another test or a particular test order.
  • Limit concurrency around truly shared resources. If a third-party sandbox, a single test account, or a constrained database cannot safely serve concurrent mutations, use a lower worker cap or a lock. Serialization is safer than pretending separate browser contexts isolate the shared resource.

For authenticated tests that mutate server-side state, Playwright’s authentication guidance recommends a separate account per parallel worker. A shared account can be used when tests do not mutate shared state. See authentication in Playwright.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use worker-scoped fixtures for worker-lifetime resources

A worker-scoped fixture is set up once for a worker and reused by tests assigned to that worker. It suits resources whose creation is expensive and whose lifetime genuinely matches the worker—for example, a worker-specific account or a seeded dataset that tests can safely share. It is not a substitute for test independence: tests that mutate the shared resource still need their own records or a safe coordination strategy. See fixtures.

import { test as base, expect } from '@playwright/test';

type WorkerFixtures = {
  workerAccount: { username: string; password: string };
};

export const test = base.extend<{}, WorkerFixtures>({
  workerAccount: [async ({}, use, workerInfo) => {
    const username = `e2e-${workerInfo.parallelIndex}`;
    const password = process.env.E2E_PASSWORD!;

    // Provision this worker's account using your application's test setup API.
    await provisionAccount(username, password);
    await use({ username, password });
    await removeAccount(username);
  }, { scope: 'worker' }],
});

export { expect };

// In a test file:
test('opens the dashboard', async ({ page, workerAccount }) => {
  await signIn(page, workerAccount);
  await page.goto('/dashboard');
  await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});

provisionAccount, removeAccount, and signIn are application-specific helpers that you must implement; the fixture structure is Playwright Test code. In this example, parallelIndex associates the account with a concurrent slot. If tests running in the same worker would conflict while using that account, give those tests separate accounts or otherwise isolate their mutations.

Choose workerIndex or parallelIndex deliberately

workerInfo.workerIndex identifies a worker process. workerInfo.parallelIndex identifies its concurrent slot and remains stable if Playwright restarts the worker for that slot. Use parallelIndex when you need a stable resource assignment across a worker restart; use workerIndex when you specifically need a unique process identity. The WorkerInfo API documents both values.

Rank #3
Sillbird STEM Robot Building Kit with Remote Control Gifts for Boys 8-13
  • 🎁Ideal Gift for Kids & Teens: Celebrate child’s growing skills and important milestones with this 5-in-1 Programmable robot set. Whether for birthdays, holidays, or achievements, it’s the perfect gift that encourages learning and hands-on fun—a gift that grows with them
  • ✨STEM Educational Toys: The robot set for kids ages 8+ combines the fun of STEM learning. It encourages hands-on learning and early programming as they build, which can spark creativity and imagination and provide hours of screen-free play
  • 📱Flexible Dual Control Modes: Control the Robotic kit with the intuitive app (Bluetooth) or remote. Enjoy fun features like basic programming, path, and precise movement, exploring endless interactive play
  • 🔄 5-in-1 Buildable with Varying Difficulty: The Robot Kit with Progressive Difficulty! From simple robots to complex models, kids can build a robot, dinosaur, car, tank, and more. Adjustable head, arms, and tail allow for fun, playful poses. Perfect for kids 8-12 to develop skills step by step and ignite creativity
  • 🛠️Clear & Detailed Build Instructions: This robot kit includes 488 pieces, with clear, colorful step-by-step instructions to make assembly easy. Kids can build their own robots independently or with family, enjoying quality time together and a confidence-boosting building experience

Use projects for coverage, not as a synonym for workers

Projects represent configurations you want to run, such as browser engines, device profiles, authentication states, or environments. They select and configure test runs; workers control process concurrency. You can run selected projects and apply a project-specific worker limit when one configuration has a tighter shared-resource constraint than the rest. See Playwright projects.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'firefox-limited',
      use: { ...devices['Desktop Firefox'] },
      workers: 1,
    },
  ],
});

Run one project by name with npx playwright test --project=chromium. Project choice, global worker limits, project-level limits, and fullyParallel answer different questions: what configuration to test, how many workers may run, and how finely tests can be scheduled.

Shard a suite across machines

Sharding divides a test run into parts so separate machines or CI jobs can run those parts. Workers are processes on one machine; shards distribute suite work across machines. A shard still has its own worker limit and machine resources. The sharding guide explains the command-line syntax.

npx playwright test --shard=1/3
npx playwright test --shard=2/3
npx playwright test --shard=3/3

These commands define three shard assignments; run each in a separate CI job or machine to distribute execution. Without fullyParallel, balancing is based on test files, so files of very different runtimes can leave shards uneven. With fullyParallel, individual tests provide finer scheduling granularity. Neither setting guarantees a particular speedup: the outcome depends on suite balance, machine capacity, and any shared services the tests use.

Or skip the browser setup

If the task is capturing a site rather than automating its UI, a screenshot API can avoid setting up a Playwright browser worker. ScreenshotNeo is a website screenshot API and MCP server; one GET request returns an image or PDF. The API accepts common screenshot-API parameter names to make switching easier. See the ScreenshotNeo documentation.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
Sale
Sillbird 12-in-1 Solar Robot Building Kit STEM Gift for Boys Ages 8-13
  • 🎁 Ideal Gift for Kids & Teens: This STEM solar robot kit celebrates child’s growing skills and important milestones. Whether for birthdays, holidays, it’s the perfect gift that grows with them and offers screen-free fun
  • 📚 STEM Educational Toy: This solar educational toy brings science to life! The fun DIY building experience sparks children's curiosity in engineering and renewable energy, while nurturing their problem-solving skills
  • ☀️ Powered by the Sun: Enjoy outdoor play with solar power or switch to a strong artificial light source indoors, such as a flashlight, ensuring uninterrupted play for children. This solar build bot toy encourages kids to have fun while exploring renewable energy
  • ⚡ Upgraded Larger Solar Panel: Features a large sun-catching surface to harvest more sunlight and deliver stronger power output. Kids discover renewable energy principles through play - a fun educational toy for ages 8+
  • 🤖 12-in-1 Buildable with Increasing Challenge: With 190 parts, kids can build 12 models like robots, cars, and more. From simple beginners to advanced builds, the varying difficulty levels allow it to grow with your child’s skills. Each robot sparks children’s creativity
curl -G "https://api.screenshotneo.com/v1/shot" 
  -d access_key=YOUR_API_KEY 
  --data-urlencode url=https://stripe.com 
  -o shot.webp

ScreenshotNeo accepts cookie banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers report the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf for AI agents and MCP clients. The free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots.

Sign up for 1,000 free screenshots a month, with no card required.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshooting worker problems

Tests pass alone but fail in parallel

Look for shared external state: reused accounts, records with fixed names, one inbox, or common output paths. Give each test or worker unique resources; if the resource cannot be isolated, serialize the affected tests or reduce workers.

Increasing workers does not make the run faster

More workers can add CPU, memory, browser, and backend load. Try a lower explicit cap and compare runs under the same conditions. The documented default is a starting setting, not a measured optimum for your project.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A worker restart changes test behavior

Do not assume a test will continue in the same process or that process-local state will persist. Initialize required state in fixtures and use parallelIndex rather than workerIndex when assigning resources that should remain tied to a concurrent slot after restart.

One project overloads a shared service

Set a lower workers value on that project or reduce the global cap. Project selection determines which configuration runs; project-specific and global worker limits govern concurrency.

Best Value
Sale
Thames & Kosmos Mega Cyborg Hand STEM Experiment Kit | Build Your Own GIANT Hydraulic Amazing Gripping Capabilities Adjustable for Different Sizes Learn Pneumatic Systems
  • Build your own awesome, wearable mechanical hand that you operate with your own fingers.
  • No motors, no batteries — just the power of air pressure, water, and your own hands!
  • Hydraulic pistons enable the mechanical fingers to open and close and grip objects with enough force to lift them. Every finger joint can be adjusted to different angles for precision movement.
  • Three configurations: right hand, left hand, and claw-like; adjustable to fit virtually any human hand.
  • Learn how pneumatic and hydraulic systems are used in industrial robots such as automobile components..2021 The Toy Association's STEAM Toy Of The Year Winner

CI shards finish at very different times

Unequal test-file runtimes can make file-based shard assignments imbalanced. Enable fullyParallel only if tests are independent and the finer test-level balancing is appropriate for your suite.

Plan reliability, capacity, and cost together

Worker count is a reliability and resource decision as much as a scheduling choice. More parallel processes can increase pressure on the CI machine and on the application, database, email service, or test environment. Sharding can use multiple machines, but requires CI jobs or infrastructure to run those shards and coordinate results. The Playwright documentation describes the controls, not a numerical performance gain or a universal cost break-even point; measure with your own suite and runner.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Before raising concurrency, verify that tests are isolated, the environment can support the extra simultaneous sessions, and failures are not caused by rate limits or shared fixtures. Keep an explicit worker cap in CI when the runner or backend has a known capacity ceiling, and adjust it as that capacity changes.

Frequently Asked Questions

Can Playwright workers share variables or browser state?

No. Workers are independent processes and cannot communicate; each test also gets its own BrowserContext. Use fixtures or external coordination for deliberate shared resources.

Should I always enable fullyParallel?

No. Enable it when individual tests are independent and test-level scheduling is useful, including for finer shard balancing. It is unsafe for tests that depend on order or shared mutable state.

What is the difference between a worker and a shard?

A worker is a test process on one machine. A shard is a portion of the suite assigned to a separate run, commonly on another machine.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Quick Recap

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.