fix(e2e): make server-time element fill width for consistent mask (#283)

* fix(e2e): make server-time element fill width for consistent mask

- Add flex layout to .action p to make server-time stretch
- Add #server-time flex: 1 rule across all basic-server variants
- Update golden screenshots with full-width masked time field

This ensures the Playwright mask covers a consistent width regardless
of the timestamp content, fixing screenshot comparison flakiness.

* fix(e2e): wait for select to be enabled in screenshot generator

Match the logic in servers.spec.ts - wait for select to be enabled
(servers connected) instead of just visible.

* chore: trigger CI re-run
This commit is contained in:
Olivier Chafik 2026-01-19 17:01:55 +00:00 • committed by GitHub
commit fcd243a6f3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 95 additions and 7 deletions

View file

@ -10,3 +10,9 @@ html, body {
code {
font-size: 1em;
}
/* Server time fills remaining width for consistent E2E screenshot masking */
#server-time {
flex: 1;
min-width: 0;
}

View file

@ -28,6 +28,13 @@
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
/* Consistent font for form inputs (inherits from global.css) */
textarea,
input {

View file

@ -10,3 +10,9 @@ html, body {
code {
font-size: 1em;
}
/* Server time fills remaining width for consistent E2E screenshot masking */
#server-time {
flex: 1;
min-width: 0;
}

View file

@ -28,6 +28,13 @@
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
/* Consistent font for form inputs (inherits from global.css) */
textarea,
input {

View file

@ -10,3 +10,9 @@ html, body {
code {
font-size: 1em;
}
/* Server time fills remaining width for consistent E2E screenshot masking */
#server-time {
flex: 1;
min-width: 0;
}

View file

@ -28,6 +28,13 @@
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
/* Consistent font for form inputs (inherits from global.css) */
textarea,
input {

View file

@ -162,6 +162,13 @@ async function handleOpenLink() {
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
textarea,
input {
font-family: inherit;
@ -196,4 +203,10 @@ async function handleOpenLink() {
font-style: normal;
}
}
/* Server time fills remaining width for consistent E2E screenshot masking */
:global(#server-time) {
flex: 1;
min-width: 0;
}
</style>

View file

@ -10,3 +10,9 @@ html, body {
code {
font-size: 1em;
}
/* Server time fills remaining width for consistent E2E screenshot masking */
#server-time {
flex: 1;
min-width: 0;
}

View file

@ -28,6 +28,13 @@
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
/* Consistent font for form inputs (inherits from global.css) */
textarea,
input {

View file

@ -170,6 +170,13 @@ async function handleOpenLink() {
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
textarea,
input {
font-family: inherit;
@ -204,4 +211,10 @@ async function handleOpenLink() {
font-style: normal;
}
}
/* Server time fills remaining width for consistent E2E screenshot masking */
:deep(#server-time) {
flex: 1;
min-width: 0;
}
</style>

View file

@ -10,3 +10,9 @@ html, body {
code {
font-size: 1em;
}
/* Server time fills remaining width for consistent E2E screenshot masking */
#server-time {
flex: 1;
min-width: 0;
}

View file

@ -28,6 +28,13 @@
margin-top: 0.5rem;
}
/* Server time row: flex layout for consistent mask width in E2E tests */
> p {
display: flex;
align-items: baseline;
gap: 0.25em;
}
/* Consistent font for form inputs (inherits from global.css) */
textarea,
input {

View file

@ -10,7 +10,7 @@
* integration-server is excluded (it's for E2E testing, same UI as basic-server-react).
*/
import { test, type Page } from "@playwright/test";
import { test, expect, type Page } from "@playwright/test";
import * as path from "path";
import * as fs from "fs";
import sharp from "sharp";
@ -95,12 +95,9 @@ async function waitForAppLoad(page: Page) {
*/
async function loadServer(page: Page, serverName: string) {
await page.goto("/");
await page
.locator("select")
.nth(0)
.waitFor({ state: "visible", timeout: 30000 });
await page.waitForTimeout(500);
await page.locator("select").nth(0).selectOption({ label: serverName });
// Wait for servers to connect (select becomes enabled when servers are ready)
await expect(page.locator("select").first()).toBeEnabled({ timeout: 30000 });
await page.locator("select").first().selectOption({ label: serverName });
await page.click('button:has-text("Call Tool")');
await waitForAppLoad(page);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before After
Before After

Some files were not shown because too many files have changed in this diff Show more