Основы операций со страницами в Playwright
В этой главе мы узнаем, как Playwright взаимодействует с веб-страницами, и рассмотрим наиболее часто используемые API для работы со страницами.
Навигация по страницам
Навигация по страницам — наиболее распространённая операция. Playwright предоставляет несколько API для открытия, обновления и управления навигацией по страницам.
1. Открыть веб-страницу (page.goto)
await page.goto('https://example.com');
Общие параметры:
url: адрес для переходаtimeout: тайм-аут, по умолчанию 30 секунд-
waitUntil: условия ожидания загрузки страницы'load': ожидатьloadсобытие (страница и ресурсы полностью загружены)'domcontentloaded': дождаться завершения загрузки DOM-контента'networkidle': дождаться простоя сети
Пример
2. Обновить страницу (page.reload)
Обновить текущую страницу.
await page.reload({ waitUntil: 'networkidle' });
3. Вперёд / Назад (page.goBack / page.goForward)
Имитировать кнопки «Вперёд» и «Назад» браузера.
await page.goto('https://example.com');
await page.goto('https://playwright.dev');
await page.goBack(); // 返回 example.com
await page.goForward(); // 前进到 playwright.dev
4. Ожидание загрузки страницы
Иногда нужно явно дождаться загрузки определённого элемента на странице. Playwright предоставляет умный механизм ожидания.
await page.waitForLoadState('networkidle'); // 等待网络空闲
await page.waitForSelector('#main-content'); // 等待元素出现
Поиск элементов
Чтобы взаимодействовать со страницей, сначала нужно найти целевой элемент. Playwright предоставляет множество селекторов.
1. CSS-селекторы
Самый распространённый способ поиска, совместимый с фронтенд-разработкой.
await page.click('#login-button'); // 通过 id
await page.click('.btn-primary'); // 通过 class
await page.click('form > button'); // 通过层级关系
2. Селекторы XPath
Поиск элементов с помощью выражений XPath.
await page.click('//button[text()="登录"]');
await page.click('//input[@name="username"]');
XPath более гибок, но менее читаем, поэтому его не рекомендуется выбирать в первую очередь.
3. Поиск по текстовому содержимому
Поиск по видимому тексту элемента.
await page.click('text=登录');
await page.click('button:has-text("提交")');
4. Поиск по атрибуту
Используйте атрибуты напрямую для выбора.
await page.fill('input[name="email"]', '[email protected]');
await page.click('[data-test="submit-button"]');
5. Лучшие практики для стратегий поиска
- Предпочитайте уникальные и стабильные селекторы(например,
data-testid、data-testатрибут) - Избегайте использования динамических id или имён классов
- Используйте
page.getByRole、page.getByTextи других более читаемых методов (рекомендуется в Playwright 5.x)
Пример
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByPlaceholder('Please enter username').fill('admin');
Основные взаимодействия
Playwright поддерживает несколько способов взаимодействия с элементами, включая клики, ввод текста, операции с клавиатурой и мышью.
1. Операции клика (page.click)
await page.click('#submit');
Необязательные параметры:
button:'left' | 'right' | 'middle'(левая кнопка по умолчанию)clickCount: количество кликов (установите 2 для двойного клика)modifiers: клавиши-модификаторы клавиатуры (например,['Control'])
Пример
await page.dblclick('#submit'); // Двойной клик
2. Ввод текста (fill против type)
fill(selector, value): очищает поле ввода и вводит новое значение (рекомендуется, используется в большинстве случаев)type(selector, text): имитировать посимвольный ввод (с задержкой, ближе к поведению реального пользователя)
Пример
await page.type('input[name="search"]', 'playwright', { delay: 200 });
3. Операции с клавиатурой
press: имитировать нажатия клавишkeyboard.type: непрерывно вводить текстkeyboard.press: нажать клавишу (может включать клавиши-модификаторы)
Пример
await page.keyboard.type('Hello World!');
await page.keyboard.press('Control+A'); // Выбрать все
await page.keyboard.press('Backspace'); // Удалить
4. Операции с мышью
Playwright обеспечивает полный контроль мышью:
hover: наведение мышиmouse.move(x, y): перемещение к координатамmouse.click(x, y): клик по координатамmouse.down / mouse.up: нажать/отпустить кнопку мышиdragAndDrop: перетаскивание элемента (Playwright 1.18+)
Пример
await page.mouse.move(100, 200); // Перемещение к координатам
await page.mouse.click(120, 220); // Клик по координатам
await page.dragAndDrop('#item1', '#dropzone'); // Перетаскивание в целевую область
Полный пример: имитация входа и создание скриншота
Ниже приведён полный скрипт Playwright, демонстрирующий основные операции, такие как навигация, поиск элементов, ввод текста и клики.
Пример
(async () => {
// 1. Запустить браузер и создать новую страницу
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
// 2. Перейти на страницу входа
await page.goto('https://github.com/login');
console.log(`Текущий заголовок страницы: ${await page.title()}`);
// 3. Поиск элементов и ввод
// Найти поле ввода имени пользователя и ввести имя пользователя
await page.locator('#login_field').fill('your_username');
// Найти поле ввода пароля и ввести пароль
await page.locator('#password').fill('your_password');
// 4. Нажать кнопку входа
// Использование .getByRole() — более надёжный метод поиска
await page.getByRole('button', { name: 'Sign in' }).click();
// 5. Дождитесь завершения навигации по странице, чтобы убедиться в успешном входе
await page.waitForURL('https://github.com/');
// 6. Сделайте скриншот и сохраните его, чтобы подтвердить статус входа
await page.screenshot({ path: 'github_homepage.png' });
console.log('Вход выполнен, скриншот сделан');
// 7. Закройте браузер
await browser.close();
})();
Как запустить:
- Сохраните код в каталоге проекта какgithub_login.js。
- Выполните в терминалеnode github_login.js。
Сводная таблица общих API
| Категория | Метод / Свойство | Описание |
|---|---|---|
| Навигация по страницам | page.goto(url[, options]) |
Открыть страницу |
page.reload([options]) |
Обновить страницу | |
page.goBack([options]) |
Назад | |
page.goForward([options]) |
Вперёд | |
page.waitForLoadState([state]) |
Ожидание состояния загрузки страницы | |
| Поиск элементов | page.locator(selector) |
Универсальный локатор |
page.getByRole(role, options) |
Поиск по роли | |
page.getByText(text) |
Поиск по тексту | |
page.getByPlaceholder(text) |
Поиск по placeholder | |
page.getByLabel(text) |
Поиск по label | |
| Основные взаимодействия | page.click(selector[, options]) |
Клик по элементу |
page.dblclick(selector) |
Двойной клик | |
page.fill(selector, value) |
Ввод текста (очистить, затем заполнить) | |
page.type(selector, text[, options]) |
Имитация посимвольного ввода | |
page.press(selector, key) |
Нажатие клавиши на элементе | |
page.keyboard.type(text) |
Ввод с клавиатуры | |
page.keyboard.press(key) |
Нажатие клавиши клавиатуры (включая комбинации с модификаторами) | |
page.hover(selector) |
Наведение | |
page.mouse.move(x, y) |
Перемещение мыши | |
page.mouse.click(x, y[, options]) |
Щёлкнуть по координатам | |
page.dragAndDrop(src, dest) |
Перетаскивание элемента |