Skip to content

v1.64.0

Latest

Choose a tag to compare

@yury-s yury-s released this 21 Oct 16:44
· 1 commit to release-1.64 since this release
d6cc5d5

🧰 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 recordVideoFps option and new fps option in
    screencast.start(). Firefox and WebKit currently capture up to 25 frames per second.
  • New style option takes CSS declarations for the point marker, the target
    highlight and the action title. It replaces the fontSize option, 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

Breaking Changes ⚠️

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