From 8b30ab5a6db1c7d7cfdb864c33ba93793e30f75c Mon Sep 17 00:00:00 2001 From: ilia Date: Wed, 15 Jul 2026 18:17:02 -0400 Subject: [PATCH] Add resilient UI helpers for third-party / adversarial SPAs. Generalize patterns from LinkedIn automation: aria-label regex locators, dialog reopen-retry, contenteditable typing, persistent flag-file sessions, and a default noise exclude preset for NetworkErrorMonitor. --- CHANGELOG.md | 6 ++ README.md | 57 +++++++++++ ROADMAP.md | 10 ++ src/browser/aria.test.ts | 67 +++++++++++++ src/browser/aria.ts | 67 +++++++++++++ src/browser/dialog.test.ts | 56 +++++++++++ src/browser/dialog.ts | 50 ++++++++++ src/browser/index.ts | 14 +++ src/browser/network.test.ts | 34 +++++++ src/browser/network.ts | 27 ++++- src/browser/persistentSession.test.ts | 137 ++++++++++++++++++++++++++ src/browser/persistentSession.ts | 131 ++++++++++++++++++++++++ src/browser/richText.test.ts | 59 +++++++++++ src/browser/richText.ts | 57 +++++++++++ src/index.ts | 13 +++ 15 files changed, 784 insertions(+), 1 deletion(-) create mode 100644 src/browser/aria.test.ts create mode 100644 src/browser/aria.ts create mode 100644 src/browser/dialog.test.ts create mode 100644 src/browser/dialog.ts create mode 100644 src/browser/persistentSession.test.ts create mode 100644 src/browser/persistentSession.ts create mode 100644 src/browser/richText.test.ts create mode 100644 src/browser/richText.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index bc5ca2d..3d61f19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +- **Resilient UI automation helpers** — for driving third-party/adversarial SPAs (no stable test ids, occasional bot walls) rather than your own instrumented app: + - `byAriaLabel()` / `clickByAriaLabel()` — find/click by a regex over `aria-label`, scoped to a `Page` or a narrower `Locator` (e.g. one dialog) + - `withDialog()` — retry an action against a modal that might have silently closed, reopening it first via a caller-supplied `reopen()` + - `fillContentEditable()` — type into `contenteditable` rich-text fields (not just `