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.