Sobes.tech
Middle

O que é o padrão Page Object?

sobes.tech IA

Resposta da IA

O padrão Page Object (PO) é um modelo de design para a automação de testes de interfaces web, que representa as páginas web como classes. Cada classe PO encapsula os elementos e ações realizados pelo utilizador numa página específica.

Vantagens do seu uso:

  • Legibilidade: O código de teste torna-se mais compreensível, pois interage com as páginas e seus elementos através de métodos de alto nível.
  • Manutenção: Quando os localizadores de elementos na página mudam, basta fazer alterações apenas na classe correspondente do Page Object, sem precisar reescrever os testes que usam esses elementos.
  • Reutilização: Os métodos e elementos do Page Object podem ser utilizados em diferentes cenários de teste.
  • Separação de responsabilidades: A lógica de interação com os elementos UI está separada da lógica do cenário de teste.

Componentes principais:

  • Classes de páginas: Representam uma abstração de uma página web concreta.
  • Elementos web: São definidos dentro da classe da página usando localizadores (XPath, seletores CSS, ID, etc.).
  • Métodos: Representam ações que podem ser realizadas na página (por exemplo, login(), addToCart(), search()). Estes métodos interagem com os elementos web.

Exemplo de estrutura:

# 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")  # Localizador do campo de entrada de nome de utilizador
        self.password_input = (By.ID, "password")  # Localizador do campo de entrada de palavra-passe
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Localizador do botão de login
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Localizador da mensagem de erro

    def open(self, url):
        self.driver.get(url) # Abre a página

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Insere o nome de utilizador
        self.driver.find_element(*self.password_input).send_keys(password) # Insere a palavra-passe

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Clica no botão de login

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Obtém o texto da mensagem de erro
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Importa a classe Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Inicializa o driver
        self.login_page = LoginPage(self.driver) # Cria uma instância de Page Object

    def tearDown(self):
        self.driver.quit() # Encerra o driver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Abre a página
        self.login_page.enter_credentials("valid_user", "valid_password") # Insere os dados
        self.login_page.click_login_button() # Clica no botão
        # Verificações adicionais após login bem-sucedido

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Abre a página
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Insere os dados
        self.login_page.click_login_button() # Clica no botão
        error_text = self.login_page.get_error_message() # Obtém o texto do erro
        self.assertIn("Credenciais incorretas", error_text) # Verifica a mensagem de erro

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

Neste exemplo, LoginPage representa um Page Object para a página de login. Os testes em test_login.py usam os métodos desta classe, abstraídos dos detalhes de interação com os elementos.

O padrão Page Object é um padrão de facto na automação de testes de interfaces web devido às suas vantagens em termos de manutenção e legibilidade.