robo-appian
robo-appian (robo appian / robo_appian) by Dinil Mithra makes Appian pages easier to automate with readable Python. It is a Python automation and testing library for Appian applications.
It is designed for people who know their web application and only need basic Python to start writing automation.
Quick example
from robo_appian import AppianPage
def test_update_item(page: AppianPage) -> None:
page.textbox(label="Description").fill("Example item")
page.date(label="Start Date").fill("10/15/2026")
page.radio(label="Priority").select("High")
page.button(name="Submit").click()
The goal is to describe the page using the same text a user sees.
Install
pip install robo-appian
robo-appian install-browser firefox
Python 3.12 is required. robo-appian uses robo-automation for generic browser and pytest infrastructure.
Common controls
page.textbox(label="Description").fill("Example item")
page.textbox(placeholder="example@example.com").fill("user@example.com")
page.textbox("Employee").select(search_text="John", value="John Smith")
page.date(label="Start Date").fill("10/15/2026")
page.radio(label="Priority").select("High")
page.button(name="Next").click()
Textboxes, dates, and selection components automatically move focus out after a value changes so Appian can process it.
What belongs where?
Your application tests
↓
robo-appian Appian controls and Appian behavior
↓
robo-automation Browser and pytest infrastructure
↓
Playwright
Your application project should own application URLs, login policy, business workflows, assertions, and test data.
Documentation
Start with the beginner guides:
- Installation
- Quick Start
- Your First Test
- Choosing a Component
- Troubleshooting
Advanced architecture and pytest integration are documented separately for framework maintainers.
Full documentation:
https://dinilmithra.github.io/robo-appian/
License
robo-appian is licensed under the MIT License.
Error handling
Appian-specific library failures use RoboAppianError, which is also a RoboAutomationError. Normal tests should usually let pytest report these errors. If you need recovery or diagnostic handling, see How to use RoboAppianError for examples using code, details, to_dict(), and exception chaining.
Runtime boundary for application projects
Application projects should normally import automation APIs only from
robo_appian.
from robo_appian import AppianPage, AppianRuntime, RoboAppianError
AppianRuntime provides the Appian-facing browser/session lifecycle used by
advanced consumer fixtures. It intentionally hides lower browser and
performance implementation classes. Normal test authors usually only need the
page fixture and component APIs shown above.
Semantic browser recorder
The library now includes robo_appian.recorder: live semantic inspection,
recording normalization, explicit step review and deterministic pytest generation.
Use the sibling robo-recorder project's README for installation, the local demo,
supported mappings and live-browser validation steps. Recorder mechanics stay in
this library; generated tests do not depend on CORE testcase patterns.
Recorder commands
The recorder CLI and demo are owned by this library; no robo-recorder package
is required to capture, review or generate tests.
robo-appian recorder record --url "https://your-appian-host/suite/sites/your-site" --output .\recordings\request
robo-appian recorder review .\recordings\request\recording.json
robo-appian recorder validate .\recordings\request\recording.json
robo-appian recorder generate .\recordings\request\recording.json --output .\tests\generated\test_request.py
Use python -m robo_appian.cli recorder --help if the console command is not on
PATH. robo-appian recorder demo opens the library-bundled local example.
Playback requires consumer page fixtures for browser lifecycle and cleanup;
see the sibling robo-recorder project for an example. Existing browser-install
commands remain available. The old robo-recorder CLI forwards to these same
library functions.
Exact keyed grid rows
grid.row_matching(column_name="Vendor #", value="549") returns a live row
matched by normalized exact text in the named column. With its default wait=True,
it requires one matching grid and one matching row; duplicates fail rather than
selecting the first match. timeout, tri-state visible, and wait=False are
available. Existing positional/named row, column, cell and counting APIs are
unchanged. This lookup only searches rendered rows and does not paginate.
The semantic recorder prefers grid.row(name=..., exact=True, unique=True)
and named columns. If an exact unique row/column name is unavailable, it uses
recorded one-based row/column numbers independently. unique=True is optional
and preserves the existing default row behavior when omitted; it verifies one
grid and one matching row when enabled. The recorded grid, row and column mapping
remain subject to explicit human approval. Numbered rows are positional and do
not remain bound to the same business record after sorting/filtering.
Recording browser viewports now follow window resizing (no_viewport=True).
Dialog-scoped recorder fields
AppianDialog now exposes textbox(...), date(...) and grid(...) using the
existing component constructors with dialog scope. dialog.grid(..., wait=False)
supports optional lookup; default grid/row/cell/component synchronization remains
in place. Grid cell actions retain the original AppianPage as their owner.
Recorder calendar selections are normalized to the uniquely associated date field
when that relationship is available; unresolved historical calendar clicks require
re-recording and are not automatically approved or assigned to a guessed field.
Headless execution
Pytest browsers default to visible (HEAD_LESS=N) in this workspace. Use
HEAD_LESS=Y for headless execution. See the Headless execution guide
for project .env, shell, CI and VS Code examples, configuration precedence, and
the proposed fixture override. Interactive recorder browsers remain visible.
Feature documentation
Start with the Feature guide for components, recorder, configuration, evidence, verification, runtime APIs and current limitations. The Semantic recorder guide covers the complete capture-to-execution workflow.
Repository-only Component identification requirements describe how RoboAppian recognizes buttons and other components. This technical reference is kept outside the GitHub Pages documentation source.
Metadata
Release files for robo-appian 0.1.35
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| robo_appian-0.1.35.tar.gz | 105.6 kB | Without provenance | Details for robo_appian-0.1.35.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| robo_appian-0.1.35-py3-none-any.whl | Python 3 | none | any | Details for robo_appian-0.1.35-py3-none-any.whl |
Total release size: 239.4 kB
Release files / robo_appian-0.1.35.tar.gz
| Download URL | robo_appian-0.1.35.tar.gz |
|---|---|
| Size | 105.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b45ccf60107f5ddfa63ff00c64252c3707db9f83860d7c0f660dd4607d3d6200
|
|
BLAKE2b-256 checksum How to use checksums |
a4c361236fb397b9c468eb2b34018f9de07ec023e9843b7739051660e40d3a3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.5.1 CPython/3.12.0 Windows/11
|
Release files / robo_appian-0.1.35-py3-none-any.whl
| Download URL | robo_appian-0.1.35-py3-none-any.whl |
|---|---|
| Size | 133.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0c6917cb2c2d6b7503fdf107c3506eed20af0e8f8efecbcd766aa0d134f7ce34
|
|
BLAKE2b-256 checksum How to use checksums |
be4b4358f7aafc869d6ab92bbaf8e16a143fd6c5c3f6a16cf29dbd0cffce7326
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.5.1 CPython/3.12.0 Windows/11
|
Security for robo-appian 0.1.35
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.