From 91b2050554fdf5e1e095644e76226f32f16fb1e4 Mon Sep 17 00:00:00 2001 From: Mihail Galay Date: Sun, 13 Sep 2026 00:38:30 +0300 Subject: [PATCH 1/4] test: reproduce missing aria snapshot boxes --- src/Playwright.Tests/PageAriaSnapshotTests.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Playwright.Tests/PageAriaSnapshotTests.cs b/src/Playwright.Tests/PageAriaSnapshotTests.cs index c2d1eb443..96c580466 100644 --- a/src/Playwright.Tests/PageAriaSnapshotTests.cs +++ b/src/Playwright.Tests/PageAriaSnapshotTests.cs @@ -22,10 +22,45 @@ * SOFTWARE. */ +using NUnit.Framework; + namespace Microsoft.Playwright.Tests; public class PageAriaSnapshotTests : PageTestEx { + [PlaywrightTest] + [TestCase(AriaSnapshotMode.Default)] + [TestCase(AriaSnapshotMode.Ai)] + public async Task ShouldIncludeBoundingBoxesInPageSnapshot(AriaSnapshotMode mode) + { + await Page.SetContentAsync(""); + + var snapshot = await Page.AriaSnapshotAsync(new() { Mode = mode }); + StringAssert.DoesNotContain("[box=", snapshot); + Assert.AreEqual(snapshot, await Page.AriaSnapshotAsync(new() { Mode = mode, Boxes = false })); + + var snapshotWithBoxes = await Page.AriaSnapshotAsync(new() { Mode = mode, Boxes = true }); + StringAssert.Contains("[box=20,30,100,40]", snapshotWithBoxes); + Assert.AreEqual(snapshot, await Page.AriaSnapshotAsync(new() { Mode = mode, Boxes = false })); + } + + [PlaywrightTest] + [TestCase(AriaSnapshotMode.Default)] + [TestCase(AriaSnapshotMode.Ai)] + public async Task ShouldIncludeBoundingBoxesInLocatorSnapshot(AriaSnapshotMode mode) + { + await Page.SetContentAsync(""); + var locator = Page.GetByRole(AriaRole.Button); + + var snapshot = await locator.AriaSnapshotAsync(new() { Mode = mode }); + StringAssert.DoesNotContain("[box=", snapshot); + Assert.AreEqual(snapshot, await locator.AriaSnapshotAsync(new() { Mode = mode, Boxes = false })); + + var snapshotWithBoxes = await locator.AriaSnapshotAsync(new() { Mode = mode, Boxes = true }); + StringAssert.Contains("[box=20,30,100,40]", snapshotWithBoxes); + Assert.AreEqual(snapshot, await locator.AriaSnapshotAsync(new() { Mode = mode, Boxes = false })); + } + private string _unshift(string snapshot) { var lines = snapshot.Split('\n'); From e555d3f0c9d795faa06fbd3ff7ee5d1ca83afac3 Mon Sep 17 00:00:00 2001 From: Mihail Galay Date: Sun, 13 Sep 2026 00:43:57 +0300 Subject: [PATCH 2/4] fix: forward boxes option in aria snapshots --- src/Playwright.Tests/PageAriaSnapshotTests.cs | 2 -- src/Playwright/Core/Locator.cs | 1 + src/Playwright/Core/Page.cs | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Playwright.Tests/PageAriaSnapshotTests.cs b/src/Playwright.Tests/PageAriaSnapshotTests.cs index 96c580466..b9b9a6f87 100644 --- a/src/Playwright.Tests/PageAriaSnapshotTests.cs +++ b/src/Playwright.Tests/PageAriaSnapshotTests.cs @@ -22,8 +22,6 @@ * SOFTWARE. */ -using NUnit.Framework; - namespace Microsoft.Playwright.Tests; public class PageAriaSnapshotTests : PageTestEx diff --git a/src/Playwright/Core/Locator.cs b/src/Playwright/Core/Locator.cs index 10be5e4f8..0451c9fec 100644 --- a/src/Playwright/Core/Locator.cs +++ b/src/Playwright/Core/Locator.cs @@ -674,6 +674,7 @@ public async Task AriaSnapshotAsync(LocatorAriaSnapshotOptions? options ["selector"] = _selector, ["mode"] = options?.Mode, ["depth"] = options?.Depth, + ["boxes"] = options?.Boxes, }, timeout: _frame.Timeout(options?.Timeout)).ConfigureAwait(false); return result!.Value.GetProperty("snapshot").ToString(); diff --git a/src/Playwright/Core/Page.cs b/src/Playwright/Core/Page.cs index a395384f0..c4aa49e6f 100644 --- a/src/Playwright/Core/Page.cs +++ b/src/Playwright/Core/Page.cs @@ -1572,6 +1572,7 @@ public async Task AriaSnapshotAsync(PageAriaSnapshotOptions? options = d { ["mode"] = options?.Mode, ["depth"] = options?.Depth, + ["boxes"] = options?.Boxes, }, timeout: MainFrame.Timeout(options?.Timeout)).ConfigureAwait(false); return result!.Value.GetProperty("snapshot").ToString(); From e8df8ad766cfd75c81f11c2ba9355895c2bb7a57 Mon Sep 17 00:00:00 2001 From: Mihail Galay Date: Sun, 13 Sep 2026 00:53:40 +0300 Subject: [PATCH 3/4] test: check omitted boxes after an enabled snapshot --- src/Playwright.Tests/PageAriaSnapshotTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Playwright.Tests/PageAriaSnapshotTests.cs b/src/Playwright.Tests/PageAriaSnapshotTests.cs index b9b9a6f87..0aca8b6f7 100644 --- a/src/Playwright.Tests/PageAriaSnapshotTests.cs +++ b/src/Playwright.Tests/PageAriaSnapshotTests.cs @@ -39,7 +39,7 @@ public async Task ShouldIncludeBoundingBoxesInPageSnapshot(AriaSnapshotMode mode var snapshotWithBoxes = await Page.AriaSnapshotAsync(new() { Mode = mode, Boxes = true }); StringAssert.Contains("[box=20,30,100,40]", snapshotWithBoxes); - Assert.AreEqual(snapshot, await Page.AriaSnapshotAsync(new() { Mode = mode, Boxes = false })); + Assert.AreEqual(snapshot, await Page.AriaSnapshotAsync(new() { Mode = mode })); } [PlaywrightTest] @@ -56,7 +56,7 @@ public async Task ShouldIncludeBoundingBoxesInLocatorSnapshot(AriaSnapshotMode m var snapshotWithBoxes = await locator.AriaSnapshotAsync(new() { Mode = mode, Boxes = true }); StringAssert.Contains("[box=20,30,100,40]", snapshotWithBoxes); - Assert.AreEqual(snapshot, await locator.AriaSnapshotAsync(new() { Mode = mode, Boxes = false })); + Assert.AreEqual(snapshot, await locator.AriaSnapshotAsync(new() { Mode = mode })); } private string _unshift(string snapshot) From e4f0ff3d96c1363f4715c571be0a45f42b32593b Mon Sep 17 00:00:00 2001 From: Mihail Galay Date: Sun, 13 Sep 2026 01:00:00 +0300 Subject: [PATCH 4/4] chore: order driver downloader methods to satisfy SA1204 --- .../Playwright.Tooling/DriverDownloader.cs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/tools/Playwright.Tooling/DriverDownloader.cs b/src/tools/Playwright.Tooling/DriverDownloader.cs index 2df90abea..a711f0ed7 100644 --- a/src/tools/Playwright.Tooling/DriverDownloader.cs +++ b/src/tools/Playwright.Tooling/DriverDownloader.cs @@ -144,6 +144,24 @@ private static async Task WithRetriesAsync(string url, Func action) } } + private static string ResolveNpmExecutable() + { + string name = OperatingSystem.IsWindows() ? "npm.cmd" : "npm"; + // On Windows npm.cmd must be started by its full path: launched by bare name, + // the script's %~dp0 expands to the working directory instead of its own + // directory and it fails to find node_modules/npm/bin/npm-cli.js. + string path = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; + foreach (string directory in path.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries)) + { + string candidate = Path.Combine(directory.Trim('"'), name); + if (File.Exists(candidate)) + { + return candidate; + } + } + return name; + } + private async Task ExecuteAsync() { var driversDirectory = new DirectoryInfo(Path.Combine(BasePath, "src", "Playwright", ".drivers")); @@ -186,24 +204,6 @@ private async Task ExecuteAsync() return true; } - private static string ResolveNpmExecutable() - { - string name = OperatingSystem.IsWindows() ? "npm.cmd" : "npm"; - // On Windows npm.cmd must be started by its full path: launched by bare name, - // the script's %~dp0 expands to the working directory instead of its own - // directory and it fails to find node_modules/npm/bin/npm-cli.js. - string path = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; - foreach (string directory in path.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries)) - { - string candidate = Path.Combine(directory.Trim('"'), name); - if (File.Exists(candidate)) - { - return candidate; - } - } - return name; - } - private async Task DownloadPlaywrightPackageAsync(string driversDirectory) { // Fetched with `npm pack` rather than a hard-coded registry URL so that the