Skip to main content

common-keywords — Reusable Validation Keyword Package for Robot Framework

PyPI Python

One-line validations for complete scenarios. A call like Validate Email Field ${locator} max_length=100 runs 28+ internal assertions (required, 23 invalid formats, max-length boundary, valid case). The package ships 40+ project-agnostic keywords across three categories:

  • Form validation — required / text length / character class / email / phone (country-aware via phonenumbers) / URL / number / date / password (policy-driven) / file upload / dropdown.
  • API validation — status codes, JSON Schema (Draft 2020-12) via jsonschema, response time, pagination envelopes, error-response format.
  • UI validation — element state (enabled / disabled / readonly / visible / focused / placeholder), form behaviour (submit gating, inline blur validation, data preservation across navigation), accessibility (aria-label, tab order, label association).

No project coupling — selectors come in as arguments, country / policy / schema rules come from YAML, nothing is hard-coded to any specific app.


Installation

pip install robotframework-common-keywords

For pre-release or development installs from a Git ref:

pip install git+https://github.com/quan3c10/robotframework-common-keywords.git

Imports after install use the package path:

*** Settings ***
Resource    robot_common_keywords/form_validation/email_field.resource
Library     robot_common_keywords.libraries.phone_helpers

Editable installs for contributors

Code lives under src/robot_common_keywords/. From a clone of this repo:

pip install -e .
robot --dryrun tests/

Playwright browsers must be installed separately (rfbrowser init) to run the Browser-driven self-tests.

Browser Library

Form-validation and UI-validation keywords drive pages via Browser Library (Playwright). One-time per machine:

rfbrowser init

Quick start

Save this file, point it at a form on your app, run it. 15 lines, 6 validation families covered.

*** Settings ***
Library     Browser
Resource    robot_common_keywords/form_validation/required_field.resource
Resource    robot_common_keywords/form_validation/email_field.resource
Resource    robot_common_keywords/form_validation/phone_field.resource
Resource    robot_common_keywords/form_validation/password_field.resource
Suite Setup       New Browser  chromium  headless=${True}
Suite Setup       New Context
Suite Setup       New Page

*** Test Cases ***
Registration Form Validates All Inputs
    Go To    https://your.app/register
    Validate Required Field    [data-test='first-name']
    Validate Email Field       [data-test='email']       max_length=100
    Validate Phone Field       [data-test='phone']       country=US
    Validate Password Field    [data-test='password']    policy=strong

That one test drives 60+ internal assertions. Change country=US to country=VN and the same test runs against Vietnamese phone-number rules with zero code changes.

For more realistic examples, see docs/EXAMPLES.md.


Documentation

Doc What it covers
docs/EXAMPLES.md Five real-world scenarios: registration, login, checkout, API validation, dropdown-heavy filter UI.
docs/INTEGRATION.md How project-specific business keywords (Phase 1 style) call into common keywords. Before/after diff.
docs/COVERAGE.md Every public keyword → its self-test. Hand-maintained.
docs/keyword-catalog/ Auto-generated HTML docs (via libdoc) for every resource + Python library. One file per module.

Regenerate the keyword catalog

After adding or editing a keyword:

./scripts/generate-keyword-catalog.sh

The script overwrites every file in docs/keyword-catalog/ with fresh libdoc output. Commit the updated HTML alongside your keyword change.


Directory layout

Runtime imports use the installed package name robot_common_keywords (Resource robot_common_keywords/...). In the repo, those files live under src/robot_common_keywords/:

src/robot_common_keywords/
├── form_validation/                      # 10 resources, 31 public keywords
│   ├── required_field.resource
│   ├── text_field.resource               # max/min/range length, char classes,
│   │                                     # whitespace, case sensitivity
│   ├── email_field.resource
│   ├── phone_field.resource              # country-aware
│   ├── url_field.resource                # optional require_https
│   ├── number_field.resource             # min/max/decimals, integer,
│   │                                     # positive, currency, percentage
│   ├── date_field.resource               # format/range/future/past/range
│   ├── password_field.resource           # policy-driven
│   ├── file_upload.resource              # type / size / multi-file
│   ├── dropdown_field.resource           # exact/any order, default, required,
│   │                                     # searchable
│   └── _helpers.resource                 # internal — don't call from tests
│
├── api_validation/                       # 5 resources, 12 public keywords
│   ├── status_codes.resource             # 2xx/4xx/5xx + exact
│   ├── response_schema.resource          # Draft 2020-12 + field-type checks
│   ├── response_time.resource
│   ├── pagination.resource               # envelope + metadata consistency
│   └── error_responses.resource          # standard format + field-mention
│
├── ui_validation/                        # 3 resources, 13 public keywords
│   ├── element_state.resource            # 7 states + placeholder
│   ├── form_behavior.resource            # submit gate, inline blur, preservation
│   └── accessibility.resource            # aria-label, tab order, labels
│
├── data_generators/
│   └── invalid_data.resource             # @{INVALID_EMAILS}, SQL/XSS probes
│
├── test_data/
│   ├── valid_emails.yaml                 # 12 positive samples
│   ├── invalid_emails.yaml               # 23 malformed samples
│   ├── phone_formats.yaml                # VN / US / JP / UK
│   ├── password_policies.yaml            # basic / strong / banking
│   ├── boundary_strings.yaml             # curated edge cases
│   ├── schemas/                          # JSON Schemas (Draft 2020-12)
│   │   ├── user.schema.json
│   │   ├── error.schema.json
│   │   └── paginated_users.schema.json
│   └── sample_files/                     # 5 tiny files for file-upload tests
│
├── libraries/                            # 7 Python libraries, 26 keywords
│   ├── api_validation_helpers.py
│   ├── boundary_generator.py
│   ├── date_helpers.py
│   ├── faker_wrapper.py                  # wraps `faker` for 15 locales
│   ├── file_helpers.py
│   ├── password_helpers.py
│   └── phone_helpers.py                  # wraps `phonenumbers`
│
├── __init__.py
└── __version__.py

tests/                                    # 86 self-tests across 17 files
└── fixtures/text_form.html               # single deterministic HTML fixture

docs/                                     # this README's friends
scripts/                                  # new_keyword.py, catalog generator

Running the self-tests

From the project root:

source .venv/bin/activate

# Offline (no network) — 77 tests:
robot -d results --exclude network tests/

# Full suite including jsonplaceholder.com integration (4 tests) — 86 tests:
robot -d results tests/

All 86 self-tests pass with every run. See docs/COVERAGE.md for the full keyword → test mapping.


Contributing

When does a keyword belong in robot_common_keywords?

Ask: "Would Team B, working on a totally different product, use this keyword as-is?" If yes, it's common. If it references a specific URL, field name, business rule, or validation message unique to your app, it's project-specific and belongs in keywords/business/ — not here.

How to add a new validation keyword

  1. Pick the right resource file. One file per domain — see the directory layout above. If your keyword doesn't fit, open a discussion before creating a new resource.
  2. Give the keyword sensible defaults. A tester should be able to call it with just a locator: Validate Foo Field ${locator}. All other parameters should have sensible defaults.
  3. Error messages must be descriptive. Never let a failure say only "Assertion failed" — quote the expected and actual values, the field locator, and what was tried.
  4. Write a self-test. Every new keyword requires one in tests/. We use a deterministic local HTML fixture (tests/fixtures/text_form.html) for flake-free runs; extend it if your keyword needs new behaviour.
  5. Update the coverage report. Add a row to docs/COVERAGE.md.
  6. Regenerate the keyword catalog via ./scripts/generate-keyword-catalog.sh and commit the updated HTML.

How to add a new country / policy / schema

No code changes required.

  • Phone country: add an entry under countries: in src/robot_common_keywords/test_data/phone_formats.yaml. See existing VN / US / JP / UK entries for the shape.
  • Password policy: add an entry under policies: in src/robot_common_keywords/test_data/password_policies.yaml.
  • JSON Schema: drop a new .schema.json into src/robot_common_keywords/test_data/schemas/. Pass its path via the keyword's schema_path argument.

Self-test requirement (no self-test = not merged)

Every PR that adds or changes a keyword must include a self-test that fails on the old code and passes on the new code. The CI runs both robot --dryrun tests/ and the full live suite.

Metadata

Release files for robotframework-common-keywords 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for robotframework-common-keywords 0.1.1
File Size Uploaded Provenance Actions
robotframework_common_keywords-0.1.1.tar.gz 52.0 kB Without provenance Details for robotframework_common_keywords-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for robotframework-common-keywords 0.1.1
File Interpreter ABI Platform Actions
robotframework_common_keywords-0.1.1-py3-none-any.whl Python 3 none any Details for robotframework_common_keywords-0.1.1-py3-none-any.whl

Total release size: 118.7 kB

Release files / robotframework_common_keywords-0.1.1.tar.gz

Download URL robotframework_common_keywords-0.1.1.tar.gz
Size 52.0 kB
Tags Source
SHA-256 checksum
How to use checksums
aa4d31298e025ef63d3877f335b0ec05f72e6974c5686e5d476b3f5c364a8eb9
BLAKE2b-256 checksum
How to use checksums
1a2fbf7ed0790d85dd4bcd991060b66ac4c21e43f2cdb2221f443caa00793674
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / robotframework_common_keywords-0.1.1-py3-none-any.whl

Download URL robotframework_common_keywords-0.1.1-py3-none-any.whl
Size 66.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
969bc9adc2b2b28334ce7ac00e9d6e5a4eaf7a5508664ec0533577ee0031d993
BLAKE2b-256 checksum
How to use checksums
9887a8b39bdd14d31d689ee53cdd723089dae73e510e2fd1b9bbe079239bbcd7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Security for robotframework-common-keywords 0.1.1

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.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page