Websites test framework for Igor
Project description
Ocarina
A Python browser test automation framework built on Railway Oriented Programming (ROP).
Overview
Ocarina is a pure-Python framework that provides a declarative DSL for composing browser tests.
Its defining characteristic is that every test step is a link in a Railway chain: on failure, the rest of the chain short-circuits and the error is captured as a value rather than propagated as an exception.
This keeps test code flat and the failure path explicit.
Notable features:
- Railway-based action chains with first-class success/failure handlers.
- Hierarchical test orchestration:
Test→TestSuite→TestCampaign→TestCycle. - Parallel execution with a thread-safe WebDriver pool.
- Automatic retries on transient errors.
- Conditional branching via
match_pagefor pages that can render in multiple states. - Fluent assertion chains via
validate. - Built-in reporters: pretty-print (ANSI), JSON, DOCX proof documents, timing, screenshots.
- Framework-agnostic
POMBase; the Selenium integration is one of several possible adapters. - Ships its own test runner: Ocarina is NOT a pytest plugin.
Requirements
- Python 3.14+
- (SELENIUM) A matching WebDriver binary on disk (
chromedriver,geckodriver,msedgedriver) for the browser you intend to use. Safari uses the native macOSsafaridriverand needs no binary on disk.
Installation
pip install ocarina
Core concepts
- POM — page objects subclass
POMBase; the base class is browser-agnostic. - Scenario — a factory
(driver, logger) -> Scenario(test_chain, setup, teardown, watchers)built fromScenario. - Railway chain — actions are wrapped with
create_act, which returns a builder with.failure(...),.success(...), and.execute(). - drive_page —
drive_pagecomposes multiple acts into a single chain. - match_page —
match_pagebranches on which of several states a page is in. - validate —
validateis a fluent assertion chain with alternatives and aggregated errors. - Test orchestrators —
Test(one case),TestSuite(parallel + retry policy),TestCampaign(sequential suites),TestCycle(smoke campaigns before main campaigns).
CLI flags (opinionated Selenium launcher)
Parsed by create_selenium_auto_cli_store. Headless mode is the default; use --not-headless to opt out.
| Flag | Default | Notes |
|---|---|---|
--driver-path |
"" |
Path to the WebDriver binary (not used on Safari). |
--browser |
required | chrome, firefox, edge (Windows), safari (macOS). |
--not-headless |
off | Shows the browser UI. |
--workers |
5 |
Parallel workers (size of the driver pool). |
--wait-timeout |
10 |
Selenium implicit wait seconds (max 60). |
--profile-path |
None |
Browser profile directory (not supported on Safari). |
--logger |
terminal+file |
One of terminal, file, terminal+file, muted. |
--dont-force-delete-tmp-dirs |
off | Skip the post-run cleanup of Selenium temp profiles on Windows. |
--exclude |
[] | Exclude tests by IDs. |
--only |
[] | Select tests by IDs. |
Reporting
The opinionated/plugins/reports package ships four reporters that can be passed to bootstrap via run_plugins:
- pretty-print — hierarchical ANSI summary on stdout.
- JSON results — structured results.
- DOCX proofs — Word document assembled from logs (requires FileLogger).
- timing — context manager that prints total test duration.
Screenshots are captured automatically on failure (when autoscreen_on_fail=True on a suite) and can also be triggered explicitly through the ITakeScreenshot port.
Full example
For a complete, runnable project:
- CI workflow,
- Real page objects,
- OTP-based login coordinated through Redis,
- Data-driven suites,
- File upload tests,
- Chaos scenarios
See ocarina-example.
Development
From a clone of this repo:
make install # create .venv and install with dev deps
make test # pytest + coverage + allure results
make check-coding-style # mypy + ruff
make ruff-format # apply formatting
make serve-htmlcov # open the HTML coverage report
make serve-allure # open the Allure report
License
MIT — Igor Casanova.
Built by @mojo-molotov
Fueled by figatellu and Квас.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ocarina-1.0.0.tar.gz.
File metadata
- Download URL: ocarina-1.0.0.tar.gz
- Upload date:
- Size: 528.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
138a858b76049b09db6259538d24d022adf738ddbacbf180b841ec5a14e38b24
|
|
| MD5 |
59b4db5a3f9698aa8b8e575c8fdecb68
|
|
| BLAKE2b-256 |
85d93d3570831fd57f67c72ac1c1cb78110e599e35f1b047aa70755a712620fb
|
File details
Details for the file ocarina-1.0.0-py3-none-any.whl.
File metadata
- Download URL: ocarina-1.0.0-py3-none-any.whl
- Upload date:
- Size: 107.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a05b47278778c9d55bb682c20afd03750a98e529b19a5f69e3db0358085d6cdb
|
|
| MD5 |
dc901b9a2e60c4da53b51eb6268a7b5c
|
|
| BLAKE2b-256 |
cec608a8583bc0ab96e87fba2d40af05b884884ed6c54b200761f757f68ec0ec
|