Robot Framework acceptance tests for the Browser library.
atest/
├── test/ # Test suites (00–13 numbered by feature area)
│ ├── __init__.robot # Suite setup/teardown + global library imports
│ └── 13_Python_Extension/ # Demonstrates using Browser from a user's own Python library.
│ └── _child/ # Suites run as child processes. Robot Framework skips "_" directories
│ # when walking, so these do not run in the normal suite collection.
├── library/ # Python helper libraries
│ ├── common.py # Test server lifecycle (start/stop, log capture)
│ ├── child_result.py # Assertions about a child robot run's output.xml and playwright-log
│ └── test_app_listener.py # RF listener → test-app /api/log/context
└── output/ # Generated by test runs (gitignored)
└── test-app/ # Per-process newline-delimited JSON logs
inv atest # All suites
inv atest --suite 01 # Single suite
inv atest --test "Open Browser" # Single test
inv atest_coverage # With Python + Node.js V8 coverage
inv atest-failed # Rerun only failurescommon.py launches the dynamic test-app and pipes its stdout to
atest/output/test-app/test-app-<port>.log as newline-delimited JSON.
test_app_listener.py posts Robot Framework suite/test lifecycle events
(start_suite, end_suite, start_test, end_test) to the test-app's
POST /api/log/context endpoint so they appear in the same log stream as
browser page events.
See node/dynamic-test-app/README.md for the full log entry schema.
