Framework to build UI test automation in Page Transactions pattern
Project description
Guará
Photo by Mateus Campos Felipe on Unsplash
The scarlet ibis, sometimes called red ibis (Eudocimus ruber), is a species of ibis in the bird family Threskiornithidae. It inhabits tropical South America and part of the Caribbean. In form, it resembles most of the other twenty-seven extant species of ibis, but its remarkably brilliant scarlet coloration makes it unmistakable. It is one of the two national birds of Trinidad and Tobago, and its Tupi–Guarani name, guará, is part of the name of several municipalities along the coast of Brazil.
Contents
- Syntax
- Introduction
- Framework in action
- Installation
- Execution
- Tutorial
- Examples
- The pattern explained
- Using other Web Drivers
- Asynchronous execution
- ChatGPT assistance
- Page Transactions and Page Objects Model
- Non-testers usage
- Contributing
Syntax
Application.at(apage.DoSomething [,with_parameter=value, ...]).asserts(it.Matches, a_condition)
Introduction
[!IMPORTANT] Guará is the Python implementation of the design pattern
Page Transactions. It is more of a programming pattern than a tool. It can be bound to any web driver other than Selenium. Check the examples here
The intent of this pattern is to simplify UI test automation. It was inspired by Page Objects, App Actions, and Screenplay. Page Transactions focus on the operations (transactions) a user can perform on a web page, such as Login, Logout, or Submit Forms.
Demonstration
Framework in action
from selenium import webdriver
from pages import home, contact, info
from guara.transaction import Application
from guara import it, setup
def test_sample_web_page():
# Instantiates the Application with a driver
app = Application(webdriver.Chrome())
# At setup opens the web application
app.at(setup.OpenApp, url="https://anyhost.com/",)
# At Home page changes the language to Portuguese and asserts its content
app.at(home.ChangeToPortuguese).asserts(it.IsEqualTo, content_in_portuguese)
# At Info page asserts the text is present
app.at(info.NavigateTo).asserts(
it.Contains, "This project was born"
)
# At setup closes the web application
app.at(setup.CloseApp)
The ugly code which calls the webdriver is like this:
class ChangeToPortuguese(AbstractTransaction):
def __init__(self, driver):
super().__init__(driver)
def do(self, **kwargs):
self._driver.find_element(
By.CSS_SELECTOR, ".btn:nth-child(3) > button:nth-child(1) > img"
).click()
self._driver.find_element(By.CSS_SELECTOR, ".col-md-10").click()
return self._driver.find_element(By.CSS_SELECTOR, "label:nth-child(1)").text
It is a very repetitive activity:
- Create a class representing the transaction, in this case, the transaction changes the language to Portuguese
- Inherits from
AbstractTransaction - Implements the
domethod- Optional: Returns the result of the transaction
Read more in Tutorial
Installation
Dependencies
- Python 3.11
- Selenium
This framework can be installed by
pip install guara
Execution
It is recommended to use pytest
# Executes reporting the complete log
python -m pytest -o log_cli=1 --log-cli-level=INFO --log-format="%(asctime)s %(levelname)s %(message)s" --log-date-format="%Y-%m-%d %H:%M:%S"
[!TIP] These options can also be customized through your
pytest.inifile. Refer to Pytest documentaion.
Outputs
examples/web_ui/selenium/simple/test_local_page.py::TestLocalTransaction::test_local_page
--------------------------------------------------------------- live log setup ---------------------------------------------------------------
2025-01-09 06:39:41 INFO Transaction 'OpenApp'
2025-01-09 06:39:41 INFO url: file:////...sample.html
2025-01-09 06:39:41 INFO window_width: 1094
2025-01-09 06:39:41 INFO window_height: 765
2025-01-09 06:39:41 INFO implicitly_wait: 0.5
2025-01-09 06:39:41 INFO Assertion 'IsEqualTo'
2025-01-09 06:39:41 INFO actual: 'Sample page'
2025-01-09 06:39:41 INFO expected: 'Sample page'
--------------------------------------------------------------- live log call ----------------------------------------------------------------
2025-01-09 06:39:41 INFO Transaction 'SubmitText'
2025-01-09 06:39:41 INFO text: cheese
2025-01-09 06:39:41 INFO Assertion 'IsEqualTo'
2025-01-09 06:39:41 INFO actual: 'It works! cheese!'
2025-01-09 06:39:41 INFO expected: 'It works! cheese!'
2025-01-09 06:39:41 INFO Transaction 'SubmitText'
2025-01-09 06:39:41 INFO text: cheese
2025-01-09 06:39:41 INFO Assertion 'IsNotEqualTo'
2025-01-09 06:39:41 INFO actual: 'It works! cheesecheese!'
2025-01-09 06:39:41 INFO expected: 'Any'
PASSED [100%]
------------------------------------------------------------- live log teardown --------------------------------------------------------------
2025-01-09 06:39:41 INFO Transaction 'CloseApp'
It also works well with other test frameworks. Check more details here
Tutorial
Read the step-by-step to build your first automation with this framework.
How you can help?
Here's how you can help with this:
- Star this project on GitHub.
- Tell your friends and colleagues about it.
- Share it on social media.
- Write a blog post about Guara.
- Take a look at the
good first issuehere, assign any to you and push the code.
Contributing
Read the Code of Conduct before push new Merge Requests.
Now, follow the steps in Contributing session.
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 guara-0.0.10.tar.gz.
File metadata
- Download URL: guara-0.0.10.tar.gz
- Upload date:
- Size: 842.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44a74078ac7c3e030a689f1e84e2a8dcd9c66034eb5ac6b326ac4f40ee60be9d
|
|
| MD5 |
89b94b88d31a4f7c68c81d26d0737b1d
|
|
| BLAKE2b-256 |
8849ead30d2db722970e6b75b930d740b9095eb44ecf42f0f19a721033e6d55d
|
File details
Details for the file guara-0.0.10-py3-none-any.whl.
File metadata
- Download URL: guara-0.0.10-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b11b51b8a101a4dd0b47d0c6b893098722b90fb67afe6fca9df6007f3363169
|
|
| MD5 |
e77bd085fe225f72253944dd7674cb46
|
|
| BLAKE2b-256 |
c580a728f23d3d7c90257213c9c3a095323f930de636819c268bed7a6984753c
|