testsAndMisc/python_pkg
Krzysztof kuhy Rudnicki b73811c233
Some checks are pending
Pre-commit checks / pre-commit (push) Waiting to run
Python tests / test (push) Waiting to run
Shell tests / shell-tests (push) Waiting to run
Shell tests / arch-tests (push) Waiting to run
Add android_ui: drive Android apps by element, never by coordinates
Shared across every repo with an Android surface (screen-locker's workout_app,
todo, dufs-cloud/app). Works against a plain release APK on a physical device
over adb — no root, no emulator, no Flutter debug connection, no app changes.

Driving an app by tapping pixel positions read off a screenshot fails in ways
that look like success. All observed in one session (2026-08-10) verifying
workout_app's Firebase restore:

* A tap aimed at a password field landed with the field unfocused. The typed
  password went nowhere and NOTHING errored — the next screenshot just showed
  an empty box. type_into/type_into_field now re-read the field and raise.
* Opening the soft keyboard moved a field from y=1572 to y=1319, so a
  coordinate captured one step earlier was already wrong. Every action
  re-resolves the element immediately before acting.
* A widget behind the keyboard reports its LAID-OUT position (1549) not its
  real one (1939) — a 390px error that taps a letter key and reports success.
  keyboard_is_up() distinguishes "absent" from "behind the keyboard", and tap
  closes the keyboard first.
* KEYCODE_BACK is a route pop in Flutter, not a keyboard dismiss: it navigated
  out of Settings and discarded typed credentials, twice. dismiss_keyboard
  tries ESCAPE then BACK and verifies via dumpsys input_method.
* `input text` inserts at the cursor, so typing over a filled field produced
  "canary@example.com321krzychu@gmail.com". Fields are cleared first.
* uiautomator returns ONLY the focused EditText nodes while a Flutter text
  field has focus, and stays that way across retries — so a naive retry loop
  never converges. Partial trees are retried and the best result kept.
* An EMPTY EditText has no text, content-desc or resource-id, so a
  "must be labelled" filter drops the very field you need to fill in. Editable
  nodes are kept regardless and addressable by position.

Ambiguity is an error rather than a silent first-match: `tap "Back"` correctly
refuses when "OFFLINE BACKUP" is also on screen.

Its own test suite caught a real bug in _escape: backslash sat inside the
escape loop, so "&" became "\\&" and a password containing shell
metacharacters would have been typed wrong.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JupKvZCNKRmEeRQY3G1unG
2026-08-10 17:01:28 +02:00
..
android_ui Add android_ui: drive Android apps by element, never by coordinates 2026-08-10 17:01:28 +02:00
app_icons app_icons: add a decision-tree glyph and register untools 2026-08-09 17:23:35 +02:00
archwiki_rag archwiki_rag: offline semantic search over the Arch Wiki 2026-08-10 15:33:18 +02:00
billsplit_coverage Move billsplit Flutter app into the monorepo 2026-08-03 12:22:22 +02:00
brother_printer fix(brother-printer): split oversized files, fix order-dependent entry test 2026-07-17 15:06:25 +02:00
code_tutor Make code_tutor OSError fingerprint test Python-version-robust 2026-07-11 00:22:57 +02:00
focus_policy focus_owner: keep the unhide path reachable, never hide the enforcer 2026-08-10 15:33:18 +02:00
live_calc refactor: extract all inline Python from shell scripts into proper .py files 2026-06-06 10:31:48 +02:00
morning_routine Remove wake_alarm (extracted to kuhyx/wake-alarm) and fix the orchestrator 2026-06-22 12:47:06 +02:00
random_jpg feat: added run sh and makefile scripts 2026-02-22 22:00:50 +01:00
shared Migrate wake_alarm to the shared gatelock backend 2026-06-22 07:33:49 +02:00
syncyomi_guard syncyomi_guard: refuse a collapsed payload as the new good copy 2026-08-10 15:33:18 +02:00
tests python_pkg: the file-length test was blind to its own CI venv 2026-07-25 16:32:32 +02:00
wsg_grabber wsg_grabber: scrape /wsg/, download every new video, triage with keep/pass 2026-07-27 14:55:30 +02:00
__init__.py feat(screen_locker): harden table tennis verification, remove running option 2026-02-02 21:38:52 +01:00
.gitignore screen_locker: enhance workout logging and UI 2025-12-02 23:22:13 +01:00
conftest.py test: achieve 100% branch coverage across all python_pkg packages 2026-03-21 17:51:36 +01:00