Correr todos los tests contra Chromium, Firefox y WebKit en cada PR triplica el tiempo de CI sin una cobertura proporcional de bugs, porque la mayoría de los fallos no son específicos del navegador. Las diferencias que realmente importan entre motores son concretas: renderizado de inputs de fecha, casos límite de CSS flexbox, permisos de la API del portapapeles y comportamiento de la subida de archivos. Este artículo cubre cuándo es suficiente testear solo en Chromium, cómo configurar proyectos de navegador por niveles en playwright.config.ts, y cómo manejar la lógica específica de cada navegador cuando la necesitas.
Los tres proyectos de navegador
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
],
});Ejecutar todos los navegadores:
npx playwright testEjecutar un solo navegador:
npx playwright test --project=webkitChromium, Firefox y WebKit: qué es diferente
Chromium: el motor JavaScript V8, renderizado Blink. Chrome y Edge usan Chromium. Aproximadamente el 65% del tráfico web de escritorio en 2026. Es tu objetivo principal. Firefox: motor JavaScript SpiderMonkey, renderizado Gecko. Alrededor del 5% del tráfico de escritorio. Comportamiento CSS diferente en casos límite, renderizado distinto de elementos de formulario, manejo diferente de algunas Web APIs. WebKit: JavaScriptCore, renderizado WebKit. Safari en Mac e iOS. iOS usa WebKit exclusivamente: todos los navegadores de iOS tienen WebKit por debajo. Si tus usuarios incluyen personas con iPhone (y sí los incluyen), testear en WebKit no es opcional.Qué falla realmente en el testing cross-browser
La mayoría de las aplicaciones web funciona igual en los tres motores. Las diferencias que importan:
CSS:gap en flexbox, subgrid, las nuevas @container queries, backdrop-filter, algunas funciones de color, todas se comportan ligeramente diferente entre motores o no son compatibles en versiones anteriores.
Inputs de fecha y hora: se renderiza de forma muy distinta entre navegadores. WebKit y Firefox tienen sus propios selectores de fecha nativos.
Subida de archivos: el diálogo del selector de archivos varía. setInputFiles() de Playwright lo evita, pero el manejo del evento filechooser difiere.
Comportamiento del scrollbar: WebKit (en Mac) oculta las barras de scroll por defecto. Los tests que hacen clic en coordenadas cerca del scrollbar pueden comportarse diferente.
API del portapapeles: navigator.clipboard requiere permiso del usuario. Funciona distinto en cada navegador bajo automatización.
Elemento : soporte completo en todos los navegadores modernos, pero con diferencias de comportamiento en versiones anteriores de los motores.
WebRTC, WebSockets, Service Workers: generalmente consistentes ahora, aunque históricamente tuvieron diferencias cross-browser.
Estrategia cross-browser: testing por niveles
Correr todos los tests en todos los navegadores triplica el tiempo de CI. El enfoque práctico es por niveles:
Nivel 1: cada PR (solo Chromium)
Suite de regresión completa, tests de funcionalidades y tests de API.
Nivel 2: merge a main (Chromium + Firefox + WebKit)
Smoke tests en todos los navegadores y tests en áreas con riesgo cross-browser conocido (inputs de fecha, subida de archivos, interacciones que dependen de CSS).
Nivel 3: ejecución nocturna (todos los navegadores, suite completa)
Regresión cross-browser completa.
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
const isCIFullRun = process.env.CROSS_BROWSER === 'true';
export default defineConfig({
projects: [
// Siempre ejecutar Chromium
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
// Solo ejecutar Firefox y WebKit en modo cross-browser
...(isCIFullRun ? [
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
] : []),
],
});# .github/workflows/tests.yml
- name: Ejecutar tests cross-browser
if: github.event_name == 'schedule' # Solo en la ejecución nocturna
run: CROSS_BROWSER=true npx playwright testInstalar los navegadores
Playwright descarga los binarios del navegador por separado. Para instalar los tres:
npx playwright installPara instalar navegadores específicos:
npx playwright install chromium firefox webkitEn CI, usa la imagen Docker que incluye todos los navegadores:
- run: npx playwright install --with-deps--with-deps también instala las dependencias del sistema (fuentes, codecs) que los navegadores de Playwright necesitan.
Manejar el comportamiento específico de cada navegador en los tests
Cuando un test necesita comportarse diferente según el navegador:
import { test, expect } from '@playwright/test';
test('comportamiento del input de fecha', async ({ page, browserName }) => {
await page.goto('/reservar-turno');
if (browserName === 'webkit') {
// El selector de fecha nativo de WebKit requiere una interacción diferente
await page.getByLabel('Fecha').fill('2026-06-15');
} else {
await page.getByLabel('Fecha').type('06/15/2026');
}
await expect(page.getByLabel('Fecha')).toHaveValue('2026-06-15');
});browserName es uno de 'chromium', 'firefox' o 'webkit'.
Para saltear un test en un navegador específico:
test('usa la API del portapapeles', async ({ page, browserName }) => {
test.skip(browserName === 'firefox', 'La API del portapapeles requiere permisos en Firefox');
// ...
});Navegador real vs emulación
Playwright corre contra motores de navegador reales, no entornos simulados. Los tests de WebKit corren contra el motor WebKit real (el mismo que impulsa Safari), no un simulador de Safari que imita Chrome.
Esto importa: los bugs cross-browser que encuentras en el proyecto WebKit de Playwright se reproducen en Safari real. No es 100% idéntico (Playwright usa una versión de WebKit ligeramente más nueva que la Safari publicada), pero es lo suficientemente cercano para detectar problemas reales.
→ See also: Estrategias de Testing Cruzado de Navegadores: Cuándo y Cómo Probar Múltiples Navegadores | Emulación Móvil en Playwright: Pruebas Responsivas y Táctiles | Ejecución Paralela en Playwright: Workers, Fragmentos y Fragmentación para Mayor Velocidad