Cómo automatizar formularios web con Playwright y Python: guía práctica

Los formularios son una de las partes más importantes de cualquier aplicación web y también una de las más propensas a tener bugs. Un campo que no valida correctamente, un botón que no responde, un mensaje de error que no aparece cuando debe — todo eso se detecta automatizando las pruebas del formulario. En este artículo te explico cómo hacerlo con Playwright y Python.


Por qué los formularios necesitan tests exhaustivos

Los formularios combinan múltiples tipos de interacción — escribir texto, seleccionar opciones, marcar checkboxes, subir archivos — y cada uno puede fallar de formas diferentes. Además tienen validaciones que deben probarse tanto con datos válidos como con datos inválidos.

Un formulario bien testeado cubre al menos estos escenarios: envío correcto con datos válidos, validación de campos obligatorios, validación de formatos incorrectos, comportamiento con valores límite y mensajes de error claros y útiles.


Rellenar campos de texto — fill() y type()

Playwright tiene dos métodos para introducir texto en campos:

fill() — reemplaza completamente el contenido del campo con el texto indicado. Es el método recomendado para la mayoría de casos.

type() — simula pulsaciones de teclado carácter a carácter. Útil cuando la aplicación tiene listeners de eventos de teclado que fill() no dispara.

python

from playwright.sync_api import Page

def test_formulario_contacto(page: Page):
    page.goto("https://miweb.com/contacto")
    
    page.get_by_label("Nombre").fill("Fátima Ocaña")
    page.get_by_label("Email").fill("fatima@test.com")
    page.get_by_label("Teléfono").fill("666123456")
    page.get_by_label("Mensaje").type("Este es mi mensaje de prueba")
    
    page.get_by_label("Nombre").clear()
    page.get_by_label("Nombre").fill("Nuevo nombre")

Selects — select_option()

python

def test_formulario_con_select(page: Page):
    page.goto("https://miweb.com/registro")
    
    page.get_by_label("País").select_option(label="España")
    page.get_by_label("Provincia").select_option(value="MA")
    page.get_by_label("Idioma").select_option(index=2)
    page.get_by_label("Intereses").select_option(
        ["tecnologia", "deportes", "cultura"]
    )

Checkboxes y radio buttons

python

def test_formulario_con_checkboxes(page: Page):
    page.goto("https://miweb.com/preferencias")
    
    page.get_by_label("Acepto los términos y condiciones").check()
    page.get_by_label("Suscribirme al newsletter").uncheck()
    
    assert page.get_by_label("Acepto los términos").is_checked()
    
    page.get_by_label("Recibir notificaciones").set_checked(True)

Para radio buttons:

python

def test_radio_buttons(page: Page):
    page.goto("https://miweb.com/encuesta")
    
    page.get_by_label("Satisfecho").check()
    
    assert page.get_by_label("Satisfecho").is_checked()
    assert not page.get_by_label("Insatisfecho").is_checked()

Upload de archivos — set_input_files()

python

def test_subir_archivo(page: Page):
    page.goto("https://miweb.com/perfil")
    
    page.get_by_label("Foto de perfil").set_input_files("tests/assets/foto.jpg")
    
    page.get_by_label("Documentos").set_input_files([
        "tests/assets/doc1.pdf",
        "tests/assets/doc2.pdf"
    ])
    
    assert page.get_by_text("foto.jpg").is_visible()

Validar mensajes de error

python

def test_validaciones_formulario(page: Page):
    page.goto("https://miweb.com/registro")
    
    page.get_by_role("button", name="Registrarse").click()
    
    assert page.get_by_text("El nombre es obligatorio").is_visible()
    assert page.get_by_text("El email es obligatorio").is_visible()
    
    page.get_by_label("Email").fill("noesun@email")
    page.get_by_role("button", name="Registrarse").click()
    
    assert page.get_by_text("El email no tiene un formato válido").is_visible()

Enviar el formulario y verificar el resultado

python

def test_envio_formulario_correcto(page: Page):
    page.goto("https://miweb.com/contacto")
    
    page.get_by_label("Nombre").fill("Fátima Ocaña")
    page.get_by_label("Email").fill("fatima@test.com")
    page.get_by_label("Asunto").fill("Consulta de prueba")
    page.get_by_label("Mensaje").fill("Este es el mensaje de prueba.")
    page.get_by_label("Acepto la política de privacidad").check()
    
    page.get_by_role("button", name="Enviar mensaje").click()
    
    assert page.get_by_text("Mensaje enviado correctamente").is_visible()
    assert page.url == "https://miweb.com/contacto/gracias"

Usar parametrize para múltiples casos

python

import pytest
from playwright.sync_api import Page

@pytest.mark.parametrize("email,esperado", [
    ("usuario@test.com", True),
    ("noesun@email", False),
    ("", False),
    ("@sindominio.com", False),
    ("usuario@.com", False),
])
def test_validacion_email(page: Page, email, esperado):
    page.goto("https://miweb.com/registro")
    page.get_by_label("Email").fill(email)
    page.get_by_role("button", name="Registrarse").click()
    
    error_visible = page.get_by_text("Email inválido").is_visible()
    assert error_visible != esperado

Si quieres saber más sobre parametrize puedes leer cómo usar pytest parametrize. Y si necesitas automatizar formularios en tu proyecto puedes ver mis servicios en fatimaqa.com.

Scroll al inicio