Repository navigation
🧰 WebMCP
New page.webmcp() and frame.webmcp() give access to the tools that a page registers through
the experimental WebMCP browser API, so you can test them like
any other part of your app:
Browser browser = chromium.launch(new BrowserType.LaunchOptions()
.setArgs(Arrays.asList("--enable-features=WebMCP")));
Page page = browser.newPage();
page.navigate("https://example.com");
for (WebMCPTool tool : page.webmcp().tools())
System.out.println(tool.name + ": " + tool.description);
Object result = page.webmcp().callTool("add", Map.of("a", 2, "b", 40));
System.out.println(result); // {content=[{type=text, text=42}]}Playwright MCP also supports WebMCP by default, with page-defined tools offered to the agent as webmcp_<tool>. Pass --no-webmcp to opt out.
playwright-cli exposes them as well:
playwright-cli webmcp-list
playwright-cli webmcp-call search_catalog --params '{"query":"cats"}'🎬 Better videos
Videos can now be recorded at a custom frame rate, and the decorations for actions are styled with plain CSS:
page.screencast().start(new Screencast.StartOptions()
.setPath(Paths.get("video.webm"))
.setSize(1920, 1080)
.setFps(60));
page.screencast().showActions(new Screencast.ShowActionsOptions()
.setStyle(new ScreencastActionStyle()
.setPoint("width: 20px; height: 20px; border-radius: 50%; background: red")
.setHighlight("outline: 2px solid #333; background: rgba(0, 128, 255, .15)")
.setTitle("font-size: 16px")));- New
recordVideoFpsoption and newfpsoption in
screencast.start(). Firefox and WebKit currently capture up to 25 frames per second. - New
styleoption takes CSS declarations for thepointmarker, the target
highlightand the actiontitle. It replaces thefontSizeoption, which is now deprecated. - The cursor stays visible at the last action point, survives navigations and travels along a natural, eased path.
- Videos are encoded with VP9 instead of VP8, which takes less CPU and produces smaller files of the same or better
quality. - All video options are also available in Playwright MCP and
playwright-cli.
🪆 Locator.within()
New locator.within() combines two locators that you already have, reading in the natural order —
"this button, within that dialog":
Locator saveButton = page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Save"));
Locator dialog = page.getByTestId("settings-dialog");
saveButton.within(dialog).click();Relative locators such as locator.nth() or locator.first() are resolved inside each parent
separately, which makes column-like queries straightforward:
// The third cell of every row, not the third cell in the table.
Locator thirdColumn = page.getByRole(AriaRole.CELL).nth(2).within(page.getByRole(AriaRole.ROW));
assertThat(thirdColumn).hasText(new String[] {"Apple", "Banana", "Cherry"});New APIs
-
New page.getByRef() locates an element by its aria ref, such as
e2, reported by page.ariaSnapshot() in the"ai"mode. -
New option
includeShadowin page.content() and frame.content() serializes open shadow roots as declarative shadow DOM. -
New option
signCountsets the initial signature counter of a virtual credential. credentials.create() and credentials.get() return the currentsignCount, and it is saved and restored together with the credentials in the storage state. -
New apiRequestContext.addCookies(), apiRequestContext.cookies() and apiRequestContext.clearCookies() manage cookies of a request context, mirroring the BrowserContext methods:
request.addCookies(Arrays.asList( new Cookie("session-id", "42").setUrl("https://example.com"))); System.out.println(request.cookies("https://example.com")); request.clearCookies(new APIRequestContext.ClearCookiesOptions().setName("session-id"));
Breaking Changes ⚠️
- Elements inside hidden iframes are considered hidden. Elements inside an iframe that is not visible, for example with
visibility: hidden, are now considered hidden by actions, locator.isVisible() and assertThat(locator).isVisible().
Browser Versions
- Chromium 156.0.8078.4
- Mozilla Firefox 157.0
- WebKit 27.2
This version was also tested against the following stable channels:
- Google Chrome 155
- Microsoft Edge 155