Skip to the content.

🎭 Playwright for Go

PkgGoDev License Go Tests Coverage Status Join DiscordChromium version Firefox version WebKit version

Website | API reference | Example recipes

Playwright is a Go library to automate Chromium, Firefox and WebKit with a single API. Playwright is built to enable cross-browser web automation that is ever-green, capable, reliable and fast.

Β  Linux macOS Windows
Chromium 151.0.7922.34 :white_check_mark: :white_check_mark: :white_check_mark:
WebKit 26.5 :white_check_mark: :white_check_mark: :white_check_mark:
Firefox 153.0 :white_check_mark: :white_check_mark: :white_check_mark:

Headless and headed execution is supported for all the browsers on all platforms.

Installation

go get -u github.com/mxschmitt/playwright-go

Install the Playwright driver and browsers (add --with-deps to also install the OS dependencies). Note that you should replace the version number 0.xxxx.x with the version used in your current go.mod. Each minor version upgrade requires a specific Playwright driver version.

go run github.com/mxschmitt/playwright-go/cmd/playwright@v0.xxxx.x install --with-deps
# Or
go install github.com/mxschmitt/playwright-go/cmd/playwright@v0.xxxx.x
playwright install --with-deps

Alternatively, you can download the driver and browsers from your code. If your operating system lacks the browser dependencies you still need to install them manually, because installing system dependencies requires privileges.

err := playwright.Install()

Documentation

https://playwright.dev/docs/intro

The guides, concepts and API semantics are shared across all Playwright languages β€” only the code samples on that site are written in JavaScript.

API Reference

https://pkg.go.dev/github.com/mxschmitt/playwright-go

Example

The following example crawls the current top voted items from Hacker News.

package main

import (
	"fmt"
	"log"

	"github.com/mxschmitt/playwright-go"
)

func main() {
	pw, err := playwright.Run()
	if err != nil {
		log.Fatalf("could not start playwright: %v", err)
	}
	browser, err := pw.Chromium.Launch()
	if err != nil {
		log.Fatalf("could not launch browser: %v", err)
	}
	page, err := browser.NewPage()
	if err != nil {
		log.Fatalf("could not create page: %v", err)
	}
	if _, err = page.Goto("https://news.ycombinator.com"); err != nil {
		log.Fatalf("could not goto: %v", err)
	}
	entries, err := page.Locator(".athing").All()
	if err != nil {
		log.Fatalf("could not get entries: %v", err)
	}
	for i, entry := range entries {
		title, err := entry.Locator("td.title > span > a").TextContent()
		if err != nil {
			log.Fatalf("could not get text content: %v", err)
		}
		fmt.Printf("%d: %s\n", i+1, title)
	}
	if err = browser.Close(); err != nil {
		log.Fatalf("could not close browser: %v", err)
	}
	if err = pw.Stop(); err != nil {
		log.Fatalf("could not stop Playwright: %v", err)
	}
}

Capabilities

Docker

Refer to the Dockerfile.example to build your own Docker image.

More examples

How does it work?

Playwright is a Node.js library which uses:

These patches are based on the original sources of the browsers and don’t modify the browser behaviour, so the browsers are basically the same (see here) as you see them in the wild. The support for different programming languages is based on exposing a RPC server in the Node.js land which can be used to allow other languages to use Playwright without implementing all the custom logic.

The bridge between Node.js and the other languages is basically a Node.js runtime combined with Playwright which gets shipped for each of these languages (around 50MB) and then communicates over stdio to send the relevant commands. This will also download the pre-compiled browsers.

Other languages

More comfortable in another programming language? Playwright is also available in