Network and APIs

Mock requests, listen to traffic, test APIs, reuse logged-in sessions.

On this page

Network and APIs

Mock and block requests

page.intercept( "**/api/users" ).respondJson( [ "Luis", "Brad" ] )
page.intercept( "**/api/fail" ).respond( 500, "Boom" )
page.intercept( "**/*.{png,jpg}" ).abort()
page.intercept( "**/api/**" ).resume( { headers : { "X-Test" : "1" } } )
page.intercept( "**/api/**" ).handle( ( route ) => route.fallback() )

context.intercept() applies to every page of a context. Patterns are globs, full URLs or page.regex().

Listen

page.onConsole( ( message ) => println( message.type & ": " & message.text ) )
	.onRequest( ( request ) => println( request.method & " " & request.url ) )
	.onResponse( ( response ) => println( response.status & " " & response.url ) )
	.onPageError( ( error ) => println( error.message ) )
	.onDialog( ( dialog ) => dialog.accept() )

API testing

api = playwright().request( { baseURL : "http://localhost:8080" } )
response = api.post( "/api/login", { json : { user : "luis" }, headers : { "X-Token" : "abc" } } )
api.expect( response ).toBeOK()
users = api.get( "/api/users", { params : { page : 2 } } ).json()
api.close()

Options: json, form, data, params, headers, timeout, failOnStatusCode, maxRedirects. Responses have status(), ok(), headers(), text(), json(). context.request() shares the context cookies.

Saved sessions

Log in once, reuse the cookies everywhere:

pw = playwright( { baseURL : "http://localhost:8080" } )
pw.session( "admin", ( page ) => {
	page.visit( "/login" ).fill( "Email", "admin@site.com" ).fill( "Password", "secret" ).click( "Sign in" )
} )
pw.newPage( { session : "admin" } ).visit( "/admin" ).assertSee( "Dashboard" )

Options: maxAge (minutes, 0 = never expires), refresh, context. The setup page always starts clean, even on a manager configured with session. Sessions are stored in {home}/sessions, outside your project, because they hold cookies.

Edit this page Download Markdown Last updated Sep 30, 2026, 7:24:11 PM