playwright-php / playwright
Modern PHP library for Playwright automation: browsing, scraping, screenshots, testing, and more.
Fund package maintenance!
smnandre
Installs: 202
Dependents: 3
Suggesters: 0
Security: 0
Stars: 10
Watchers: 0
Forks: 1
Open Issues: 0
pkg:composer/playwright-php/playwright
Requires
- php: ^8.2
- psr/clock: ^1.0
- psr/log: ^3.0
- symfony/console: ^6.4 || ^7.3 || ^8.0
- symfony/process: ^6.4 || ^7.3 || ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.40
- monolog/monolog: ^3.9
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^12.3
- symfony/var-dumper: ^6.4 || ^7.3 || ^8.0
This package is auto-updated.
Last update: 2025-11-08 13:21:44 UTC
README
Playwright PHP - Modern Browser Automation
About
Playwright for PHP lets you launch real browsers (Chromium, Firefox, WebKit), drive pages and locators, and write reliable end‑to‑end tests — all from PHP.
- Familiar model: browser → context → page → locator
- Auto‑waiting interactions reduce flakiness
- PHPUnit integration with a base trait and fluent
expect()assertions - Cross‑browser: Chromium, Firefox, and WebKit supported
- No separate server to manage — a lightweight Node server is started for you
Requirements:
- PHP 8.2+
- Node.js 20+ (used by the bundled Playwright server and browsers)
Install
Add the library to your project:
composer require playwright-php/playwright
Install the Playwright browsers (Chromium, Firefox, WebKit):
# Run after composer install in your application or in this repository vendor/bin/playwright-install --browsers # On fresh machines/CI where you need Playwright's OS dependencies too vendor/bin/playwright-install --with-deps # The same commands apply when you work on this repository # (the script lives in vendor/bin/playwright-install here too) # Preview commands without changes vendor/bin/playwright-install --dry-run --with-deps
Quick start
Open a page and print its title:
<?php require __DIR__.'/vendor/autoload.php'; use Playwright\Playwright; $context = Playwright::chromium(['headless' => true]); $page = $context->newPage(); $page->goto('https://example.com'); echo $page->title().PHP_EOL; // Example Domain $context->close();
Usage
Browser
- Choose a browser:
Playwright::chromium(),Playwright::firefox(), orPlaywright::webkit(). Playwright::safari()is an alias ofwebkit().- Common launch options:
headless(bool),slowMo(ms),args(array of CLI args), and an optionalcontextarray with context options.
$context = Playwright::webkit([ 'headless' => false, 'slowMo' => 200, 'args' => ['--no-sandbox'], // 'context' => [ ... context options ... ], ]);
Page
Create pages, navigate, evaluate scripts, and take screenshots:
$page = $context->newPage(); $page->goto('https://example.com'); $html = $page->content(); $title = $page->title(); $path = $page->screenshot(__DIR__.'/screenshot.png');
Locators and interactions
$button = $page->locator('text=Sign in'); $button->click(); $username = $page->locator('#username'); $username->fill('alice@example.com'); $password = $page->locator('#password'); $password->fill('s3cret'); $password->press('Enter');
Storage state and context reuse
$context->storageState(__DIR__.'/state.json'); // Later in another process $ctx = Playwright::chromium([ 'context' => ['storageState' => __DIR__.'/state.json'], ]);
PHPUnit integration
The package provides a testing trait and fluent expect() assertions to write robust E2E tests.
Requirements: PHPUnit 10.0 or higher is required to use the PlaywrightTestCaseTrait.
Minimal example:
<?php use PHPUnit\Framework\TestCase; use Playwright\Testing\PlaywrightTestCaseTrait; final class HomePageTest extends TestCase { use PlaywrightTestCaseTrait; protected function setUp(): void { parent::setUp(); $this->setUpPlaywright(); } protected function tearDown(): void { $this->tearDownPlaywright(); parent::tearDown(); } public function test_title_is_correct(): void { $this->page->goto('https://example.com'); $this->expect($this->page)->toHaveTitle('Example Domain'); } }
Notes:
- The trait provides
$this->playwright,$this->browser,$this->context, and$this->pageproperties. - Call
setUpPlaywright()insetUp()andtearDownPlaywright()intearDown()for proper lifecycle management. - Use
$this->expect($locator)or$this->expect($page)for fluent assertions. - If you prefer full control, you can skip the trait and use the static
Playwrightfacade directly.
CI usage (GitHub Actions)
Example workflow snippet:
jobs: tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.2' - uses: actions/setup-node@v4 with: node-version: '20' - run: composer install --no-interaction --prefer-dist # Install browsers for Playwright PHP - run: vendor/bin/playwright-install --with-deps - run: vendor/bin/phpunit --colors=always
Tips:
- Cache Node and Composer if you need faster builds.
- You can also cache Playwright browsers under
~/.cache/ms-playwright.
Contributing
Contributions are welcome. Please use Conventional Commits, include tests for behavior changes, and ensure docs/examples are updated when relevant. A typical first run inside the repository is:
composer install # installs PHP deps and the bundled Playwright server vendor/bin/playwright-install --with-deps # downloads browsers + optional system deps
See docs/contributing/testing.md for more details on the local workflow.
License
This package is released by the Playwright PHP project under the MIT License. See the LICENSE file for details.