Skip to main content

Framework to build UI test automation in Page Transactions pattern

Project description

Guará

PyPI Downloads

Photo by Mateus Campos Felipe on Unsplash


Scarlet ibis (Guará)

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

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

Watch the video

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 do method
    • 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.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

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 issue here, 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

guara-0.0.10.tar.gz (842.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

guara-0.0.10-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

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

Hashes for guara-0.0.10.tar.gz
Algorithm Hash digest
SHA256 44a74078ac7c3e030a689f1e84e2a8dcd9c66034eb5ac6b326ac4f40ee60be9d
MD5 89b94b88d31a4f7c68c81d26d0737b1d
BLAKE2b-256 8849ead30d2db722970e6b75b930d740b9095eb44ecf42f0f19a721033e6d55d

See more details on using hashes here.

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

Hashes for guara-0.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 1b11b51b8a101a4dd0b47d0c6b893098722b90fb67afe6fca9df6007f3363169
MD5 e77bd085fe225f72253944dd7674cb46
BLAKE2b-256 c580a728f23d3d7c90257213c9c3a095323f930de636819c268bed7a6984753c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page