Библиотека
Введение
Библиотека Playwright предоставляет унифицированные API для запуска и взаимодействия с браузерами, в то время как Playwright Test предоставляет все это плюс полностью управляемый тестовый раннер для сквозного тестирования.
В большинстве случаев для сквозного тестирования вам следует использовать @playwright/test
(Playwright Test), а не playwright
(Playwright Library) напрямую. Чтобы начать работу с Playwright Test, следуйте руководству по началу работы.
Различия при использовании библиотеки
Пример использования библиотеки
Ниже приведен пример использования библиотеки Playwright напрямую для запуска Chromium, перехода на страницу и проверки ее заголовка:
- TypeScript
- JavaScript
import { chromium, devices } from 'playwright';
import assert from 'node:assert';
(async () => {
// Настройка
const browser = await chromium.launch();
const context = await browser.newContext(devices['iPhone 11']);
const page = await context.newPage();
// Основная часть
await context.route('**.jpg', route => route.abort());
await page.goto('https://example.com/');
assert(await page.title() === 'Example Domain'); // 👎 не Web First утверждение
// Завершение
await context.close();
await browser.close();
})();
const assert = require('node:assert');
const { chromium, devices } = require('playwright');
(async () => {
// Настройка
const browser = await chromium.launch();
const context = await browser.newContext(devices['iPhone 11']);
const page = await context.newPage();
// Основная часть
await context.route('**.jpg', route => route.abort());
await page.goto('https://example.com/');
assert(await page.title() === 'Example Domain'); // 👎 не Web First утверждение
// Завершение
await context.close();
await browser.close();
})();
Запустите его с помощью node my-script.js
.
Пример теста
Тест для достижения аналогичного поведения будет выглядеть следующим образом:
- TypeScript
- JavaScript
import { expect, test, devices } from '@playwright/test';
test.use(devices['iPhone 11']);
test('should be titled', async ({ page, context }) => {
await context.route('**.jpg', route => route.abort());
await page.goto('https://example.com/');
await expect(page).toHaveTitle('Example');
});
const { expect, test, devices } = require('@playwright/test');
test.use(devices['iPhone 11']);
test('should be titled', async ({ page, context }) => {
await context.route('**.jpg', route => route.abort());
await page.goto('https://example.com/');
await expect(page).toHaveTitle('Example');
});
Запустите его с помощью npx playwright test
.
Основные различия
Основные различия, которые следует отметить, следующие:
Библиотека | Тест | |
---|---|---|
Установка | npm install playwright | npm init playwright@latest - обратите внимание на install vs. init |
Установка браузеров | Установите @playwright/browser-chromium , @playwright/browser-firefox и/или @playwright/browser-webkit | npx playwright install или npx playwright install chromium для одного из них |
import из | playwright | @playwright/test |
Инициализация | Необходимо явно:
| Изолированные page и context предоставляются каждому тесту из коробки, вместе с другими встроенными фикстурами. Нет явного создания. Если они упоминаются в аргументах теста, Test Runner создаст их для теста. (т.е. ленивое создание) |
Утверждения | Нет встроенных Web-First утверждений | Web-First утверждения такие как: которые автоматически ждут и повторяют попытки, чтобы условие было выполнено. |
Тайм-ауты | По умолчанию 30 секунд для большинства операций. | Большинство операций не имеют тайм-аута, но каждый тест имеет тайм-аут, который заставляет его завершиться с ошибкой (по умолчанию 30 секунд). |
Очистка | Необходимо явно:
| Нет явного закрытия встроенных фикстур; Test Runner позаботится об этом. |
Запуск | При использовании библиотеки вы запускаете код как скрипт node, возможно, с предварительной компиляцией. | При использовании Test Runner вы используете команду npx playwright test . Вместе с вашим конфигом, Test Runner обрабатывает любую компиляцию и выбирает, что и как запускать. |
В дополнение к вышеуказанному, Playwright Test, как полнофункциональный тестовый раннер, включает:
- Матрица конфигурации и проекты: В приведенном выше примере, в версии библиотеки Playwright, если мы хотим запустить с другим устройством или браузером, нам придется изменить скрипт и передать информацию. С Playwright Test мы можем просто указать матрицу конфигураций в одном месте, и он выполнит один тест под каждой из этих конфигураций.
- Параллелизация
- Web-First утверждения
- Отчеты
- Повторы
- Легко включаемая трассировка
- и многое другое…
Использование
Используйте npm или Yarn для установки библиотеки Playwright в ваш проект Node.js. См. системные требования.
npm i -D playwright
Вам также потребуется установить браузеры - либо вручную, либо добавив пакет, который сделает это за вас автоматически.
# Загрузите браузеры Chromium, Firefox и WebKit
npx playwright install chromium firefox webkit
# Или добавьте пакеты, которые загрузят браузер при установке npm
npm i -D @playwright/browser-chromium @playwright/browser-firefox @playwright/browser-webkit
См. управление браузерами для получения дополнительных опций.
После установки вы можете импортировать Playwright в скрипт Node.js и запустить любой из 3 браузеров (chromium
, firefox
и webkit
).
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Создавайте страницы, взаимодействуйте с элементами интерфейса, проверяйте значения
await browser.close();
})();
API Playwright являются асинхронными и возвращают объекты Promise. Наши примеры кода используют паттерн async/await для упрощения чтения. Код обернут в неназванную асинхронную стрелочную функцию, которая вызывает саму себя.
(async () => { // Начало асинхронной стрелочной функции
// Код функции
// ...
})(); // Конец функции и () для вызова самой себя
Первый скрипт
В нашем первом скрипте мы перейдем на https://playwright.dev/
и сделаем скриншот в WebKit.
const { webkit } = require('playwright');
(async () => {
const browser = await webkit.launch();
const page = await browser.newPage();
await page.goto('https://playwright.dev/');
await page.screenshot({ path: `example.png` });
await browser.close();
})();
По умолчанию Playwright запускает браузеры в безголовом режиме. Чтобы увидеть интерфейс браузера, передайте флаг headless: false
при запуске браузера. Вы также можете использовать slowMo
, чтобы замедлить выполнение. Узнайте больше в разделе инструменты отладки.
firefox.launch({ headless: false, slowMo: 50 });
Запись скриптов
Инструменты командной строки могут использоваться для записи взаимодействий пользователя и генерации JavaScript-кода.
npx playwright codegen wikipedia.org
Загрузка браузеров
Чтобы загрузить браузеры Playwright, выполните:
# Явная загрузка браузеров
npx playwright install
В качестве альтернативы, вы можете добавить пакеты @playwright/browser-chromium
, @playwright/browser-firefox
и @playwright/browser-webkit
, чтобы автоматически загружать соответствующий браузер во время установки пакета.
# Используйте вспомогательный пакет, который загружает браузер при установке npm
npm install @playwright/browser-chromium
Загрузка за файрволом или через прокси
Передайте переменную окружения HTTPS_PROXY
, чтобы загрузить через прокси.
- Bash
- PowerShell
- Batch
# Вручную
HTTPS_PROXY=https://192.0.2.1 npx playwright install
# Через вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
HTTPS_PROXY=https://192.0.2.1 npm install
# Вручную
$Env:HTTPS_PROXY=https://192.0.2.1
npx playwright install
# Через вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
$Env:HTTPS_PROXY=https://192.0.2.1
npm install
# Вручную
set HTTPS_PROXY=https://192.0.2.1
npx playwright install
# Через вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
set HTTPS_PROXY=https://192.0.2.1
npm install
Загрузка из репозитория артефактов
По умолчанию Playwright загружает браузеры с CDN Microsoft. Передайте переменную окружения PLAYWRIGHT_DOWNLOAD_HOST
, чтобы загрузить из внутреннего репозитория артефактов.
- Bash
- PowerShell
- Batch
# Вручную
PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npx playwright install
# Через вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npm install
# Вручную
$Env:PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1
npx playwright install
# Через вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
$Env:PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1
npm install
# Вручную
set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1
npx playwright install
# Через вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1
npm install
Пропуск загрузки браузера
В некоторых случаях желательно полностью избежать загрузки браузеров, так как бинарные файлы браузера управляются отдельно. Это можно сделать, установив переменную PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD
перед установкой пакетов.
- Bash
- PowerShell
- Batch
# При использовании вспомогательных пакетов @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install
# При использовании вспомогательных пакетов @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
$Env:PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
npm install
# При использовании вспомогательных пакетов @playwright/browser-chromium, @playwright/browser-firefox
# и @playwright/browser-webkit
set PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
npm install
Поддержка TypeScript
Playwright включает встроенную поддержку TypeScript. Определения типов будут импортированы автоматически. Рекомендуется использовать проверку типов для улучшения работы в IDE.
В JavaScript
Добавьте следующее в начало вашего JavaScript-файла, чтобы получить проверку типов в VS Code или WebStorm.
// @ts-check
// ...
В качестве альтернативы, вы можете использовать JSDoc для установки типов для переменных.
/** @type {import('playwright').Page} */
let page;
В TypeScript
Поддержка TypeScript будет работать из коробки. Типы также могут быть импортированы явно.
let page: import('playwright').Page;