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

BH
1h ago
+270-57

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: 13d32dacb8f42338acd453bc978bc1bd6f2ac672; base: 21f3f50a90f21bf8f994e742cbb7dd295f255d6c.

  • Five regressions: base 4 failed/1 passed; head 5 passed.
  • 102 unit + 17 loopback passed.
  • Exact-head affected: format/lint/types/layering/Fallow/build passed; related 2005 passed/2 failed, versus base 1993/2 (same Apple fake-record/Android fake-log failures). Gate failed; docs passed.
  • Cubic clean; CI awaits maintainer approval.

Hosted proof — unmodified head

Public Swag Labs 2.7.1, native My Demo App 2.3.0 (iOS/Android) and Selenium fixtures; dummy data.

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

Existing SDK wait stable 1000 10000 used; text-entry budgets unchanged. Native: 8 clear/7 value each; WebView positives: 4/3, excluding URL setup/negative attempts. Same confirmed IDs, HTTP 200, zero session POST /keys; empty sent no value.

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

20:29:24.405 GET /element/active -> A
20:29:25.637 POST /actions
20:29:27.036 GET /element/active -> A
20:29:27.814 POST /element/A/clear
20:29:28.453 POST /element/A/value "new"
20:29:31.509 AX="new"

Unproven: real rejected-clear (readonly returned 200); WebView password blocked by focus-read deadlines. Earlier iOS readonly/zoom mis-target remains. All 12 sessions closed.