Sobes.tech
Middle

O que é o padrão Page Object?

sobes.tech IA

Resposta da IA

O padrão Page Object é um padrão de design utilizado para melhorar a legibilidade, manutenção e reduzir a duplicação de código na automação de testes de aplicações web. É uma abordagem orientada a objetos onde cada página (ou componente significativo) da aplicação web é representada por uma classe.

Ideias principais do Page Object:

  • Encapsulamento dos elementos da página e ações que podem ser realizadas com eles.
  • Separação dos localizadores de elementos e da lógica de negócio dos testes.
  • Fornecer uma API de alto nível para interagir com a página.

Vantagens do uso do Page Object:

  • Melhoria na legibilidade dos testes: Os testes tornam-se mais declarativos, descrevendo os passos de interação com a interface de utilizador em linguagem de negócio.
  • Melhoria na manutenção: Quando há uma alteração na UI (por exemplo, o localizador de um elemento), basta fazer a alteração numa única classe Page Object, em vez de em cada teste que utiliza esse elemento.
  • Redução da duplicação de código: As ações comuns com a página estão encapsuladas em métodos de Page Object e podem ser reutilizadas em diferentes testes.
  • Aumento da estabilidade dos testes: Graças à abstração dos detalhes de implementação da UI.

Exemplo de estrutura:

Suponhamos que temos uma página de login. Podemos criar uma classe LoginPage.

# login_page.py
from selenium.webdriver.common.by import By

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.XPATH, "//button[text()='Login']")

    def set_username(self, username):
        self.driver.find_element(*self.username_input).send_keys(username)

    def set_password(self, password):
        self.driver.find_element(*self.password_input).send_keys(password)

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click()

    def login(self, username, password):
        self.set_username(username)
        self.set_password(password)
        self.click_login_button()

Uso no teste:

# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://example.com/login")

    def test_valid_login(self):
        login_page = LoginPage(self.driver)
        login_page.login("valid_user", "valid_password")
        # Verificação do login bem-sucedido

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()

Aqui, a classe LoginPage encapsula os localizadores e ações relacionadas à página de login. O teste test_valid_login interage com LoginPage através de métodos de alto nível como login. Se o localizador do campo de usuário mudar, basta modificar apenas na LoginPage.