fix(webdriver): replace text in the confirmed focused element

BH
8m ago
+270-58

Summary

Addresses #3985 across 11 files. WebDriver fill clears/replaces the confirmed focused element; empty fill clears, failed clear stops input, and type stays append-only. Missing references refuse. No e2e freshness changes.

Workflow

flowchart LR
  F[fill] --> R[Confirm focused element]
  R --> C[Clear same element]
  C -->|failure| E[Error]
  C -->|nonempty| V[Replace same element]
  C -->|empty| D[Done]
  T[type] --> A[Append]

Validation

Head: c8d38888df2950d46d13d858c554f3be2910c653; rebased base: 0b49de4dfd092a86c0d99d5fcb3dcd976d6ccc9b (includes #3997).

  • Five regressions: base 4 failed/1 passed; head 5 passed.
  • 110 unit + 18 provider/facade passed; docs passed.
  • Affected receipt run-zlf32t, exactCommit:true: format/lint/types/layering/Fallow/build passed; related 2020 passed/1 failed, base 2008/1, same Apple fake-record timeout. Gate failed.
  • Full Cubic review requested; CI running. Vercel needs maintainer authorization.

Hosted proof — unmodified head

Public Swag Labs 2.7.1, My Demo App 2.3.0 and Selenium fixtures; dummy data.

Native iPhone17/iOS26.6 + GalaxyS25/Android15: replacement/repeat/empty, existing secure replacement and neighbor isolation passed. Fixture login confirmed exact secure text. Plain WebView replacement/repeat/empty passed on iOS26.5/Android15.

Existing SDK wait stable 1000 10000; text-entry budgets unchanged. Native 8 clear/7 value each; WebView 4/3, excluding URL setup. HTTP200, same confirmed IDs, zero session POST /keys; empty sent no value.

Normalized iOS UTC, 2026-10-28 (intervening reads omitted):

15:08:42.696 GET /element/active -> A
15:08:43.205 POST /actions
15:08:44.516 GET /element/active -> A
15:08:45.117 POST /element/A/clear
15:08:45.734 POST /element/A/value "new"
15:08:48.351 AX="new"

Unproven: live rejected-clear/WebView-password. Historical iOS readonly/zoom mis-target remains. All four head sessions closed.