Skip to content

v2.2.0

Choose a tag to compare

@igorzheludkov igorzheludkov released this 01 Aug 22:16
· 195 commits to main since this release

Text entry is now verified, not assumed

An external analysis of 34 real sessions named text input the least reliable
surface in this server. Reproducing it confirmed the reported failure and turned
up three more, all with the same shape: not a crash, but a confident-looking
result that was wrong.

  • ios_input_text returned success into a screen with nothing focused.
  • "CASEB" landed as "CSEBA" — characters reordered, still reported as success.
  • get_screen_state showed a field's placeholder while it held other text, so
    the recommended way to verify a write read a stale value and made every correct
    write look like a failure.
  • replace: true wiped a field when the type that followed it failed.

New: input_text

One cross-platform tool that targets a field, focuses it, writes, and verifies.

  • Pass testID (or component / textMatch) and it focuses the field itself —
    no separate tap. A tap reporting success does not guarantee React focus.
  • Every write is read back and compared exactly, retried once, then failed
    hard with sent vs landed. Exactness matters: the corruption is a reorder,
    which length, prefix and non-empty checks all pass.
  • A target matching several inputs refuses and returns a labelled candidate
    list to pick from with index, instead of silently writing into the first.
    Forms routinely share one placeholder across every field.
  • Where a field cannot be read back, that is said out loud rather than reported
    as success.

Non-ASCII now works

Cyrillic, CJK and Spanish accents (ñ, á, ü) have no US keycode, and
adb shell input text throws a NullPointerException on them. Writes now take the
path a field can honour — onChangeText when the value prop mirrors the text,
real keystrokes when a handler exists and the text is typeable, and
setNativeProps plus a direct handler call otherwise.

get_screen_state

  • Input lines report the field's value, with the placeholder kept separate so
    it can never pose as content.
  • Reports the keyboard's height and remaining content area, and groups the
    elements it covers under Blocked by keyboard — bottom tab bars being the
    classic hidden tap hazard.

ios_input_text and android_input_text remain as native-only fallbacks.