Files
ScadaBridge/docs/test_infra/test_infra_playwright.md
T
Joseph Doherty 7b0b9c7365 refactor: rename ScadaLink → ZB.MOM.WW.ScadaBridge (code + projects + namespaces)
Solution + 23 src projects + 26 test projects renamed; folders, csproj,
namespaces, and ScadaLinkDbContext/ScadaBridgeDbContext class updated.
ActorSystem "scadalink" → "scadabridge", Akka seed-node URLs migrated.
SQL roles/logins, LDAP domains, CLI command name, and CLI config dir
(~/.scadalink → ~/.scadabridge) also renamed.

Build green; 5 Host.Tests fail awaiting SQL login rename in next commit.
Pre-existing StaleTagMonitor timing flakes unchanged.

Rename script committed at tools/rename-to-scadabridge.sh.
2026-05-28 09:37:45 -04:00

3.9 KiB

Test Infrastructure: Playwright Browser Server

Overview

The Playwright browser server provides a remote headless browser (Chromium, Firefox, WebKit) that test scripts connect to over the network. It runs as a Playwright Server on port 3000, allowing UI tests for the Central UI (Blazor Server) to run from the host machine while the browser executes inside the container with access to the Docker network.

Image & Ports

  • Image: mcr.microsoft.com/playwright:v1.58.2-noble (Ubuntu 24.04 LTS)
  • Server port: 3000 (Playwright Server WebSocket endpoint)

Configuration

Setting Value Description
--host 0.0.0.0 Bind address Listen on all interfaces
--port 3000 Server port Playwright Server WebSocket port
ipc: host Docker IPC Shared IPC namespace (required for Chromium)

No additional config files are needed. The container runs npx playwright run-server on startup.

Connecting from Test Scripts

Test scripts run on the host and connect to the browser server via WebSocket. The connection URL is:

ws://localhost:3000

.NET (Microsoft.Playwright)

using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.ConnectAsync("ws://localhost:3000");
var page = await browser.NewPageAsync();

// Browser runs inside Docker — use the Docker network hostname for Traefik.
await page.GotoAsync("http://scadabridge-traefik");

Node.js

const { chromium } = require('playwright');
const browser = await chromium.connect('ws://localhost:3000');
const page = await browser.newPage();
await page.goto('http://scadabridge-traefik');

Python

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.connect("ws://localhost:3000")
    page = browser.new_page()
    page.goto("http://scadabridge-traefik")

Central UI Access

The Playwright container is on the scadabridge-net Docker network, so it can reach the Central UI cluster nodes directly:

Target URL in Test Scripts
Traefik LB http://scadabridge-traefik
Central Node A http://scadabridge-central-a:5000
Central Node B http://scadabridge-central-b:5000

Important: The browser runs inside the Docker container, so page.goto() URLs must use Docker network hostnames (not localhost). The test script itself connects to the Playwright server via ws://localhost:3000 (host-mapped port), but all URLs navigated by the browser resolve inside the container.

Verification

  1. Check the container is running:
docker ps --filter name=scadabridge-playwright
  1. Check the server is accepting connections (look for the WebSocket endpoint in logs):
docker logs scadabridge-playwright 2>&1 | head -5
  1. Quick smoke test with a one-liner (requires npx and playwright on the host):
npx playwright@1.58.2 test --browser chromium --connect ws://localhost:3000

Relevance to ScadaBridge Components

  • Central UI — end-to-end UI testing of all Blazor Server pages (login, admin, design, deployment, monitoring workflows).
  • Traefik Proxy — verify load balancer behavior, failover, and active node routing from a browser perspective.

Notes

  • The container includes Chromium, Firefox, and WebKit. Connect to the desired browser via playwright.chromium.connect(), playwright.firefox.connect(), or playwright.webkit.connect().
  • The ipc: host flag is required for Chromium to avoid out-of-memory crashes in the container.
  • The Playwright Server version (1.58.2) must match the @playwright package version used by test scripts on the host.
  • The container is stateless — no test data or browser state persists between restarts.
  • To stop only the Playwright container: cd infra && docker compose stop playwright.