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.
