Security News
Maven Central Adds Sigstore Signature Validation
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.
<img src=https://github.com/douglasdcm/guara/raw/main/docs/images/guara.jpg width="300" height="300" />
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.
Application.at(apage.DoSomething [,with_parameter=value, ...]).asserts(it.Matches, a_condition)
[!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.
AbstractTransaction
: This is the class from which all transactions inherit. The do
method is implemented by each transaction. In this method, calls to WebDriver are placed. If the method returns something, like a string, the automation can use it for assertions.
IAssertion
: This is the interface implemented by all assertion classes.asserts
method of each subclass contains the logic to perform validations. For example, the IsEqualTo
subclass compares the result
with the expected value provided by the tester.
Application
: This is the runner of the automation. It executes the do
method of each transaction and validates the result using the asserts
method.asserts
method receives a reference to an IAssertion
instance. It implements the Strategy Pattern (GoF)
to allow its behavior to change at runtime.Application
is the result
property. It holds the result of the transaction, which can be used by asserts
or inspected by the test using the native built-in assert
method.The idea is to group blocks of interactions into classes. These classes inherit from AbstractTransaction
and override the do
method.
Each transaction is passed to the Application
instance, which provides the methods at
and asserts
. These are the only two methods necessary to orchestrate the automation. While it is primarily bound to Selenium WebDriver
, experience shows that it can also be used to test REST APIs, unit tests and can be executed in asynchronous mode (check the examples
folder).
When the framework is in action, it follows a highly repetitive pattern. Notice the use of the at
method to invoke transactions and the asserts
method to apply assertion strategies. Also, the automation is described in plain English improving the comprehension of the code.
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)
# Still at Home page changes the language
# to English and uses many assertions to validate the `result`
result = app.at(home.ChangeToEnglish).result
it.IsEqualto().asserts(result, content_in_english)
it.Contains().asserts(result, content_in_english)
# 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)
setup.OpenApp
and setup.CloseApp
are part of the framework and provide basic implementation to open and close the web application using Selenium Webdriver.it
is the module which contains the concrete assertions.The ugly code which calls the webdriver is like this:
class ChangeToPortuguese(AbstractTransaction):
def __init__(self, driver):
super().__init__(driver)
# Implements the `do` method and returns the `result`
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
Again, it is a very repetitive activity:
AbstractTransaction
do
method
Read more in Tutorial
This framework can be installed by
pip install guara
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.ini
file. 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
Read the step-by-step to build your first automation with this framework.
It is possible to run Guara using other Web Drivers like Caqui and Playwright. Check the requirements of each Web Driver before execute it. For example, Playwright requires the installation of browsers separately.
The core code was extended to allow asynchronous executions. Get more details here
It is possible to use ChatGPT to help you organize your code in Page Transactions
pattern. Check these simple steps.
Page Transactions is primarily based on the Command Pattern (GoF), making it suitable for product development as well, even though that is not its primary intent. This section is dedicated to showcasing other uses of the framework that are unrelated to automation testing.
Software engineers, UX designers with some knowledge of programming, and software students can leverage this project to build simple applications that are testable by default. For example, To-Do List web application was built with Guara and PyScript.
Here's how you can help with this:
good first issue
here, assign any to you and push the code.Read the Code of Conduct before push new Merge Requests.
Now, follow the steps in Contributing session.
FAQs
Framework to build UI test automation in Page Transactions pattern
We found that guara demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.
Security News
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Research
Security News
Socket researchers uncovered a backdoored typosquat of BoltDB in the Go ecosystem, exploiting Go Module Proxy caching to persist undetected for years.