Conceptos básicos de operaciones de página de Playwright
En este capítulo, conoceremos cómo Playwright interactúa realmente con las páginas web y las API de operaciones de página más utilizadas.
Navegación de página
La navegación de página es la operación más común. Playwright proporciona varias API para abrir, actualizar y controlar la transición de páginas.
1. Abrir página web (page.goto)
await page.goto('https://example.com');
Parámetros comunes:
url: la dirección a visitartimeout: tiempo de espera, por defecto 30 segundos-
waitUntil: condición de espera para la carga de la página'load': esperarloadevento (cuando la página y todos los recursos se han cargado por completo)'domcontentloaded': esperar a que el contenido del DOM se cargue por completo'networkidle': esperar a que la red esté inactiva
Ejemplo
2. Actualizar página (page.reload)
Actualiza la página actual.
await page.reload({ waitUntil: 'networkidle' });
3. Adelante / Atrás (page.goBack / page.goForward)
Simula los botones de adelante y atrás del navegador.
await page.goto('https://example.com');
await page.goto('https://playwright.dev');
await page.goBack(); // 返回 example.com
await page.goForward(); // 前进到 playwright.dev
4. Esperar la carga de la página
A veces es necesario esperar explícitamente a que la página cargue un elemento. Playwright proporciona un mecanismo de espera inteligente.
await page.waitForLoadState('networkidle'); // 等待网络空闲
await page.waitForSelector('#main-content'); // 等待元素出现
Localización de elementos
Para interactuar con la página, primero hay que localizar el elemento objetivo. Playwright ofrece una variedad de selectores.
1. Selector CSS
Es el método de localización más utilizado y es coherente con el desarrollo frontend.
await page.click('#login-button'); // 通过 id
await page.click('.btn-primary'); // 通过 class
await page.click('form > button'); // 通过层级关系
2. Selector XPath
Localiza elementos mediante expresiones XPath.
await page.click('//button[text()="登录"]');
await page.click('//input[@name="username"]');
XPath es más flexible, pero menos legible, por lo que no se recomienda como primera opción.
3. Localización por contenido de texto
Localiza mediante el texto visible del elemento.
await page.click('text=登录');
await page.click('button:has-text("提交")');
4. Localización por atributo
Selecciona directamente usando atributos.
await page.fill('input[name="email"]', '[email protected]');
await page.click('[data-test="submit-button"]');
5. Mejores prácticas para estrategias de localización
- Prioriza el uso de selectores únicos y estables(como
data-testid、data-testatributo) - Evita depender de ids o nombres de clase dinámicos
- Usa
page.getByRole、page.getByTexty otros métodos con mejor legibilidad (recomendado en Playwright 5.x)
Ejemplo
await page.getByRole('button', { name: 'Enviar' }).click();
await page.getByPlaceholder('Ingrese el nombre de usuario').fill('admin');
Interacciones básicas
Playwright admite múltiples formas de interactuar con los elementos, cubriendo clic, entrada de texto, teclado y ratón.
1. Operación de clic (page.click)
await page.click('#submit');
Parámetros opcionales:
button:'left' | 'right' | 'middle'(botón izquierdo por defecto)clickCount: número de clics (establecer en 2 para doble clic)modifiers: combinación de teclas (por ejemplo,['Control'])
Ejemplo
await page.dblclick('#submit'); // doble clic
2. Ingresar texto (fill vs type)
fill(selector, value): limpia el campo de entrada e ingresa el nuevo valor (recomendado, se usa en la mayoría de los casos)type(selector, text): simula la entrada carácter por carácter (con retraso, más parecida a un usuario real)
Ejemplo
await page.type('input[name="search"]', 'playwright', { delay: 200 });
3. Operaciones de teclado
press: simula la pulsación de teclaskeyboard.type: ingresa texto de forma continuakeyboard.press: presiona una tecla (puede incluir combinaciones de teclas)
Ejemplo
await page.keyboard.type('Hello World!');
await page.keyboard.press('Control+A'); // seleccionar todo
await page.keyboard.press('Backspace'); // eliminar
4. Operaciones de ratón
Playwright proporciona un control completo del ratón:
hover: pasar el ratón por encimamouse.move(x, y): mover a coordenadasmouse.click(x, y): hacer clic en coordenadasmouse.down / mouse.up: presionar/soltar el botón del ratóndragAndDrop: arrastrar un elemento (Playwright 1.18+)
Ejemplo
await page.mouse.move(100, 200); // mover a coordenadas
await page.mouse.click(120, 220); // hacer clic en coordenadas
await page.dragAndDrop('#item1', '#dropzone'); // arrastrar hasta el área de destino
Ejemplo completo: simular inicio de sesión y tomar captura de pantalla
A continuación se muestra un script completo de Playwright que demuestra operaciones básicas como navegación, localización, ingreso de texto y clic.
Ejemplo
(async () => {
// 1. Iniciar el navegador y crear una nueva página
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
// 2. Navegar a la página de inicio de sesión
await page.goto('https://github.com/login');
console.log(`Título de la página actual: ${await page.title()}`);
// 3. Localización de elementos e ingreso de texto
// Localizar el campo de entrada de nombre de usuario e ingresar el nombre de usuario
await page.locator('#login_field').fill('your_username');
// Localizar el campo de entrada de contraseña e ingresar la contraseña
await page.locator('#password').fill('your_password');
// 4. Hacer clic en el botón de inicio de sesión
// Usar .getByRole() es una forma de localización más robusta
await page.getByRole('button', { name: 'Sign in' }).click();
// 5. Esperar a que la navegación de la página se complete para asegurar el inicio de sesión exitoso
await page.waitForURL('https://github.com/');
// 6. Tomar y guardar una captura de pantalla para confirmar el estado de inicio de sesión
await page.screenshot({ path: 'github_homepage.png' });
console.log('Inicio de sesión exitoso, y se ha tomado captura de pantalla');
// 7. Cerrar el navegador
await browser.close();
})();
Método de ejecución:
- Guarda el código en el directorio del proyecto comogithub_login.js。
- Ejecútalo en la terminalnode github_login.js。
Tabla resumen de API comunes
| Categoría | Método / Propiedad | Descripción |
|---|---|---|
| Navegación de página | page.goto(url[, options]) |
Abrir página |
page.reload([options]) |
Actualizar página | |
page.goBack([options]) |
Atrás | |
page.goForward([options]) |
Adelante | |
page.waitForLoadState([state]) |
Esperar el estado de carga de la página | |
| Localización de elementos | page.locator(selector) |
Localizador genérico |
page.getByRole(role, options) |
Localizar por rol | |
page.getByText(text) |
Localizar por texto | |
page.getByPlaceholder(text) |
Localizar por placeholder | |
page.getByLabel(text) |
Localizar por label | |
| Interacciones básicas | page.click(selector[, options]) |
Hacer clic en un elemento |
page.dblclick(selector) |
Doble clic | |
page.fill(selector, value) |
Ingresar texto (limpiar y luego llenar) | |
page.type(selector, text[, options]) |
Simular entrada carácter por carácter | |
page.press(selector, key) |
Pulsar una tecla sobre un elemento | |
page.keyboard.type(text) |
Entrada de teclado | |
page.keyboard.press(key) |
Pulsación de teclas (incluye combinaciones) | |
page.hover(selector) |
Pasar el ratón | |
page.mouse.move(x, y) |
Mover el ratón | |
page.mouse.click(x, y[, options]) |
Clic en coordenadas | |
page.dragAndDrop(src, dest) |
Arrastrar elementos |