Python library that simplifies Selenium WebDriver UI test automation
Project description
Selenium UI Test Tool
Python library that simplifies Selenium WebDriver UI test automation.
๐ Languages
- ๐ซ๐ท Lire la documentation en franรงais
๐ Table of Contents
- Installation
- Configuration
- Usage
- API Reference
- Examples
- CI/CD Mode
- Project Structure
- Contributing
- License
- Author
- Report a Bug
- Contact
๐ Installation
Install from PyPI (when published)
pip install selenium-ui-test-tool
Install from source
git clone <repository-url>
cd selenium_ui_test_tool
pip install -e .
Dependencies
- Python >= 3.8
- Selenium >= 4.15.0
- python-dotenv >= 1.0.0
- webdriver-manager >= 4.0.1
โ๏ธ Configuration
Environment variables
Create a .env file at the root of your project with the required variables:
# Sample configuration
CHROMEDRIVER_PATH=/path/to/chromedriver # Optional
HEADLESS=false # true to run headless
CI=false # true when running in CI/CD
ChromeDriver setup
The library automatically handles ChromeDriver in several ways:
- Environment variable: if
CHROMEDRIVER_PATHis set it will be used. - webdriver-manager: downloads and manages the matching version for you.
- Fallback: uses
/opt/homebrew/bin/chromedriver(macOS Homebrew) when available.
๐ Usage
Basic example
from selenium_ui_test_tool import BaseTest
from selenium.webdriver.common.by import By
def test_example(driver):
"""Return True when the page title contains 'Example'."""
title = driver.title
return "Example" in title
# Create and run the test
test = BaseTest(
test_function=test_example,
success_message="โ
Test passed!",
failure_message="โ Test failed!",
url="https://example.com",
exit_on_failure=True
)
test.run()
Using the utilities
from selenium_ui_test_tool import (
create_driver,
get_url,
wait_for_element,
configure_actions,
click_element,
click_on,
fill_input,
fill_login_form,
fill_login_form_with_confirm_password,
upload_file,
get_env_var
)
from selenium.webdriver.common.by import By
# Create a driver
driver = create_driver(headless=False)
# Navigate to a URL
get_url(driver, "https://example.com")
# Wait for an element
element = wait_for_element(driver, By.ID, "my-element", timeout=10)
# Configure and run a scroll+click action
configure_actions(driver, By.CSS_SELECTOR, ".my-button")
# Click with custom messages
click_element(
driver,
By.ID,
"submit-button",
success_message="Button clicked successfully",
error_message="Unable to click the button"
)
# Build an action store with click_on
ticket_actions = [
(By.XPATH, "//span[contains(text(),'Annual')]", "Annual section selected"),
(By.XPATH, "//span[contains(text(),'Annual Pass')]", "Annual Pass selected"),
]
for by, selector, success_message in ticket_actions:
click_on(
driver,
by,
selector,
success_message=success_message,
error_message=f"Unable to click {selector}"
)
# Fill a form field
fill_input(driver, By.ID, "username", "my_user")
# Fill a full login form
fill_login_form(
driver,
username_env="LOGIN_USERNAME",
password_env="LOGIN_PASSWORD",
by=By.ID,
selector="login-form",
button="login-button"
)
# Upload a file based on an env var path
upload_file(
driver,
file_path="FILE_PATH_ENV", # Environment variable with the absolute path
input_selector="file-input",
by=By.ID,
success_message="File uploaded",
error_message="Upload failed"
)
# Read an environment variable
username = get_env_var("LOGIN_USERNAME", required=True)
# Always quit the driver
driver.quit()
๐ API Reference
BaseTest
Main class that orchestrates complete UI tests.
BaseTest(
test_function: Callable[[WebDriver], bool],
success_message: str,
failure_message: str,
url: str,
exit_on_failure: bool = True
)
test_function: callable that receives aWebDriverand returnsTrue/False.success_message: message printed when the test succeeds.failure_message: message printed when the test fails.url: target URL to load.exit_on_failure: exit the process with code1when the test fails.
Methods:
setup()โ create the driver and open the URL.teardown()โ close the driver.run()โ run the full flow (setup โ trigger โ teardown).
create_driver(headless: bool = False) -> WebDriver
Create and configure a Chrome WebDriver instance.
get_url(driver: WebDriver, url: str) -> None
Navigate to a given URL.
wait_for_element(driver: WebDriver, by: By, selector: str, timeout: int = 10) -> WebElement | None
Wait for an element to appear in the DOM.
configure_actions(driver: WebDriver, by: By, selector: str) -> bool
Scroll to an element and click it.
click_element(...) -> bool
Enhanced click helper that adds waits, verification, and custom messages.
click_on(...) -> bool
Thin wrapper above click_element that enforces success/error messages.
fill_input(...) -> bool
Scroll to an element, clear the field, and send keys.
fill_login_form(...) -> bool
Automatically fill username/password fields from environment variables and submit.
fill_login_form_with_confirm_password(...) -> bool
Same as fill_login_form but also fills a confirmation password field.
upload_file(...) -> bool
Upload a file through an <input type="file"> element using a path stored in the .env file.
get_env_var(name: str, required: bool = True) -> str | None
Retrieve an environment variable and raise a helpful error if it is missing.
Refer to the French documentation for the full parameter details or use the inline docstrings shipped with the package.
๐ก Examples
Complete login test (with fill_login_form)
from selenium_ui_test_tool import BaseTest, fill_login_form, wait_for_element
from selenium.webdriver.common.by import By
def test_login(driver):
if not fill_login_form(
driver,
username_env="LOGIN_USERNAME",
password_env="LOGIN_PASSWORD",
by=By.ID,
selector="login-form",
button="login-button"
):
return False
welcome_message = wait_for_element(driver, By.CLASS_NAME, "welcome", timeout=5)
return welcome_message is not None
test = BaseTest(
test_function=test_login,
success_message="โ
Logged in successfully!",
failure_message="โ Login failed",
url="https://example.com/login",
exit_on_failure=True
)
test.run()
Manual login test (with fill_input)
from selenium_ui_test_tool import BaseTest, fill_input, click_element, get_env_var
from selenium.webdriver.common.by import By
def test_login_manual(driver):
if not fill_input(driver, By.ID, "username", get_env_var("LOGIN_USERNAME")):
return False
if not fill_input(driver, By.ID, "password", get_env_var("LOGIN_PASSWORD")):
return False
return click_element(
driver,
By.ID,
"login-button",
success_message="Login successful",
error_message="Login failed"
)
test = BaseTest(
test_function=test_login_manual,
success_message="โ
Login successful!",
failure_message="โ Login failed",
url="https://example.com/login",
exit_on_failure=True
)
test.run()
Action store with click_on
from selenium_ui_test_tool import BaseTest, click_on
from selenium.webdriver.common.by import By
import time
ACTIONS_MONTHLY = [
(By.XPATH, "//span[contains(text(),'Monthly')]", "Monthly section opened"),
(By.XPATH, "//span[contains(text(),'Monthly Pass')]", "Monthly Pass selected"),
]
def monthly_buying(driver):
for by, selector, success in ACTIONS_MONTHLY:
click_on(
driver,
by,
selector,
success_message=success,
error_message=f"Unable to click {selector}"
)
def buying_helper_monthly(driver):
time.sleep(2)
monthly_buying(driver)
return True
test = BaseTest(
test_function=buying_helper_monthly,
success_message="โ
Monthly purchase completed",
failure_message="โ Purchase flow failed",
url="https://example.com/store"
)
test.run()
Headless mode
from selenium_ui_test_tool import create_driver, get_url
import os
os.environ["HEADLESS"] = "true"
driver = create_driver(headless=True)
get_url(driver, "https://example.com")
# Run your checks...
driver.quit()
Error handling
from selenium_ui_test_tool import BaseTest, wait_for_element
from selenium.webdriver.common.by import By
def test_with_error_handling(driver):
try:
element = wait_for_element(driver, By.ID, "my-element", timeout=5)
if element is None:
print("โ ๏ธ Element not found")
return False
# Your assertions
return True
except Exception as e:
print(f"โ Test error: {e}")
return False
test = BaseTest(
test_function=test_with_error_handling,
success_message="โ
Test passed",
failure_message="โ Test failed",
url="https://example.com",
exit_on_failure=False
)
test.run()
๐ง CI/CD Mode
When CI=true is detected:
- Chrome automatically runs headless.
- Environment variables are read from GitHub Secrets (or similar).
- No interactive pause happens at the end.
GitHub Actions sample
name: UI Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install selenium-ui-test-tool
- name: Run tests
env:
CI: true
LOGIN_USERNAME: ${{ secrets.LOGIN_USERNAME }}
LOGIN_PASSWORD: ${{ secrets.LOGIN_PASSWORD }}
run: |
python your_test_script.py
๐ Project Structure
selenium_ui_test_tool/
โโโ selenium_ui_test_tool/
โ โโโ __init__.py
โ โโโ base_test/
โ โโโ click_element/
โ โโโ config_actions/
โ โโโ driver_builder/
โ โโโ get_env_var/
โ โโโ get_url/
โ โโโ wait_element/
โโโ pyproject.toml
โโโ setup.py
โโโ requirements.txt
โโโ README.md
โโโ env.example
๐ค Contributing
- Fork the project.
- Create your feature branch (
git checkout -b feature/AmazingFeature). - Commit your changes (
git commit -m 'Add AmazingFeature'). - Push to the branch (
git push origin feature/AmazingFeature). - Open a Pull Request.
๐ License
MIT License โ see LICENSE for details.
๐ค Author
Yann Dipita
๐ Report a Bug
Please open an issue with:
- clear description,
- reproduction steps,
- expected vs. actual behavior,
- your environment (OS, Python, Selenium versions).
๐ง Contact
For any question: dipitay@gmail.com.
Note: This library is under active development. Minor releases may introduce breaking changes.
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 selenium_ui_test_tool-2.0.0.tar.gz.
File metadata
- Download URL: selenium_ui_test_tool-2.0.0.tar.gz
- Upload date:
- Size: 16.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1beda37d307c9c53a158f5217e45058ea7c039e378840772c675a2382da4f70
|
|
| MD5 |
e5ce148327630360322cdeda8899941a
|
|
| BLAKE2b-256 |
f9fce337e788dbc34663b08289d5044ef420bf6d4b2372f8ab9fb33d91cf69eb
|
File details
Details for the file selenium_ui_test_tool-2.0.0-py3-none-any.whl.
File metadata
- Download URL: selenium_ui_test_tool-2.0.0-py3-none-any.whl
- Upload date:
- Size: 17.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbb3822512734a3d2deaab6228c1384f4a772dc9f12ed5118bc7257bce0d9284
|
|
| MD5 |
9076c0ca78d3980e399c07c77fe49e9e
|
|
| BLAKE2b-256 |
aaa79190987398cd35899806bf2999c1255d72dea67eb98a06b000dcd02ab3fb
|