Sobes.tech
Middle

¿Qué es el patrón Page Object?

sobes.tech AI

Respuesta de la IA

El patrón Page Object (PO) es una plantilla de diseño para la automatización de pruebas de interfaces web, que representa las páginas web como clases. Cada clase PO encapsula los elementos y acciones que realiza el usuario en una página específica.

Ventajas de su uso:

  • Legibilidad: El código de las pruebas se vuelve más comprensible, ya que interactúa con las páginas y sus elementos a través de métodos de alto nivel.
  • Mantenibilidad: Al cambiar los localizadores de los elementos en la página, basta con hacer modificaciones solo en la clase correspondiente de Page Object, sin necesidad de reescribir las pruebas que usan esos elementos.
  • Reutilización: Los métodos y elementos del Page Object pueden ser utilizados en diferentes escenarios de prueba.
  • Separación de responsabilidades: La lógica de interacción con los elementos UI está separada de la lógica del escenario de prueba.

Componentes principales:

  • Clases de páginas: Representan una abstracción de una página web concreta.
  • Elementos web: Se definen dentro de la clase de la página usando localizadores (XPath, selectores CSS, ID, etc.).
  • Métodos: Representan acciones que se pueden realizar en la página (por ejemplo, login(), addToCart(), search()). Estos métodos interactúan con los elementos web.

Ejemplo de estructura:

# 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 del campo de entrada de usuario
        self.password_input = (By.ID, "password")  # Localizador del campo de entrada de contraseña
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Localizador del botón de inicio de sesión
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Localizador del mensaje de error

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

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Ingresa el nombre de usuario
        self.driver.find_element(*self.password_input).send_keys(password) # Ingresa la contraseña

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Hace clic en el botón de inicio de sesión

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Obtiene el texto del mensaje de error
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Importa la clase Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Inicializa el driver
        self.login_page = LoginPage(self.driver) # Crea una instancia de Page Object

    def tearDown(self):
        self.driver.quit() # Cierra el driver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Abre la página
        self.login_page.enter_credentials("valid_user", "valid_password") # Ingresa los datos
        self.login_page.click_login_button() # Hace clic en el botón
        # Validaciones adicionales después del inicio de sesión exitoso

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Abre la página
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Ingresa los datos
        self.login_page.click_login_button() # Hace clic en el botón
        error_text = self.login_page.get_error_message() # Obtiene el texto del error
        self.assertIn("Credenciales incorrectas", error_text) # Verifica el mensaje de error

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

En este ejemplo, LoginPage representa un Page Object para la página de inicio de sesión. Las pruebas en test_login.py utilizan los métodos de esta clase, abstraídas de los detalles de interacción con los elementos.

El patrón Page Object es un estándar de facto en la automatización de pruebas de interfaces web debido a sus ventajas en cuanto a mantenibilidad y legibilidad.