La mayoría de la gente conoce Playwright como una herramienta para automatizar tests de interfaz de usuario. Lo que mucha gente no sabe es que Playwright también tiene una API completa para hacer pruebas de APIs REST directamente, sin necesidad de abrir un navegador. En este artículo te explico cómo funciona y cuándo tiene sentido usarla.
Por qué Playwright para API testing
Playwright tiene un cliente HTTP integrado que permite hacer requests a APIs directamente desde tus tests. Esto abre una posibilidad muy interesante — combinar tests de UI y tests de API en el mismo proyecto, con las mismas herramientas y el mismo framework.
Ventajas concretas de usar Playwright para API testing frente a otras herramientas como Postman o requests de Python:
Puedes preparar el estado de la aplicación a través de la API antes de ejecutar un test de UI. Por ejemplo, crear un usuario mediante la API y luego probar el login desde el navegador — sin tener que hacerlo todo desde la interfaz.
Puedes verificar el estado de la API después de una acción en la UI. Por ejemplo, añadir un producto al carrito y verificar que la API de inventario refleja el cambio correctamente.
Todo en el mismo framework, con los mismos fixtures, los mismos reporters y el mismo pipeline de CI/CD.
APIRequestContext — el cliente HTTP de Playwright
Playwright proporciona el objeto APIRequestContext para hacer requests HTTP. Puedes acceder a él de dos formas.
Usando la request del contexto del navegador
Cuando tienes un test con la página abierta, puedes usar page.request para hacer requests HTTP que comparten el mismo contexto — incluyendo las cookies de sesión:
python
from playwright.sync_api import Page
def test_api_con_sesion(page: Page):
# Primero hacemos login en la UI
page.goto("https://miweb.com/login")
page.fill("#email", "usuario@test.com")
page.fill("#password", "password123")
page.click("#btn-login")
# Ahora usamos la misma sesión para hacer requests a la API
response = page.request.get("https://miweb.com/api/perfil")
assert response.status == 200
data = response.json()
assert data["email"] == "usuario@test.com"
Usando APIRequestContext de forma independiente
Para tests de API puros sin necesidad de un navegador, puedes crear un contexto HTTP independiente:
python
import pytest
from playwright.sync_api import Playwright
@pytest.fixture
def api_context(playwright: Playwright):
context = playwright.request.new_context(
base_url="https://api.miweb.com"
)
yield context
context.dispose()
Tu primer test de API con Playwright
Aquí va un ejemplo completo de tests de API usando Playwright con Python:
python
import pytest
from playwright.sync_api import Playwright, APIRequestContext
@pytest.fixture(scope="session")
def api_context(playwright: Playwright):
context = playwright.request.new_context(
base_url="https://jsonplaceholder.typicode.com"
)
yield context
context.dispose()
def test_get_usuarios(api_context: APIRequestContext):
response = api_context.get("/users")
assert response.status == 200
usuarios = response.json()
assert len(usuarios) > 0
assert "name" in usuarios[0]
assert "email" in usuarios[0]
def test_get_usuario_por_id(api_context: APIRequestContext):
response = api_context.get("/users/1")
assert response.status == 200
usuario = response.json()
assert usuario["id"] == 1
assert usuario["name"] == "Leanne Graham"
def test_crear_post(api_context: APIRequestContext):
nuevo_post = {
"title": "Mi post de prueba",
"body": "Contenido del post",
"userId": 1
}
response = api_context.post("/posts", data=nuevo_post)
assert response.status == 201
post_creado = response.json()
assert post_creado["title"] == "Mi post de prueba"
assert "id" in post_creado
def test_actualizar_post(api_context: APIRequestContext):
datos_actualizados = {
"title": "Título actualizado"
}
response = api_context.patch("/posts/1", data=datos_actualizados)
assert response.status == 200
post = response.json()
assert post["title"] == "Título actualizado"
def test_eliminar_post(api_context: APIRequestContext):
response = api_context.delete("/posts/1")
assert response.status == 200
Hacer requests con autenticación
La mayoría de APIs reales requieren autenticación. Playwright permite configurar headers de autenticación a nivel del contexto para que se apliquen a todas las requests:
python
@pytest.fixture(scope="session")
def api_autenticada(playwright: Playwright):
context = playwright.request.new_context(
base_url="https://api.miweb.com",
extra_http_headers={
"Authorization": "Bearer mi-token-de-api",
"Content-Type": "application/json"
}
)
yield context
context.dispose()
def test_endpoint_protegido(api_autenticada: APIRequestContext):
response = api_autenticada.get("/usuario/perfil")
assert response.status == 200
Obtener el token mediante login y usarlo en las requests
Una situación muy común es necesitar hacer login primero para obtener un token y luego usarlo en el resto de tests:
python
import pytest
from playwright.sync_api import Playwright, APIRequestContext
@pytest.fixture(scope="session")
def token(playwright: Playwright):
context = playwright.request.new_context(
base_url="https://api.miweb.com"
)
response = context.post("/auth/login", data={
"email": "usuario@test.com",
"password": "password123"
})
assert response.status == 200
return response.json()["token"]
@pytest.fixture(scope="session")
def api_autenticada(playwright: Playwright, token):
context = playwright.request.new_context(
base_url="https://api.miweb.com",
extra_http_headers={"Authorization": f"Bearer {token}"}
)
yield context
context.dispose()
def test_obtener_pedidos(api_autenticada: APIRequestContext):
response = api_autenticada.get("/pedidos")
assert response.status == 200
pedidos = response.json()
assert isinstance(pedidos, list)
Combinar API testing y UI testing en el mismo test
Aquí es donde Playwright realmente brilla frente a otras herramientas de API testing. Puedes preparar el estado de la aplicación via API y luego verificar la UI, o al revés:
python
def test_crear_usuario_y_verificar_en_ui(
page: Page,
api_context: APIRequestContext
):
# Crear usuario via API
response = api_context.post("/usuarios", data={
"nombre": "Test User",
"email": "testuser@test.com",
"password": "password123"
})
assert response.status == 201
usuario_id = response.json()["id"]
# Verificar que el usuario aparece en la UI de administración
page.goto("https://miweb.com/admin/usuarios")
assert page.get_by_text("testuser@test.com").is_visible()
# Limpiar — eliminar el usuario via API
api_context.delete(f"/usuarios/{usuario_id}")
Cuándo usar Playwright para APIs y cuándo usar Postman
Usa Playwright para API testing cuando ya tienes un proyecto Playwright y quieres mantener todo en el mismo framework, cuando necesitas combinar tests de UI y API en el mismo test, o cuando quieres reutilizar la sesión del navegador en los tests de API.
Usa Postman cuando quieras explorar y documentar APIs de forma interactiva, cuando el equipo no es técnico y necesita una interfaz visual, o cuando quieras compartir colecciones de tests con el equipo de desarrollo.
Si quieres profundizar en Playwright puedes leer cómo usar locators en Playwright o cómo interceptar peticiones de red.
Y si necesitas implementar una estrategia de API testing en tu proyecto puedes ver mis servicios en fatimaqa.com.
