Примечания к выпуску
Версия 1.63
🔒 Блокировки тестов
Тесты, обращающиеся к общему ресурсу — внешней службе или глобальной настройке учётной записи, — теперь могут объявлять именованный lock. Тесты с одинаковым именем блокировки никогда не выполняются одновременно — ни в разных файлах, ни в разных рабочих процессах или проектах, тогда как всё остальное продолжает выполняться параллельно:
test('update user settings', { lock: 'user-settings' }, async ({ page }) => {
// never runs at the same time as other tests holding 'user-settings'
}); Тест может удерживать несколько блокировок, а test.describe() принимает параметр lock для всей группы. Подробнее о блокировках тестов.
🪟 Поиск в разных фреймах
Вызовы page.frameLocator() и frame.frameLocator() без селектора выполняют поиск во всех фреймах поддерева, поэтому теперь не нужно сначала находить iframe:
// Finds the button in any frame on the page.
await page.frameLocator().getByRole('button').click(); Остальная часть локатора разрешается внутри одного фрейма, как и у обычного локатора, а если совпадения найдены в нескольких фреймах, возникает ошибка.
👁️ Локаторы только для видимых элементов
Новый locator.visible() возвращает локатор, соответствующий только видимым элементам. Рекомендуется использовать его вместо CSS-псевдокласса :visible:
await page.locator('button').visible().click(); 🧾 Параметры шагов и подзаголовки
Теперь шаги содержат структурированные данные для репортёров. В шагах API Playwright указываются целевой локатор и аргументы вызова, а test.step() принимает параметр params для ваших собственных шагов:
await test.step('login', async () => {
// ...
}, { params: { user: 'admin' } }); Репортёры получают эти данные через testStep.params, а testStep.subtitle дополняет заголовок локатором или URL-адресом навигации — например, Click с подзаголовком getByRole('button'). И то и другое отображается в просмотрщике трассировки и HTML-отчёте.
🖼️ Снимки ARIA и экрана в трассировках
Параметр snapshots метода tracing.start() и параметр фикстуры testOptions.trace теперь принимают объект, определяющий, какие данные записывать при каждом действии:
export default defineConfig({
use: {
trace: {
mode: 'on',
snapshots: { dom: true, aria: true, screen: true }
},
},
}); Если записывать снимки ARIA и экрана, новый режим Отображение ARIA в просмотрщике трассировки показывает снимок экрана действия рядом со снимком ARIA, а при наведении на узел ARIA он выделяется на снимке экрана.
Новые API
Браузер и контекст
- Параметр httpCredentials теперь также принимает массив учётных данных. Используется первая запись, соответствующая источнику запроса; записи без указанного источника подходят для любого запроса.
- Новый параметр opfs включает частную файловую систему источника в состояние хранилища, чтобы его можно было сохранить и восстановить в последующих контекстах.
- Новые события page.on('dialogclosed') и browserContext.on('dialogclosed') возникают, когда пользователь принимает, отклоняет или закрывает диалог JavaScript.
Локаторы
- Новые методы locator.ariaSnapshotJSON() и page.ariaSnapshotJSON() возвращают снимок ARIA в виде значения JSON, а не разметки YAML, с параметрами
mode,depthиboxes. -
apiRequestContext.get() и другие методы запросов принимают аргумент типа, задающий тип ответа
json():
const response = await request.get<User>('/api/users/42');
const user = await response.json(); // typed as User Средство запуска тестов
- Новые отдельные параметры testOptions.reducedMotion, testOptions.forcedColors и testOptions.contrast.
- Новый параметр командной строки
--add-reporterдобавляет репортёр к репортёрам, настроенным вplaywright.config, вместо того чтобы заменять их, как это делает--reporter. - Новый параметр
omitTagsдля репортёровlist,line,dot,githubиjunitотключает добавление тегов к заголовкам тестов.
Командная строка
-
npx playwright install --no-removeсохраняет браузеры из других установок Playwright, а не удаляет их. -
npx playwright codegen --http-credentialsзаписывает трассировки для страниц, защищённых HTTP-аутентификацией.
Разное
- Новый встроенный репортёр
perfettoсоздаёт файл в формате Trace Event Format для интерфейса Perfetto илиchrome://tracing, отображая запуск тестов в виде временной шкалы с отдельной дорожкой для каждого рабочего процесса. - В HTML-отчёте рядом с шагами теста отображается диаграмма длительности.
Объявления
- ⚠️ Экспериментальные пакеты
@playwright/experimental-ct-react,@playwright/experimental-ct-react17и@playwright/experimental-ct-vueбольше не будут обновляться. Следуйте руководству по миграции, чтобы перейти на модель историй, представленную в версии 1.62. Теперь идентификаторы историй, передаваемые в fixtures.mount(), можно типизировать с помощью сгенерированного реестраStories. - ⚠️ Ubuntu 20.04 больше не поддерживается.
Версии браузеров
- Chromium 153.0.8010.12
- Mozilla Firefox 155.0
- WebKit 26.6
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 153
- Microsoft Edge 153
Версия 1.62
🧱 Новая модель тестирования компонентов
Тестирование компонентов переходит на модель историй и галерей. История оборачивает ваш компонент в определённый сценарий — с заданными свойствами, тестовыми данными и провайдерами, — а
страница галереи, которую вы запускаете, отображает истории по запросу. Новая фикстура fixtures.mount() переходит в галерею, монтирует историю по идентификатору и возвращает Locator, ограниченный корневым элементом истории:
test('click should expand', async ({ mount }) => {
const component = await mount('components/Expandable/Stateful');
await component.getByRole('button').click();
await expect(component.getByTestId('expanded')).toHaveValue('true');
}); Передайте тип истории в качестве аргумента шаблона, чтобы проверять типы её свойств, а для повторного отображения или удаления истории в тесте используйте update(props) / unmount() у возвращённого локатора.
🛑 Отмена операций с помощью AbortSignal
Большинство операций и проверок web-first теперь принимают параметр signal, которому передаётся AbortSignal. Это позволяет отменять длительные действия, навигацию, ожидания и проверки:
const controller = new AbortController();
setTimeout(() => controller.abort(), 1000);
await page.getByRole('button', { name: 'Submit' }).click({ signal: controller.signal });
await expect(page.getByText('Done')).toBeVisible({ signal: controller.signal }); Передача сигнала не отключает тайм-аут по умолчанию; передайте timeout: 0, чтобы отключить его.
🖼️ Снимки экрана в формате WebP
expect(page).toHaveScreenshot() и expect(locator).toHaveScreenshot() теперь могут сохранять снимки в формате WebP — просто задайте снимку имя .webp:
// Visual comparisons store the golden snapshot as lossless WebP.
await expect(page).toHaveScreenshot('homepage.webp');
// Standalone screenshots can trade quality for size with lossy WebP.
await page.screenshot({ path: 'homepage.webp', quality: 50 }); page.screenshot() и locator.screenshot() также принимают webp в качестве type: качество 100 (по умолчанию) обеспечивает сжатие без потерь, а более низкие значения используют сжатие с потерями.
🧩 Пользовательская фильтрация тестов с помощью Reporter.preprocess()
Новый хук reporter.preprocess() выполняется после разрешения конфигурации и перед reporter.onBegin(). Он позволяет репортёру помечать отдельные тесты как пропущенные, исключённые, исправленные или завершившиеся с ошибкой с помощью объекта TestRun:
class MyReporter {
async preprocess({ config, suite, testRun }) {
for (const test of suite.allTests()) {
if (shouldSkip(test))
testRun.skip(test);
}
}
} 🔁 Изолированные повторные запуски
Новый параметр testConfig.retryStrategy определяет, когда повторно запускать тесты с ошибками. Стратегия 'immediate' по умолчанию запускает повторные попытки, как только освобождается рабочий процесс; 'isolated' запускает все повторные попытки в конце — по одной в одном рабочем процессе, чтобы свести к минимуму влияние на остальные тесты:
export default defineConfig({
retries: 2,
retryStrategy: 'isolated',
}); Новые API
Браузер и контекст
- Новый параметр credentials включает виртуальные учётные данные WebAuthn контекста Credentials (ключи доступа) в состояние хранилища, чтобы их можно было сохранить и повторно добавить в последующие контексты.
Действия
- Новый параметр действия
scroll("auto"|"none") позволяет отключить автоматическую прокрутку Playwright к элементу.
Сеть
- Новый метод apiResponse.timing() возвращает сведения о времени загрузки ресурса для ответа API.
Вычисление
- Новый метод locator.waitForFunction() ожидает, пока функция, вызванная с соответствующим элементом, не вернёт истинное значение.
- page.evaluate() и связанные методы теперь принимают функции в качестве аргументов для вычисления.
- page.addInitScript() / browserContext.addInitScript() теперь принимают функции в качестве аргументов для скрипта инициализации.
Командная строка и MCP
- Теперь Playwright включает сервер Playwright MCP и
playwright-cli, которые можно запускать с помощьюnpx playwright mcpиnpx playwright cli.
Репортёры
- Группировку Объединить файлы в HTML-отчёте, ранее доступную только как переключатель интерфейса, теперь можно включить в конфигурации с помощью нового параметра репортёра
mergeFiles:
export default defineConfig({
reporter: [['html', { mergeFiles: true }]],
}); Объявления
- 📋 В режиме без интерфейса буфер обмена теперь изолирован от операционной системы, поэтому тесты, использующие
navigator.clipboard, больше не читают буфер обмена компьютера, на котором они выполняются, и не перезаписывают его. - ⚠️ Debian 11 больше не поддерживается.
Версии браузеров
- Chromium 151.0.7922.34
- Mozilla Firefox 153.0
- WebKit 26.5
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 151
- Microsoft Edge 151
Версия 1.61
🔑 Ключи доступа WebAuthn
Новый виртуальный аутентификатор Credentials, доступный через browserContext.credentials, позволяет тестам регистрировать ключи доступа и отвечать на церемонии navigator.credentials.create() / navigator.credentials.get() на странице — физический ключ не нужен, функция работает во всех браузерах:
const context = await browser.newContext();
// Seed a passkey your backend provisioned for a test user.
await context.credentials.create('example.com', {
id: credentialId,
userHandle,
privateKey,
publicKey,
});
await context.credentials.install();
const page = await context.newPage();
await page.goto('https://example.com/login');
// The page's navigator.credentials.get() is answered with the seeded passkey. Вы также можете один раз зарегистрировать ключ доступа в приложении в тесте настройки, получить его с помощью credentials.get() и использовать в последующих тестах — подробности см. в разделе Credentials.
🗃️ Веб-хранилище
Новый API WebStorage, доступный через page.localStorage и page.sessionStorage, читает и записывает данные хранилища страницы для текущего источника:
await page.localStorage.setItem('token', 'abc');
const token = await page.localStorage.getItem('token');
const items = await page.sessionStorage.items(); Новые API
Сеть
- apiResponse.securityDetails() и apiResponse.serverAddr() повторяют методы response.securityDetails() и response.serverAddr() на стороне браузера.
Браузер и запись экрана
- Новая опция
artifactsDirв browserType.connectOverCDP() определяет, где будут храниться такие артефакты, как трассировки и загрузки, при подключении к уже запущенному браузеру. - Новая опция
cursorв screencast.showActions() определяет оформление курсора для действий с указателем. - Теперь callback
onFrameв screencast.start() получаетtimestampвремени отображения кадра браузером.
Средство запуска тестов
- Параметр testOptions.video теперь поддерживает те же режимы, что и
trace: новые значения'on-all-retries','retain-on-first-failure'и'retain-on-failure-and-retries'. В таблице режимов видео указано, какие запуски записываются и сохраняются в каждом режиме. - Поддерживаются
expect.soft.poll(...). - Новая опция fullConfig.argv — снимок
process.argvиз процесса средства запуска тестов; удобно использовать для чтения пользовательских аргументов, переданных после разделителя--. - Новая опция fullConfig.failOnFlakyTests соответствует параметру конфигурации, позволяя репортерам объяснять, почему нестабильный запуск завершился с ошибкой.
-
testInfo.errors теперь перечисляет каждую вложенную ошибку
AggregateErrorотдельной записью. - Новая краткая запись
-Gв командной строке для--grep-invert.
🛠️ Другие улучшения
- Playwright теперь поддерживает Ubuntu 26.04.
- Записи HAR и трассировок теперь включают запросы WebSocket.
Версии браузеров
- Chromium 149.0.7827.55
- Mozilla Firefox 151.0
- WebKit 26.5
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 149
- Microsoft Edge 149
Версия 1.60
🌐 Запись HAR при трассировке
tracing.startHar() / tracing.stopHar() предоставляют запись HAR как полноценный API трассировки с теми же параметрами content, mode и urlFilter, что и recordHar. Возвращаемый объект Disposable упрощает ограничение записи с помощью await using:
await using har = await context.tracing.startHar('trace.har');
const page = await context.newPage();
await page.goto('https://playwright.dev');
// HAR is finalized when `har` goes out of scope. 🪝 API Drop
Новый метод locator.drop() имитирует внешнее перетаскивание файлов или данных, подобных данным буфера обмена, на элемент. Playwright отправляет dragenter, dragover и drop с синтетическим объектом [DataTransfer] в контексте страницы — функция работает во всех браузерах и отлично подходит для тестирования зон загрузки:
await page.locator('#dropzone').drop({
files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') },
});
await page.locator('#dropzone').drop({
data: {
'text/plain': 'hello world',
'text/uri-list': 'https://example.com',
},
}); 🎯 Снимки ARIA
-
expect(page).toMatchAriaSnapshot() теперь работает с объектом Page, а не только с объектом Locator — это эквивалентно проверке
page.locator('body'). - Новая опция
boxesв locator.ariaSnapshot() / page.ariaSnapshot() добавляет ограничивающую рамку каждого элемента в виде[box=x,y,width,height], что удобно для обработки ИИ.
🛑 test.abort()
Новый метод test.abort() прерывает выполняющийся тест из фикстуры, хука или обработчика маршрута, при необходимости принимая сообщение. Используйте его, если обнаружили неисправимое неправильное использование и хотите немедленно завершить тест с ошибкой:
test('does not publish to the shared page', async ({ page }) => {
await page.route('**/publish', route => {
test.abort('Tests must not publish to the shared page. Use the `clone` option.');
return route.abort();
});
// ...
}); Новые API
Браузер, контекст и страница
- Событие browser.on('context') — возникает при создании нового контекста в браузере.
- BrowserContext теперь повторяет события жизненного цикла своих страниц: browserContext.on('download'), browserContext.on('frameattached'), browserContext.on('framedetached'), browserContext.on('framenavigated'), browserContext.on('pageclose'), browserContext.on('pageload').
Локаторы и проверки
- Новая опция
descriptionв page.getByRole() / locator.getByRole() / frame.getByRole() / frameLocator.getByRole() для сопоставления с доступным описанием. - Новая опция
pseudoв expect(locator).toHaveCSS() получает вычисленные стили из::beforeили::after. - Новая опция
styleв locator.highlight() применяет дополнительный встроенный CSS к слою подсветки; также добавлен метод page.hideHighlight(), удаляющий все подсветки.
Сеть
- webSocketRoute.protocols() возвращает подпротоколы WebSocket, запрошенные страницей.
- Новая опция
noDefaultsв browserType.connectOverCDP() отключает переопределения Playwright по умолчанию в контексте по умолчанию (поведение загрузки, эмуляция фокуса и эмуляция медиа), чтобы подключение к браузеру, которым пользователь пользуется ежедневно, не меняло его состояние.
Ошибки и отчёты
- Новый метод webError.location() повторяет метод consoleMessage.location().
-
consoleMessage.location() теперь предоставляет свойства
line/column(lineNumber/columnNumberустарели). - Новое свойство testInfoError.errorContext предоставляет дополнительный диагностический контекст, например снимок ARIA получателя в момент сбоя сопоставления
expect(...). -
reporter.onError() теперь получает аргумент
workerInfoс информацией о рабочем процессе при ошибках очистки фикстуры.
Средство запуска тестов
- Новый токен
{testFileBaseName}в testProject.snapshotPathTemplate — имя файла без расширения. - Теперь средство запуска тестов выдаёт ошибку, если конфигурация пытается переопределить фикстуру, не являющуюся параметром настройки, и отклоняет
workers: 0или отрицательные значения.
🛠️ Другие улучшения
- HTML-репортёр:
-
npx playwright show-reportпринимает файлы.zipнапрямую — предварительно распаковывать их не нужно. - Для шагов с вложениями во вложенных дочерних элементах на родительском шаге отображается индикатор.
- Значение
repeatEachIndexотображается в заголовке теста, если оно не равно нулю.
-
- В Trace Viewer добавлен переключатель форматирования для JSON и тел запросов и ответов в формате формы на панели сведений о сети.
Несовместимые изменения ⚠️
- Удалены давно устаревшие API:
-
Locator.ariaRef()— используйте стандартный конвейер locator.ariaSnapshot(). -
Опция
handleуBrowserContext.exposeBindingиPage.exposeBinding. -
Опция
loggerуBrowserType.connectиBrowserType.connectOverCDP— вместо неё используйте трассировку. - Параметры контекста
videosPath/videoSize— вместо них используйтеrecordVideo.
-
Версии браузеров
- Chromium 148.0.7778.96
- Mozilla Firefox 150.0.2
- WebKit 26.4
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 147
- Microsoft Edge 147
Версия 1.59
🎬 Запись экрана
Новый API page.screencast предоставляет единый интерфейс для захвата содержимого страницы, включая:
- Запись экрана
- Аннотации действий
- Визуальные наложения
- Захват кадров в реальном времени
- Видеоподтверждения действий агента

Запись экрана — записывайте видео с точным управлением началом и остановкой в качестве альтернативы параметру recordVideo:
await page.screencast.start({ path: 'video.webm' });
// ... perform actions ...
await page.screencast.stop(); Аннотации действий — включают встроенные визуальные аннотации, которые выделяют элементы, с которыми взаимодействовали, и отображают названия действий во время записи:
await page.screencast.showActions({ position: 'top-right' }); screencast.showActions() принимает position ('top-left', 'top', 'top-right', 'bottom-left', 'bottom', 'bottom-right'), duration (мс на аннотацию) и fontSize (пиксели). Возвращает объект, вызов метода которого прекращает отображение действий.
Аннотации действий также можно включить в тестовых фикстурах с помощью параметра video:
// playwright.config.ts
export default defineConfig({
use: {
video: {
mode: 'on',
show: {
actions: { position: 'top-left' },
test: { position: 'top-right' },
},
},
},
}); Визуальные наложения — добавляйте названия глав и пользовательские HTML-наложения поверх страницы для более выразительного повествования:
await page.screencast.showChapter('Adding TODOs', {
description: 'Type and press enter for each TODO',
duration: 1000,
});
await page.screencast.showOverlay('<div style="color: red">Recording</div>'); Захват кадров в реальном времени — передавайте кадры в формате JPEG для пользовательской обработки, например создания миниатюр, предпросмотра в реальном времени, анализа ИИ и многого другого:
await page.screencast.start({
onFrame: ({ data }) => sendToVisionModel(data),
size: { width: 800, height: 600 },
}); Видеоподтверждения работы агентов — агенты для написания кода могут создавать видеодоказательства своей работы. Выполнив задачу, агент может записать видео с пошаговым обзором и подробными аннотациями для проверки человеком:
await page.screencast.start({ path: 'receipt.webm' });
await page.screencast.showActions({ position: 'top-right' });
await page.screencast.showChapter('Verifying checkout flow', {
description: 'Added coupon code support per ticket #1234',
});
// Agent performs the verification steps...
await page.locator('#coupon').fill('SAVE20');
await page.locator('#apply-coupon').click();
await expect(page.locator('.discount')).toContainText('20%');
await page.screencast.showChapter('Done', {
description: 'Coupon applied, discount reflected in total',
});
await page.screencast.stop(); Полученное видео служит подтверждением: названия глав дают контекст, аннотации действий выделяют каждое взаимодействие, а визуальный обзор быстрее просмотреть, чем текстовые журналы.
🔗 Совместимость
Новый API browser.bind() позволяет сделать запущенный браузер доступным для подключения из playwright-cli, @playwright/mcp и других клиентов.
Привязка браузера — запустите браузер и привяжите его, чтобы к нему могли подключаться другие:
const { endpoint } = await browser.bind('my-session', {
workspaceDir: '/my/project',
}); Подключение из playwright-cli — подключитесь к работающему браузеру из предпочитаемого вами агента для написания кода.
playwright-cli attach my-session playwright-cli -s my-session snapshot
Подключение из @playwright/mcp — или укажите работающий браузер в качестве цели для вашего MCP-сервера.
@playwright/mcp --endpoint=my-session
Подключение из клиента Playwright — используйте API для подключения к браузеру. Поддерживается одновременное подключение нескольких клиентов!
const browser = await chromium.connect(endpoint);
Передайте параметры host и port, чтобы использовать WebSocket вместо именованного канала:
const { endpoint } = await browser.bind('my-session', {
host: 'localhost',
port: 0,
});
// endpoint is a ws:// URL Вызовите browser.unbind(), чтобы прекратить прием новых подключений.
📊 Наблюдаемость
Запустите playwright-cli show, чтобы открыть панель управления, в которой перечислены все привязанные браузеры, отображается их состояние и доступно взаимодействие с ними:
- Следите за действиями агента в фоновых браузерах
- Открывайте сеансы для ручного вмешательства
- Открывайте DevTools, чтобы проверять страницы в фоновых браузерах.

-
playwright-cliавтоматически привязывает все свои браузеры, поэтому вы можете следить за действиями своих агентов. - Передайте переменную окружения
PLAYWRIGHT_DASHBOARD=1, чтобы видеть все браузеры@playwright/testна панели управления.
🐛 Отладчик CLI для агентов
Теперь агенты для написания кода могут запускать npx playwright test --debug=cli, чтобы подключаться к тестам и отлаживать их через playwright-cli — это идеально подходит для автоматического исправления тестов в рабочих процессах с агентами:
$ npx playwright test --debug=cli ### Debugging Instructions - Run "playwright-cli attach tw-87b59e" to attach to this test $ playwright-cli attach tw-87b59e ### Session `tw-87b59e` created, attached to `tw-87b59e`. Run commands with: playwright-cli --session=tw-87b59e <command> ### Paused - Navigate to "/" at output/tests/example.spec.ts:4 $ playwright-cli --session tw-87b59e step-over ### Page - Page URL: https://playwright.dev/ - Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright ### Paused - Expect "toHaveTitle" at output/tests/example.spec.ts:7
📋 Анализ трассировок в CLI для агентов
Агенты для написания кода могут запускать npx playwright trace, чтобы изучать трассировки Playwright и разбираться в падающих или нестабильных тестах из командной строки:
$ npx playwright trace open test-results/example-has-title-chromium/trace.zip
Title: example.spec.ts:3 › has title
$ npx playwright trace actions --grep="expect"
# Time Action Duration
──── ───────── ─────────────────────────────────────────────────────── ────────
9. 0:00.859 Expect "toHaveTitle" 5.1s ✗
$ npx playwright trace action 9
Expect "toHaveTitle"
Error: expect(page).toHaveTitle(expected) failed
Expected pattern: /Wrong Title/
Received string: "Fast and reliable end-to-end testing for modern web apps | Playwright"
Timeout: 5000ms
Snapshots
available: before, after
usage: npx playwright trace snapshot 9 --name <before|after>
$ npx playwright trace snapshot 9 --name after
### Page
- Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright
$ npx playwright trace close ♻️ await using
Многие API теперь возвращают асинхронные объекты, освобождаемые при завершении работы, что позволяет использовать синтаксис await using для автоматической очистки:
await using page = await context.newPage();
{
await using route = await page.route('**/*', route => route.continue());
await using script = await page.addInitScript('console.log("init script here")');
await page.goto('https://playwright.dev');
// do something
}
// route and init script have been removed at this point 🔍 Снимки и локаторы
- Метод page.ariaSnapshot() позволяет получить снимок aria страницы — аналог
page.locator('body').ariaSnapshot(). - Параметры
depthиmodeв locator.ariaSnapshot(). - Метод locator.normalize() преобразует локатор в соответствии с рекомендациями, например используя идентификаторы тестов и роли aria.
- Метод page.pickLocator() включает интерактивный режим, в котором элементы выделяются при наведении курсора и отображается соответствующий локатор. Щелкните элемент, чтобы получить его локатор. Вызовите page.cancelPickLocator(), чтобы отменить действие.
Новые API
Скринкаст
- page.screencast предоставляет возможности записи видео, потоковой передачи кадров в реальном времени и управления наложениями.
- Методы screencast.start() и screencast.stop() для записи и захвата кадров.
- Методы screencast.showActions() и screencast.hideActions() для аннотаций действий.
- Методы screencast.showChapter() и screencast.showOverlay() для визуальных наложений.
- Методы screencast.showOverlays() и screencast.hideOverlays() для управления видимостью наложений.
Хранилище, консоль и ошибки
- Метод browserContext.setStorageState() удаляет существующие файлы cookie, локальное хранилище и IndexedDB для всех источников, а затем задает новое состояние хранилища — создавать новый контекст не требуется.
- Методы page.clearConsoleMessages() и page.clearPageErrors() позволяют очистить сохраненные сообщения и ошибки.
- Параметр
filterв методах page.consoleMessages() и page.pageErrors() определяет, какие сообщения возвращаются. - Метод consoleMessage.timestamp().
Разное
- browserContext.debugger предоставляет программный интерфейс для управления отладчиком Playwright.
- Метод browserContext.isClosed().
- Метод request.existingResponse() возвращает ответ, не дожидаясь его получения.
- Метод response.httpVersion() возвращает версию HTTP, использованную в ответе.
- События cdpSession.on('event') и cdpSession.on('close') для сеансов CDP.
- Параметр
liveв tracing.start() для обновления трассировки в реальном времени. - Параметр
artifactsDirв browserType.launch() для настройки каталога артефактов.
🛠️ Другие улучшения
- В режиме UI появилась возможность показывать только тесты, на которые повлияли изменения исходного кода.
- Улучшена фильтрация действий в режиме UI и просмотрщике трассировок.
- В HTML-отчете отображается список запусков того же рабочего процесса.
- В HTML-отчете появилась фильтрация шагов теста для быстрого поиска.
- Новый режим трассировки
'retain-on-failure-and-retries'записывает трассировку для каждого запуска теста и сохраняет все трассировки при неудачной попытке — это удобно для сравнения успешной трассировки с неудачной при нестабильном тесте.
Несовместимые изменения ⚠️
- Прекращена поддержка WebKit в macOS 14. Рекомендуем обновить версию macOS или продолжать использовать более старую версию Playwright.
- Удален пакет
@playwright/experimental-ct-svelte. -
junitтеперь различает типы ошибок, поэтому некоторые из прежних<failure>теперь отображаются как<error>.
Версии браузеров
- Chromium 147.0.7727.15
- Mozilla Firefox 148.0.2
- WebKit 26.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 146
- Microsoft Edge 146
Версия 1.58
Временная шкала
Если вы используете объединенные отчеты, на вкладке Speedboard HTML-отчета теперь отображается временная шкала:

Улучшения режима UI и просмотрщика трассировок
- Новая тема «системная» следует настройкам темного или светлого режима вашей ОС
- В редакторах кода теперь доступен поиск (Cmd/Ctrl+F)
- Панель сведений о сети реорганизована для удобства использования
- Ответы JSON теперь автоматически форматируются для удобства чтения
Благодарим @cpAdm за эти улучшения!
Разное
browserType.connectOverCDP() теперь принимает параметр isLocal. Если ему задано значение true, Playwright считает, что запущен на том же хосте, что и сервер CDP, и включает оптимизацию файловой системы.
Несовместимые изменения ⚠️
- Удалены селекторы
_reactи_vue. Варианты замены см. в руководстве по локаторам. - Удален суффикс механизма селекторов
:light. Вместо него используйте стандартные селекторы CSS. - Параметр
devtoolsудален из browserType.launch(). Вместо него используйтеargs: ['--auto-open-devtools-for-tabs']. - Прекращена поддержка WebKit в macOS 13. Рекомендуем обновить версию macOS или продолжать использовать более старую версию Playwright.
Версии браузеров
- Chromium 145.0.7632.6
- Mozilla Firefox 146.0.1
- WebKit 26.0
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 144
- Microsoft Edge 144
Версия 1.57
Speedboard
В HTML-отчете появилась новая вкладка Speedboard:

Здесь отображаются все выполненные тесты, отсортированные по времени выполнения. Это поможет понять, какие тесты выполняются дольше ожидаемого. Загляните туда — возможно, вы обнаружите тесты, которые тратят на ожидание больше времени, чем нужно!
Chrome for Testing
Теперь Playwright работает со сборками Chrome for Testing, а не Chromium. В оконном режиме используется chrome, а в безголовом режиме — chrome-headless-shell. После обновления до версии 1.57 существующие тесты должны продолжить работать.
Мы не ожидаем функциональных изменений в результате этого перехода. Самое заметное изменение — новый значок и название на панели инструментов.

Если вы все же заметите неожиданное изменение поведения, создайте задачу.
В Linux на Arm64 Playwright по-прежнему использует Chromium.
Ожидание вывода веб-сервера
testConfig.webServer добавляет поле wait. Передайте регулярное выражение, и Playwright будет ждать, пока записи в журнале веб-сервера не будут ему соответствовать.
import { defineConfig } from '@playwright/test';
export default defineConfig({
webServer: {
command: 'npm run start',
wait: {
stdout: /Listening on port (?<my_server_port>\d+)/
},
},
}); Если включить в выражение именованную группу захвата, Playwright предоставит содержимое этой группы через переменные среды:
import { test, expect } from '@playwright/test';
test.use({ baseURL: `http://localhost:${process.env.MY_SERVER_PORT ?? 3000}` });
test('homepage', async ({ page }) => {
await page.goto('/');
}); Это полезно не только для получения динамически меняющихся портов серверов разработки. Также это можно использовать, чтобы дождаться готовности службы, которая не предоставляет HTTP-проверку готовности, а вместо этого выводит сообщение о готовности в stdout или stderr.
Несовместимое изменение
После 3 лет с момента объявления устаревшим мы удалили page.accessibility из нашего API. Если вам нужно тестировать доступность страницы, используйте другие библиотеки, например Axe. См. наше руководство по интеграции с Axe для Node.js.
Новые API
- Новое свойство testConfig.tag добавляет тег ко всем тестам в этом запуске. Это полезно при использовании merge-reports.
- Событие worker.on('console') возникает, когда JavaScript внутри рабочего процесса вызывает один из методов API console, например console.log или console.dir. Для ожидания этого события можно использовать worker.waitForEvent().
- locator.description() возвращает описание локатора, ранее заданное с помощью locator.describe(), а locator.toString() теперь использует это описание, если оно доступно.
- Новая опция steps в locator.click() и locator.dragTo() задаёт количество событий
mousemove, генерируемых при перемещении указателя мыши к целевому элементу. - Сетевые запросы, отправляемые сервис-воркерами, теперь регистрируются и могут маршрутизироваться через BrowserContext — только в Chromium. Это можно отключить с помощью переменной среды
PLAYWRIGHT_DISABLE_SERVICE_WORKER_NETWORK. - Сообщения консоли от сервис-воркеров передаются через worker.on('console'). Это можно отключить с помощью переменной среды
PLAYWRIGHT_DISABLE_SERVICE_WORKER_CONSOLE.
Прочее
- В Docker-образах Playwright версия Node.js v22 заменена на Node.js v24 LTS.
Версии браузеров
- Chromium 143.0.7499.4
- Mozilla Firefox 144.0.2
- WebKit 26.0
Версия 1.56
Агенты Playwright Test
Представляем агентов Playwright Test — три пользовательских определения агентов, предназначенных для сопровождения LLM на основных этапах создания теста Playwright:
- 🎭 planner исследует приложение и составляет план тестирования в Markdown
- 🎭 generator преобразует план в Markdown-файлы Playwright Test
- 🎭 healer запускает набор тестов и автоматически исправляет упавшие тесты
Запустите npx playwright init-agents с выбранным клиентом, чтобы создать актуальные определения агентов:
# Generate agent files for each agentic loop # Visual Studio Code npx playwright init-agents --loop=vscode # Claude Code npx playwright init-agents --loop=claude # opencode npx playwright init-agents --loop=opencode
Подробнее об агентах Playwright Test
Новые API
- Новые методы page.consoleMessages() и page.pageErrors() для получения последних сообщений консоли страницы
- Новый метод page.requests() для получения последних сетевых запросов страницы
- Добавлены
--test-listи--test-list-invert, позволяющие вручную указать определённые тесты из файла
Режим UI и HTML-отчёт
- Добавлена опция для репортера
'html', отключающая кнопку "Copy prompt" - Добавлена опция для репортера
'html'и режима UI, объединяющая файлы и сводящая блоки test и describe в единый список - Добавлена опция режима UI, соответствующая опциям
--update-snapshots - Добавлена опция режима UI для запуска только одного рабочего процесса одновременно
Несовместимые изменения
- Событие browserContext.on('backgroundpage') объявлено устаревшим и больше не будет генерироваться. Метод browserContext.backgroundPages() будет возвращать пустой список
Прочее
- Снимки Aria отображают и сравнивают
inputplaceholder - В процессы-воркеры Playwright добавлена переменная среды
PLAYWRIGHT_TEST, позволяющая определять статус тестирования
Версии браузеров
- Chromium 141.0.7390.37
- Mozilla Firefox 142.0.1
- WebKit 26.0
Версия 1.55
Новые API
- Новое свойство testStepInfo.titlePath возвращает полный путь заголовка, начиная с файла теста и включая заголовки теста и шага.
Генерация кода
- Автоматические проверки
toBeVisible(): теперь Codegen может создавать автоматические проверкиtoBeVisible()для распространённых взаимодействий с пользовательским интерфейсом. Эту функцию можно включить в настройках Codegen.
Несовместимые изменения
- ⚠️ Прекращена поддержка манифеста расширений Chromium версии 2.
Прочее
- Добавлена поддержка Debian 13 "Trixie".
Версии браузеров
- Chromium 140.0.7339.16
- Mozilla Firefox 141.0
- WebKit 26.0
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 139
- Microsoft Edge 139
Версия 1.54
Основные нововведения
-
Новое свойство cookie
partitionKeyв методах browserContext.cookies() и browserContext.addCookies(). Это свойство позволяет сохранять и восстанавливать разделённые cookie. Подробнее см. статью CHIPS на MDN. Обратите внимание: поддержка разделения cookie и значения по умолчанию различаются в разных браузерах. -
Новая опция
noSnippetsотключает фрагменты кода в HTML-отчёте.import { defineConfig } from '@playwright/test'; export default defineConfig({ reporter: [['html', { noSnippets: true }]] }); -
Новое свойство
locationв аннотациях тестов, например в testResult.annotations и testInfo.annotations. Оно указывает, где была добавлена аннотация, напримерtest.skipилиtest.fixme.
Командная строка
-
Новая опция
--user-data-dirв нескольких командах. Можно указать один и тот же каталог пользовательских данных, чтобы повторно использовать состояние браузера, например данные аутентификации, между сеансами.npx playwright codegen --user-data-dir=./user-data
-
Опция
-gvудалена из командыnpx playwright test. Вместо неё используйте--grep-invert. -
npx playwright openбольше не открывает средство записи тестов. Вместо неё используйтеnpx playwright codegen.
Прочее
- Поддержка Node.js 16 прекращена.
- Поддержка Node.js 18 объявлена устаревшей и будет прекращена в будущем.
Версии браузеров
- Chromium 139.0.7258.5
- Mozilla Firefox 140.0.2
- WebKit 26.0
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 140
- Microsoft Edge 140
Версия 1.53
Обновления Trace Viewer и HTML-репортера
-
Новые шаги в Trace Viewer и HTML-репортере:
-
Новая опция репортера
'html'для задания заголовка конкретного запуска тестов:import { defineConfig } from '@playwright/test'; export default defineConfig({ reporter: [['html', { title: 'Custom test run #1028' }]] });
Прочее
-
Новая опция kind метода testInfo.snapshotPath() определяет, какой шаблон пути к снимку используется.
-
Новый метод locator.describe() позволяет описать локатор. Описание используется в Trace Viewer и отчётах.
const button = page.getByTestId('btn-sub').describe('Subscribe button'); await button.click(); -
npx playwright install --listтеперь выводит список всех установленных браузеров, их версий и расположений.
Версии браузеров
- Chromium 138.0.7204.4
- Mozilla Firefox 139.0
- WebKit 18.5
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 137
- Microsoft Edge 137
Версия 1.52
Основные нововведения
-
Новый метод expect(locator).toContainClass() позволяет удобно проверять наличие отдельных имён классов у элемента.
await expect(page.getByRole('listitem', { name: 'Ship v1.52' })).toContainClass('done'); -
В снимках Aria появились два новых свойства:
/childrenдля строгого сопоставления и/urlдля ссылок.await expect(locator).toMatchAriaSnapshot(` - list - /children: equal - listitem: Feature A - listitem: - link "Feature B": - /url: "https://playwright.dev" `);
Средство запуска тестов
- Новое свойство testProject.workers позволяет задать количество параллельных рабочих процессов для проекта тестирования. При этом по-прежнему действует общий лимит, заданный свойством testConfig.workers.
- Новая опция testConfig.failOnFlakyTests позволяет завершить запуск тестов с ошибкой, если обнаружены нестабильные тесты, аналогично
--fail-on-flaky-tests. Это полезно в средах CI/CD, где перед развертыванием нужно убедиться в стабильной работе всех тестов. - Новое свойство testResult.annotations содержит аннотации для каждой повторной попытки теста.
Прочее
- Новая опция maxRedirects в apiRequest.newContext() позволяет управлять максимальным количеством перенаправлений.
- HTML-отчёт теперь поддерживает фильтрацию NOT с помощью
!@my-tagили!my-file.spec.tsили!p:my-project.
Несовместимые изменения
- Шаблоны URL с glob-синтаксисом в таких методах, как page.route(), больше не поддерживают
?и[]. Рекомендуем вместо них использовать регулярные выражения. - Метод route.continue() больше не позволяет переопределять заголовок
Cookie. Если указан заголовокCookie, он будет проигнорирован, а cookie будет загружена из хранилища cookie браузера. Чтобы задать собственные cookie, используйте browserContext.addCookies(). - Поддержка macOS 13 теперь считается устаревшей, и обновления WebKit для неё больше выпускаться не будут. Перейдите на более новую версию macOS, чтобы продолжить пользоваться последними улучшениями WebKit.
Версии браузеров
- Chromium 136.0.7103.25
- Mozilla Firefox 137.0
- WebKit 18.4
Эта версия также была протестирована со следующими стабильными версиями:
- Google Chrome 135
- Microsoft Edge 135
Версия 1.51
StorageState для indexedDB
-
Новая опция indexedDB для browserContext.storageState() позволяет сохранять и восстанавливать содержимое IndexedDB. Это полезно, если ваше приложение использует API IndexedDB для хранения токенов аутентификации, например Firebase Authentication.
Ниже приведён пример, основанный на руководстве по аутентификации:
import { test as setup, expect } from '@playwright/test'; import path from 'path'; const authFile = path.join(__dirname, '../playwright/.auth/user.json'); setup('authenticate', async ({ page }) => { await page.goto('/'); // ... perform authentication steps ... // make sure to save indexedDB await page.context().storageState({ path: authFile, indexedDB: true }); });
Копировать как промпт
В HTML-отчёте, просмотрщике трассировок и режиме UI появилась новая кнопка «Копировать промпт» для ошибок. Нажмите её, чтобы скопировать готовый промпт для LLM с сообщением об ошибке и полезным контекстом для её исправления.
Фильтрация видимых элементов
Новая опция visible для locator.filter() позволяет находить только видимые элементы.
test('some test', async ({ page }) => {
// Ignore invisible todo items.
const todoItems = page.getByTestId('todo-item').filter({ visible: true });
// Check there are exactly 3 visible ones.
await expect(todoItems).toHaveCount(3);
}); Информация Git в HTML-отчёте
Установите опцию testConfig.captureGitInfo, чтобы сохранять информацию Git в testConfig.metadata.
import { defineConfig } from '@playwright/test';
export default defineConfig({
captureGitInfo: { commit: true, diff: true }
}); Эта информация будет отображаться в HTML-отчёте, если она доступна:
Улучшения шагов теста
В шагах теста теперь доступен новый объект TestStepInfo. Вы можете добавлять вложения к шагу или пропускать его при определённых условиях.
test('some test', async ({ page, isMobile }) => {
// Note the new "step" argument:
await test.step('here is my step', async step => {
step.skip(isMobile, 'not relevant on mobile layouts');
// ...
await step.attach('my attachment', { body: 'some text' });
// ...
});
}); Прочее
- Новая опция
contrastдля методов page.emulateMedia() и browser.newContext() позволяет эмулировать медиафункциюprefers-contrast. - Новая опция failOnStatusCode заставляет все запросы fetch, выполняемые через APIRequestContext, выбрасывать исключение при кодах ответа, отличных от 2xx и 3xx.
- Проверка expect(page).toHaveURL() теперь поддерживает предикат.
Версии браузеров
- Chromium 134.0.6998.35
- Mozilla Firefox 135.0
- WebKit 18.4
Эта версия также была протестирована со следующими стабильными версиями:
- Google Chrome 133
- Microsoft Edge 133
Версия 1.50
Средство запуска тестов
-
Новая опция timeout позволяет указать максимальное время выполнения отдельного шага теста. При превышении времени ожидания выполнение теста завершится ошибкой.
test('some test', async ({ page }) => { await test.step('a step', async () => { // This step can time out separately from the test }, { timeout: 1000 }); }); -
Новый метод test.step.skip() отключает выполнение шага теста.
test('some test', async ({ page }) => { await test.step('before running step', async () => { // Normal step }); await test.step.skip('not yet ready', async () => { // This step is skipped }); await test.step('after running step', async () => { // This step still runs even though the previous one was skipped }); }); -
Расширена поддержка expect(locator).toMatchAriaSnapshot(): теперь снимки aria можно хранить в отдельных YAML-файлах.
-
Добавлен метод expect(locator).toHaveAccessibleErrorMessage(), который проверяет, что Locator указывает на элемент с заданным значением aria errormessage.
-
В опцию testConfig.updateSnapshots добавлено значение перечисления конфигурации
changed.changedобновляет только изменившиеся снимки, аallтеперь обновляет все снимки независимо от наличия различий. -
Новая опция testConfig.updateSourceMethod задаёт способ обновления исходного кода, когда настроена опция testConfig.updateSnapshots. Добавлены режимы
overwriteи3-way, которые записывают изменения в исходный код, в дополнение к существующему режимуpatch, который создаёт файл исправления.npx playwright test --update-snapshots=changed --update-source-method=3way
-
В опцию testConfig.webServer добавлено поле
gracefulShutdownдля указания сигнала завершения процесса, отличного от используемого по умолчаниюSIGKILL. -
Свойство testStep.attachments стало доступно в API репортера, что позволяет получать все вложения, созданные этим шагом.
-
Новая опция
pathTemplateдля проверокtoHaveScreenshotиtoMatchAriaSnapshotв конфигурации testConfig.expect.
Обновления интерфейса
- В стандартный HTML-репорт внесены изменения, улучшающие отображение вложений.
- В Codegen добавлена новая кнопка для выбора элементов и создания снимков aria.
- В трассировках рядом с вызовами API действий теперь отображаются дополнительные сведения, например нажатые клавиши.
- Отображение содержимого
canvasв трассировках может работать с ошибками. Теперь оно отключено по умолчанию и может быть включено в настройке интерфейсаDisplay canvas content. -
На панелях
CallиNetworkтеперь отображается дополнительная информация о времени.
Несовместимые изменения
-
expect(locator).toBeEditable() и locator.isEditable() теперь выбрасывают исключение, если целевой элемент не является
<input>,<select>или одним из ряда других редактируемых элементов. - Опция testConfig.updateSnapshots теперь обновляет все снимки, если задана как
all, а не только снимки с ошибками или изменениями. Используйте новое значение перечисленияchanged, чтобы сохранить прежнее поведение и обновлять только изменившиеся снимки.
Версии браузеров
- Chromium 133.0.6943.16
- Mozilla Firefox 134.0
- WebKit 18.2
Эта версия также была протестирована со следующими стабильными версиями:
- Google Chrome 132
- Microsoft Edge 132
Версия 1.49
Снимки Aria
Новая проверка expect(locator).toMatchAriaSnapshot() проверяет структуру страницы, сравнивая её с ожидаемым деревом доступности, представленным в формате YAML.
await page.goto('https://playwright.dev');
await expect(page.locator('body')).toMatchAriaSnapshot(`
- banner:
- heading /Playwright enables reliable/ [level=1]
- link "Get started"
- link "Star microsoft/playwright on GitHub"
- main:
- img "Browsers (Chromium, Firefox, WebKit)"
- heading "Any browser • Any platform • One API"
`); Эту проверку можно сгенерировать с помощью генератора тестов, а ожидаемый снимок обновить с помощью флага командной строки --update-snapshots.
Подробнее см. в руководстве по снимкам aria.
Средство запуска тестов
- Новая опция testConfig.tsconfig позволяет указать один файл
tsconfigдля всех тестов. - Новый метод test.fail.only() позволяет сосредоточиться на тесте, завершающемся с ошибкой.
- Опции testConfig.globalSetup и testConfig.globalTeardown теперь поддерживают несколько процедур настройки и завершения.
- Новое значение
'on-first-failure'для testOptions.screenshot. - В HTML-отчёт добавлены кнопки «Предыдущий» и «Следующий», позволяющие быстро переключаться между тестами.
- Новые свойства testInfoError.cause и testError.cause, соответствующие свойству
Error.cause.
Несовместимое изменение: каналы chrome и msedge переходят на новый безголовый режим
Это изменение затронет вас, если вы используете один из следующих каналов в playwright.config.ts:
-
chrome,chrome-dev,chrome-betaилиchrome-canary -
msedge,msedge-dev,msedge-betaилиmsedge-canary
Что мне нужно сделать?
После обновления до Playwright v1.49 запустите набор тестов. Если все тесты пройдут, всё готово. Если нет, вероятно, потребуется обновить снимки и изменить часть тестового кода, связанного с просмотрщиками PDF и расширениями. Подробнее см. в задаче #33566.
Другие несовместимые изменения
- Обновления WebKit для Ubuntu 20.04 и Debian 11 выпускаться больше не будут. Рекомендуем обновить ОС до более поздней версии.
- Обновления пакета
@playwright/experimental-ct-vue2выпускаться больше не будут. - Обновления пакета
@playwright/experimental-ct-solidвыпускаться больше не будут.
Попробуйте новый безголовый режим Chromium
Вы можете включить новый безголовый режим, используя канал 'chromium'. Как сказано в официальной документации Chrome:
Новый Headless — это настоящий браузер Chrome, поэтому он обеспечивает более аутентичную и надёжную работу и предлагает больше возможностей. Благодаря этому он лучше подходит для высокоточного сквозного тестирования веб-приложений и тестирования расширений браузера.
Список возможных проблем и дополнительные сведения о безголовом режиме Chromium см. в задаче #33566. Если после включения этого режима возникнут проблемы, сообщите о них, создав задачу.
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'], channel: 'chromium' },
},
],
}); Прочее
-
<canvas>elements inside a snapshot now draw a preview. - Новый метод tracing.group() позволяет визуально группировать действия в трассировке.
- Образы Playwright для Docker перешли с Node.js v20 на Node.js v22 LTS.
Версии браузеров
- Chromium 131.0.6778.33
- Mozilla Firefox 132.0
- WebKit 18.2
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 130
- Microsoft Edge 130
Версия 1.48
Маршрутизация WebSocket
Новые методы page.routeWebSocket() и browserContext.routeWebSocket() позволяют перехватывать, изменять и имитировать WebSocket-соединения, инициированные на странице. Ниже приведён простой пример имитации обмена данными по WebSocket: на "request" отправляется ответ с "response".
await page.routeWebSocket('/ws', ws => {
ws.onMessage(message => {
if (message === 'request')
ws.send('response');
});
}); Подробнее см. в описании WebSocketRoute.
Обновления интерфейса
- В HTML-отчёте появились новые кнопки копирования аннотаций и расположения теста.
- Вызовы методов маршрутизации, например route.fulfill(), больше не отображаются в отчёте и средстве просмотра трассировки. Просмотреть маршрутизированные сетевые запросы можно на вкладке сети.
- На вкладке сети появились новые кнопки «Копировать как cURL» и «Копировать как fetch».
Прочее
- Параметр form и аналогичные параметры теперь принимают FormData.
- Новый метод page.requestGC() может помочь обнаружить утечки памяти.
- Новый параметр location позволяет указать пользовательское расположение шага.
- Запросы, выполняемые с помощью APIRequestContext, теперь сохраняют в HAR подробные сведения о времени выполнения и безопасности.
Версии браузеров
- Chromium 130.0.6723.19
- Mozilla Firefox 130.0
- WebKit 18.0
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 129
- Microsoft Edge 129
Версия 1.47
Улучшения вкладки сети
Вкладка сети в режиме UI и средстве просмотра трассировки получила несколько полезных улучшений:
- фильтрация по типу ресурса и URL;
- улучшенное отображение параметров строки запроса;
- предварительный просмотр шрифтов.
Параметр командной строки --tsconfig
По умолчанию Playwright эвристически ищет ближайший tsconfig для каждого импортируемого файла. Теперь можно указать в командной строке один файл tsconfig, который Playwright будет использовать для всех импортируемых файлов, а не только для тестовых:
# Pass a specific tsconfig npx playwright test --tsconfig tsconfig.test.json
APIRequestContext теперь принимает URLSearchParams и string в качестве параметров запроса
Теперь в APIRequestContext можно передавать URLSearchParams и string в качестве параметров запроса:
test('query params', async ({ request }) => {
const searchParams = new URLSearchParams();
searchParams.set('userId', 1);
const response = await request.get(
'https://jsonplaceholder.typicode.com/posts',
{
params: searchParams // or as a string: 'userId=1'
}
);
// ...
}); Прочее
- Теперь
mcr.microsoft.com/playwright:v1.47.0предоставляет образ Playwright на базе Ubuntu 24.04 Noble. Чтобы использовать образ на базе 22.04 jammy, вместо него укажитеmcr.microsoft.com/playwright:v1.47.0-jammy. - Добавлены параметры behavior, behavior и behavior, позволяющие дождаться завершения выполняющихся обработчиков.
- Теперь клиентские сертификаты TLS можно передавать из памяти, указывая clientCertificates.cert и clientCertificates.key в виде буферов, а не путей к файлам.
- Вложения с типом содержимого
text/htmlтеперь можно открывать в новой вкладке HTML-отчёта. Это полезно, если вы хотите включить сторонние отчёты или другое HTML-содержимое в отчёт о тестах Playwright и поделиться им с командой. - Параметр noWaitAfter в locator.selectOption() объявлен устаревшим.
- Поступали сообщения о некорректной работе WebGL в WebKit на GitHub Actions
macos-13. Рекомендуем обновить GitHub Actions доmacos-14.
Версии браузеров
- Chromium 129.0.6668.29
- Mozilla Firefox 130.0
- WebKit 18.0
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 128
- Microsoft Edge 128
Версия 1.46
Клиентские сертификаты TLS
Теперь Playwright позволяет предоставлять клиентские сертификаты, чтобы сервер мог проверять их в соответствии с правилами аутентификации TLS.
Следующий фрагмент кода настраивает клиентский сертификат для https://example.com:
import { defineConfig } from '@playwright/test';
export default defineConfig({
// ...
use: {
clientCertificates: [{
origin: 'https://example.com',
certPath: './cert.pem',
keyPath: './key.pem',
passphrase: 'mysecretpassword',
}],
},
// ...
}); Также можно предоставить клиентские сертификаты для определённого тестового проекта или передать их в качестве параметра в browser.newContext() и apiRequest.newContext().
Параметр CLI --only-changed
Новый параметр CLI --only-changed запускает только те тестовые файлы, которые изменились после последнего коммита Git или начиная с указанной ссылки Git (ref). Также будут запущены все тестовые файлы, импортирующие изменённые файлы.
# Only run test files with uncommitted changes npx playwright test --only-changed # Only run test files changed relative to the "main" branch npx playwright test --only-changed=main
Тестирование компонентов: новая фикстура router
В этом выпуске появилась экспериментальная фикстура router для перехвата и обработки сетевых запросов при тестировании компонентов. Фикстуру маршрутизатора можно использовать двумя способами:
- Вызвать
router.route(url, handler), работающий аналогично page.route(). - Вызвать
router.use(handlers)и передать ему обработчики запросов из библиотеки MSW.
Вот пример повторного использования существующих обработчиков MSW в тесте.
import { handlers } from '@src/mocks/handlers';
test.beforeEach(async ({ router }) => {
// install common handlers before each test
await router.use(...handlers);
});
test('example test', async ({ mount }) => {
// test as usual, your handlers are active
// ...
}); Эта фикстура доступна только в тестах компонентов.
Обновления режима UI / средства просмотра трассировки
- Аннотации тестов теперь отображаются в режиме UI.
- Текстовые вложения теперь отображаются непосредственно на панели вложений.
- Добавлен новый параметр для отображения и скрытия действий маршрутизации, таких как route.continue().
- Метод и статус запроса отображаются на вкладке сведений о сети.
- Добавлена кнопка копирования расположения исходного файла в буфер обмена.
- На панели метаданных теперь отображается
baseURL.
Прочее
- В apiRequestContext.fetch() добавлен параметр
maxRetries, который повторяет запрос при сетевой ошибкеECONNRESET. - Добавлен параметр, позволяющий изолировать фикстуру, чтобы свести к минимуму её отображение в отчётах о тестах и сообщениях об ошибках.
- Добавлен параметр для указания пользовательского названия фикстуры, которое будет использоваться в отчётах о тестах и сообщениях об ошибках.
Версии браузеров
- Chromium 128.0.6613.18
- Mozilla Firefox 128.0
- WebKit 18.0
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 127
- Microsoft Edge 127
Версия 1.45
Часы
Новый API Clock позволяет управлять временем в тестах и проверять поведение, связанное со временем. API охватывает множество распространённых сценариев, включая:
- тестирование с заранее заданным временем;
- поддержание согласованности времени и таймеров;
- контроль бездействия;
- ручное продвижение времени.
// Initialize clock and let the page load naturally.
await page.clock.install({ time: new Date('2024-02-02T08:00:00') });
await page.goto('http://localhost:3333');
// Pretend that the user closed the laptop lid and opened it again at 10am,
// Pause the time once reached that point.
await page.clock.pauseAt(new Date('2024-02-02T10:00:00'));
// Assert the page state.
await expect(page.getByTestId('current-time')).toHaveText('2/2/2024, 10:00:00 AM');
// Close the laptop lid again and open it at 10:30am.
await page.clock.fastForward('30:00');
await expect(page.getByTestId('current-time')).toHaveText('2/2/2024, 10:30:00 AM'); Подробнее см. в руководстве по часам.
Средство запуска тестов
-
Добавлен параметр CLI
--fail-on-flaky-tests, который задаёт код завершения1при обнаружении нестабильных тестов. По умолчанию средство запуска тестов завершает работу с кодом0, если все неудачные тесты прошли повторную проверку. С этим параметром запуск тестов завершится ошибкой в таком случае. -
Новая переменная окружения
PLAYWRIGHT_FORCE_TTYопределяет, должны ли встроенные средства формирования отчётовlist,lineиdotсчитать, что запущен интерактивный терминал. Например, это может быть полезно, чтобы отключить поведение TTY, если среда CI некорректно обрабатывает управляющие последовательности ANSI. Также можно включить поведение TTY, даже если интерактивный терминал доступен, если вы планируете дополнительно обрабатывать вывод и управляющие последовательности.# Avoid TTY features that output ANSI control sequences PLAYWRIGHT_FORCE_TTY=0 npx playwright test # Enable TTY features, assuming a terminal width 80 PLAYWRIGHT_FORCE_TTY=80 npx playwright test
-
Новые параметры testConfig.respectGitIgnore и testProject.respectGitIgnore определяют, исключать ли файлы, соответствующие шаблонам
.gitignore, при поиске тестов. -
Для пользовательских сопоставителей expect теперь доступно новое свойство
timeout. Это свойство учитываетplaywright.config.tsиexpect.configure().import { expect as baseExpect } from '@playwright/test'; export const expect = baseExpect.extend({ async toHaveAmount(locator: Locator, expected: number, options?: { timeout?: number }) { // When no timeout option is specified, use the config timeout. const timeout = options?.timeout ?? this.timeout; // ... implement the assertion ... }, });
Прочее
-
Метод locator.setInputFiles() теперь поддерживает загрузку каталога для элементов
<input type=file webkitdirectory>.await page.getByLabel('Upload directory').setInputFiles(path.join(__dirname, 'mydir')); -
Теперь несколько методов, например locator.click() и locator.press(), поддерживают клавишу-модификатор
ControlOrMeta. На macOS эта клавиша соответствуетMeta, а на Windows и Linux —Control.// Press the common keyboard shortcut Control+S or Meta+S to trigger a "Save" operation. await page.keyboard.press('ControlOrMeta+S'); -
Новое свойство
httpCredentials.sendв apiRequest.newContext() позволяет всегда отправлять заголовокAuthorizationили отправлять его только в ответ на401 Unauthorized. -
Новая опция
reasonв apiRequestContext.dispose() будет включена в сообщение об ошибке для выполняющихся операций, прерванных при освобождении контекста. -
Новая опция
hostв browserType.launchServer() позволяет принимать websocket-соединения по указанному адресу вместо неопределённого0.0.0.0. -
Теперь Playwright поддерживает Chromium, Firefox и WebKit в Ubuntu 24.04.
-
Версия v1.45 — последняя, для которой будут выпускаться обновления WebKit для macOS 12 Monterey. Обновите macOS, чтобы продолжить использовать последнюю версию WebKit.
Версии браузеров
- Chromium 127.0.6533.5
- Mozilla Firefox 127.0
- WebKit 17.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 126
- Microsoft Edge 126
Версия 1.44
Новые API
Проверки доступности
-
expect(locator).toHaveAccessibleName() проверяет, имеет ли элемент указанное доступное имя:
const locator = page.getByRole('button'); await expect(locator).toHaveAccessibleName('Submit'); -
expect(locator).toHaveAccessibleDescription() проверяет, имеет ли элемент указанное доступное описание:
const locator = page.getByRole('button'); await expect(locator).toHaveAccessibleDescription('Upload a photo'); -
expect(locator).toHaveRole() проверяет, имеет ли элемент указанную роль ARIA:
const locator = page.getByTestId('save-button'); await expect(locator).toHaveRole('button');
Обработчик локатора
- После выполнения обработчика, добавленного с помощью page.addLocatorHandler(), Playwright теперь будет ждать, пока вызвавшее его наложение не станет невидимым. Это поведение можно отключить с помощью новой опции
noWaitAfter. - Новую опцию
timesможно использовать в page.addLocatorHandler(), чтобы указать максимальное количество запусков обработчика. - Теперь обработчик в page.addLocatorHandler() получает локатор в качестве аргумента.
- Новый метод page.removeLocatorHandler() удаляет ранее добавленные обработчики локаторов.
const locator = page.getByText('This interstitial covers the button');
await page.addLocatorHandler(locator, async overlay => {
await overlay.locator('#close').click();
}, { times: 3, noWaitAfter: true });
// Run your tests that can be interrupted by the overlay.
// ...
await page.removeLocatorHandler(locator); Прочие опции
-
Опция
multipartвapiRequestContext.fetch()теперь принимаетFormDataи поддерживает повторяющиеся поля с одинаковым именем.const formData = new FormData(); formData.append('file', new File(['let x = 2024;'], 'f1.js', { type: 'text/javascript' })); formData.append('file', new File(['hello'], 'f2.txt', { type: 'text/plain' })); context.request.post('https://example.com/uploadFiles', { multipart: formData }); -
Теперь
expect(callback).toPass({ intervals })можно настроить с помощью опцииexpect.toPass.intervalsглобально в testConfig.expect или для отдельного проекта в testProject.expect. -
Теперь
expect(page).toHaveURL(url)поддерживает опциюignoreCase. -
testProject.ignoreSnapshots позволяет настроить для каждого проекта, следует ли пропускать проверки снимков экрана.
API репортера
- Новый метод suite.entries() возвращает дочерние наборы тестов и тестовые случаи в порядке их объявления. Свойства suite.type и testCase.type позволяют различать тестовые случаи и наборы в списке.
-
Репортер Blob теперь позволяет переопределить путь к файлу отчёта с помощью одной опции
outputFile. Эту же опцию можно задать с помощью переменной средыPLAYWRIGHT_BLOB_OUTPUT_FILE, что может быть удобнее в CI/CD. -
Репортер JUnit теперь поддерживает опцию
includeProjectInTestName.
Командная строка
-
Опция CLI
--last-failedпозволяет запускать только тесты, завершившиеся с ошибкой при предыдущем запуске.Сначала запустите все тесты:
$ npx playwright test Running 103 tests using 5 workers ... 2 failed [chromium] › my-test.spec.ts:8:5 › two ───────────────────────────────────────────────────────── [chromium] › my-test.spec.ts:13:5 › three ────────────────────────────────────────────────────── 101 passed (30.0s)
Затем исправьте тесты с ошибками и запустите Playwright ещё раз с опцией
--last-failed:$ npx playwright test --last-failed Running 2 tests using 2 workers 2 passed (1.2s)
Версии браузеров
- Chromium 125.0.6422.14
- Mozilla Firefox 125.0.1
- WebKit 17.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 124
- Microsoft Edge 124
Версия 1.43
Новые API
-
Метод browserContext.clearCookies() теперь поддерживает фильтры, позволяющие удалять только некоторые файлы cookie.
// Clear all cookies. await context.clearCookies(); // New: clear cookies with a particular name. await context.clearCookies({ name: 'session-id' }); // New: clear cookies for a particular domain. await context.clearCookies({ domain: 'my-origin.com' }); -
Новый режим
retain-on-first-failureдля testOptions.trace. В этом режиме трассировка записывается при первом запуске каждого теста, но не при повторных попытках. Если запуск теста завершается с ошибкой, файл трассировки сохраняется, в противном случае он удаляется.import { defineConfig } from '@playwright/test'; export default defineConfig({ use: { trace: 'retain-on-first-failure', }, }); -
Новое свойство testInfo.tags предоставляет доступ к тегам теста во время его выполнения.
test('example', async ({ page }) => { console.log(test.info().tags); }); -
Новый метод locator.contentFrame() преобразует объект Locator в FrameLocator. Это может пригодиться, если у вас есть объект Locator, полученный ранее, и теперь вы хотите взаимодействовать с содержимым внутри фрейма.
const locator = page.locator('iframe[name="embedded"]'); // ... const frameLocator = locator.contentFrame(); await frameLocator.getByRole('button').click(); -
Новый метод frameLocator.owner() преобразует объект FrameLocator в Locator. Это может пригодиться, если у вас есть объект FrameLocator, полученный ранее, и теперь вы хотите взаимодействовать с элементом
iframe.const frameLocator = page.frameLocator('iframe[name="embedded"]'); // ... const locator = frameLocator.owner(); await expect(locator).toBeVisible();
Обновления режима UI
- Теги отображаются в списке тестов.
- Чтобы отфильтровать тесты по тегам, введите
@fastили нажмите на нужный тег. - Новые сочетания клавиш:
- «F5» — запуск тестов.
- «Shift F5» — остановка выполнения тестов.
- «Ctrl `» — переключение отображения вывода тестов.
Версии браузеров
- Chromium 124.0.6367.8
- Mozilla Firefox 124.0
- WebKit 17.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 123
- Microsoft Edge 123
Версия 1.42
Новые API
- Новый метод page.addLocatorHandler() регистрирует обратный вызов, который будет вызван, когда указанный элемент станет видимым и сможет блокировать действия Playwright. Обратный вызов может закрыть наложение. Ниже приведён пример закрытия диалогового окна cookie, когда оно появляется:
// Setup the handler.
await page.addLocatorHandler(
page.getByRole('heading', { name: 'Hej! You are in control of your cookies.' }),
async () => {
await page.getByRole('button', { name: 'Accept all' }).click();
});
// Write the test as usual.
await page.goto('https://www.ikea.com/');
await page.getByRole('link', { name: 'Collection of blue and white' }).click();
await expect(page.getByRole('heading', { name: 'Light and easy' })).toBeVisible(); -
Теперь тайм-аут
expect(callback).toPass()можно настроить с помощью опцииexpect.toPass.timeoutглобально или в конфигурации проекта - Событие electronApplication.on('console') возникает, когда основной процесс Electron вызывает методы API console.
electronApp.on('console', async msg => {
const values = [];
for (const arg of msg.args())
values.push(await arg.jsonValue());
console.log(...values);
});
await electronApp.evaluate(() => console.log('hello', 5, { foo: 'bar' })); - Новый синтаксис для добавления тегов к тестам (токены @ в заголовке теста по-прежнему поддерживаются):
test('test customer login', {
tag: ['@fast', '@login'],
}, async ({ page }) => {
// ...
}); Используйте параметр командной строки --grep, чтобы запускать только тесты с определёнными тегами.
npx playwright test --grep @fast
-
Флаг командной строки
--projectтеперь поддерживает подстановочный знак «*»:
npx playwright test --project='*mobile*'
- Новый синтаксис для аннотаций тестов:
test('test full report', {
annotation: [
{ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/23180' },
{ type: 'docs', description: 'https://playwright.dev/docs/test-annotations#tag-tests' },
],
}, async ({ page }) => {
// ...
}); -
page.pdf() принимает две новые опции:
taggedиoutline.
Объявления
- ⚠️ Ubuntu 18 больше не поддерживается.
Версии браузеров
- Chromium 123.0.6312.4
- Mozilla Firefox 123.0
- WebKit 17.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 122
- Microsoft Edge 123
Версия 1.41
Новые API
- Новый метод page.unrouteAll() удаляет все маршруты, зарегистрированные с помощью page.route() и page.routeFromHAR(). При желании можно дождаться завершения выполняющихся маршрутов или игнорировать возникающие в них ошибки.
- Новый метод browserContext.unrouteAll() удаляет все маршруты, зарегистрированные с помощью browserContext.route() и browserContext.routeFromHAR(). При желании можно дождаться завершения выполняющихся маршрутов или игнорировать возникающие в них ошибки.
- Новые опции style в page.screenshot() и style в locator.screenshot() позволяют добавлять на страницу пользовательский CSS перед созданием снимка экрана.
- Новая опция
stylePathдля методов expect(page).toHaveScreenshot() и expect(locator).toHaveScreenshot() позволяет применять пользовательскую таблицу стилей при создании снимка экрана. - Новая опция
fileNameдля репортера Blob позволяет указать имя создаваемого отчёта.
Версии браузеров
- Chromium 121.0.6167.57
- Mozilla Firefox 121.0
- WebKit 17.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 120
- Microsoft Edge 120
Версия 1.40
Обновление генератора тестов
Новые инструменты для создания проверок:
- Инструмент «Проверить видимость» генерирует expect(locator).toBeVisible().
- Инструмент «Проверить значение» генерирует expect(locator).toHaveValue().
- Инструмент «Проверить текст» генерирует expect(locator).toContainText().
Пример сгенерированного теста с проверками:
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.getByRole('link', { name: 'Get started' }).click();
await expect(page.getByLabel('Breadcrumbs').getByRole('list')).toContainText('Installation');
await expect(page.getByLabel('Search')).toBeVisible();
await page.getByLabel('Search').click();
await page.getByPlaceholder('Search docs').fill('locator');
await expect(page.getByPlaceholder('Search docs')).toHaveValue('locator');
}); Новые API
- Параметр reason в page.close(), reason в browserContext.close() и reason в browser.close(). Причина закрытия сообщается для всех операций, прерванных закрытием.
- Параметр firefoxUserPrefs в browserType.launchPersistentContext().
Другие изменения
- Методы download.path() и download.createReadStream() выбрасывают ошибку при неудачной или отменённой загрузке.
- Теперь образ Docker Playwright поставляется с Node.js v20.
Версии браузеров
- Chromium 120.0.6099.28
- Mozilla Firefox 119.0
- WebKit 17.4
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 119
- Microsoft Edge 119
Версия 1.39
Добавление пользовательских сопоставителей для expect
Вы можете расширить проверки Playwright, добавив пользовательские сопоставители. Эти сопоставители будут доступны в объекте expect.
import { expect as baseExpect } from '@playwright/test';
export const expect = baseExpect.extend({
async toHaveAmount(locator: Locator, expected: number, options?: { timeout?: number }) {
// ... see documentation for how to write matchers.
},
});
test('pass', async ({ page }) => {
await expect(page.getByTestId('cart')).toHaveAmount(5);
}); Полный пример см. в документации.
Объединение тестовых фикстур
Теперь вы можете объединять тестовые фикстуры из нескольких файлов или модулей:
import { mergeTests } from '@playwright/test';
import { test as dbTest } from 'database-test-utils';
import { test as a11yTest } from 'a11y-test-utils';
export const test = mergeTests(dbTest, a11yTest); import { test } from './fixtures';
test('passes', async ({ database, page, a11y }) => {
// use database and a11y fixtures.
}); Объединение пользовательских сопоставителей expect
Теперь вы можете объединять пользовательские сопоставители expect из нескольких файлов или модулей:
import { mergeTests, mergeExpects } from '@playwright/test';
import { test as dbTest, expect as dbExpect } from 'database-test-utils';
import { test as a11yTest, expect as a11yExpect } from 'a11y-test-utils';
export const test = mergeTests(dbTest, a11yTest);
export const expect = mergeExpects(dbExpect, a11yExpect); import { test, expect } from './fixtures';
test('passes', async ({ page, database }) => {
await expect(database).toHaveDatabaseUser('admin');
await expect(page).toPassA11yAudit();
}); Скрытие деталей реализации: шаги теста в режиме box
Вы можете пометить test.step() как «boxed», чтобы ошибки внутри него указывали на место вызова шага.
async function login(page) {
await test.step('login', async () => {
// ...
}, { box: true }); // Note the "box" option here.
} Error: Timed out 5000ms waiting for expect(locator).toBeVisible()
... error details omitted ...
14 | await page.goto('https://github.com/login');
> 15 | await login(page);
| ^
16 | }); Полный пример см. в документации test.step().
Новые API
Версии браузеров
- Chromium 119.0.6045.9
- Mozilla Firefox 118.0.1
- WebKit 17.4
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 118
- Microsoft Edge 118
Версия 1.38
Обновления режима UI
- Масштабирование временного диапазона.
- Обновлённая панель сети.
Новые API
- browserContext.on('weberror')
- locator.pressSequentially()
- Теперь reporter.onEnd() сообщает
startTimeи общее количествоduration.
Устаревшие API
- Следующие методы объявлены устаревшими: page.type(), frame.type(), locator.type() и elementHandle.type(). Вместо них используйте locator.fill() — он работает значительно быстрее. Используйте locator.pressSequentially(), только если на странице предусмотрена специальная обработка клавиатуры и необходимо нажимать клавиши по одной.
Несовместимые изменения: Playwright больше не загружает браузеры автоматически
Примечание: Если вы используете пакет
@playwright/test, это изменение вас не затронет.
Playwright рекомендует использовать пакет @playwright/test и загружать браузеры с помощью команды npx playwright install. Если вы следуете этой рекомендации, для вас ничего не изменилось.
Однако до версии v1.38 установка пакета playwright вместо @playwright/test автоматически загружала браузеры. Теперь это не так, поэтому мы рекомендуем явно загружать браузеры с помощью команды npx playwright install.
v1.37 и более ранние версии
Пакет playwright загружал браузеры во время npm install, а @playwright/test этого не делал.
v1.38 и более поздние версии
Пакеты playwright и @playwright/test не загружают браузеры во время npm install.
Рекомендуемый способ перехода
Выполните команду npx playwright install, чтобы загрузить браузеры после npm install. Например, в конфигурации CI:
- run: npm ci - run: npx playwright install --with-deps
Альтернативный способ перехода — не рекомендуется
Добавьте @playwright/browser-chromium, @playwright/browser-firefox и @playwright/browser-webkit в качестве зависимостей. Эти пакеты загружают соответствующие браузеры во время npm install. Следите за тем, чтобы версии всех пакетов playwright совпадали:
// package.json
{
"devDependencies": {
"playwright": "1.38.0",
"@playwright/browser-chromium": "1.38.0",
"@playwright/browser-firefox": "1.38.0",
"@playwright/browser-webkit": "1.38.0"
}
} Версии браузеров
- Chromium 117.0.5938.62
- Mozilla Firefox 117.0
- WebKit 17.0
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 116
- Microsoft Edge 116
Версия 1.37
Новый инструмент npx playwright merge-reports
Если вы запускаете тесты на нескольких шардах, теперь можно объединить все отчёты в один HTML-отчёт (или отчёт другого формата) с помощью нового инструмента командной строки merge-reports.
Для использования инструмента merge-reports выполните следующие действия:
-
Добавьте новый репортёр "blob" в конфигурацию при запуске в CI:
export default defineConfig({ testDir: './tests', reporter: process.env.CI ? 'blob' : 'html', });Репортёр "blob" создаёт файлы ".zip", содержащие всю информацию о запуске тестов.
-
Скопируйте все отчёты "blob" в одно общее место и выполните
npx playwright merge-reports:
npx playwright merge-reports --reporter html ./all-blob-reports
Подробнее см. в нашей документации.
📚 Поддержка Debian 12 Bookworm
Теперь Playwright поддерживает Debian 12 Bookworm на платформах x86_64 и arm64 для Chromium, Firefox и WebKit. Сообщите нам, если столкнётесь с какими-либо проблемами!
Поддержка Linux выглядит следующим образом:
| Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | Debian 12 | |
|---|---|---|---|---|
| Chromium | ✅ | ✅ | ✅ | ✅ |
| WebKit | ✅ | ✅ | ✅ | ✅ |
| Firefox | ✅ | ✅ | ✅ | ✅ |
Обновления режима UI
- Теперь режим UI учитывает зависимости проектов. Вы можете управлять тем, какие зависимости учитывать, отмечая или снимая отметки в списке проектов.
- Журналы консоли теста теперь отображаются на вкладке Console.
Версии браузеров
- Chromium 116.0.5845.82
- Mozilla Firefox 115.0
- WebKit 17.0
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 115
- Microsoft Edge 115
Версия 1.36
🏝️ Летний выпуск с исправлениями и обновлениями.
Версии браузеров
- Chromium 115.0.5790.75
- Mozilla Firefox 115.0
- WebKit 17.0
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 114
- Microsoft Edge 114
Версия 1.35
Основные моменты
-
Режим UI теперь доступен в расширении Playwright для VSCode с помощью новой кнопки «Show trace viewer»:
-
Режим UI и просмотрщик трассировок отмечают сетевые запросы, обработанные обработчиками page.route() и browserContext.route(), а также запросы, отправленные через тестирование API:
-
Новый параметр
maskColorдля методов page.screenshot(), locator.screenshot(), expect(page).toHaveScreenshot() и expect(locator).toHaveScreenshot() позволяет изменить цвет маскирования по умолчанию:await page.goto('https://playwright.dev'); await expect(page).toHaveScreenshot({ mask: [page.locator('img')], maskColor: '#00FF00', // green }); -
Новая команда CLI
uninstallдля удаления бинарных файлов браузеров:$ npx playwright uninstall # remove browsers installed by this installation $ npx playwright uninstall --all # remove all ever-install Playwright browsers
-
Теперь режим UI и просмотрщик трассировок можно открывать во вкладке браузера:
$ npx playwright test --ui-port 0 # open UI mode in a tab on a random port $ npx playwright show-trace --port 0 # open trace viewer in tab on a random port
⚠️ Несовместимые изменения
-
Бинарный файл
playwright-coreпереименован сplaywrightнаplaywright-core. Поэтому, если вы используете CLIplaywright-core, не забудьте обновить имя:$ npx playwright-core install # the new way to install browsers when using playwright-core
Это изменение не затрагивает пользователей пакетов
@playwright/testиplaywright.
Версии браузеров
- Chromium 115.0.5790.13
- Mozilla Firefox 113.0
- WebKit 16.4
Эта версия также прошла тестирование в следующих стабильных каналах:
- Google Chrome 114
- Microsoft Edge 114
Версия 1.34
Основные моменты
-
В режиме UI теперь отображаются шаги, фикстуры и вложения:
-
Новое свойство testProject.teardown позволяет указать проект, который нужно запустить после завершения этого проекта и всех зависимых от него проектов. Teardown полезен для очистки ресурсов, выделенных этим проектом.
Распространённый шаблон — зависимость
setupс соответствующимteardown:import { defineConfig } from '@playwright/test'; export default defineConfig({ projects: [ { name: 'setup', testMatch: /global.setup\.ts/, teardown: 'teardown', }, { name: 'teardown', testMatch: /global.teardown\.ts/, }, { name: 'chromium', use: devices['Desktop Chrome'], dependencies: ['setup'], }, { name: 'firefox', use: devices['Desktop Firefox'], dependencies: ['setup'], }, { name: 'webkit', use: devices['Desktop Safari'], dependencies: ['setup'], }, ], }); -
Новый метод
expect.configureпозволяет создать предварительно настроенный экземпляр expect с собственными значениями по умолчанию, такими какtimeoutиsoft.const slowExpect = expect.configure({ timeout: 10000 }); await slowExpect(locator).toHaveText('Submit'); // Always do soft assertions. const softExpect = expect.configure({ soft: true }); -
Новые параметры
stderrиstdoutв testConfig.webServer позволяют настроить обработку вывода:import { defineConfig } from '@playwright/test'; export default defineConfig({ // Run your local dev server before starting the tests webServer: { command: 'npm run start', url: 'http://127.0.0.1:3000', reuseExistingServer: !process.env.CI, stdout: 'pipe', stderr: 'pipe', }, }); -
Новый метод locator.and() создаёт локатор, соответствующий обоим локаторам.
const button = page.getByRole('button').and(page.getByTitle('Subscribe')); -
Новые события browserContext.on('console') и browserContext.on('dialog') позволяют подписаться на все диалоговые окна и сообщения консоли с любых страниц в заданном контексте браузера. Используйте новые методы consoleMessage.page() и dialog.page(), чтобы точно определить источник события.
⚠️ Несовместимые изменения
-
npx playwright testбольше не работает, если установить одновременноplaywrightи@playwright/test. Устанавливать оба пакета не нужно, поскольку API автоматизации браузера всегда можно импортировать напрямую из@playwright/test:import { chromium, firefox, webkit } from '@playwright/test'; /* ... */ -
Node.js 14 больше не поддерживается, поскольку 30 апреля 2023 года завершился срок его поддержки.
Версии браузеров
- Chromium 114.0.5735.26
- Mozilla Firefox 113.0
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 113
- Microsoft Edge 113
Версия 1.33
Обновление локаторов
-
Используйте locator.or(), чтобы создать локатор, соответствующий одному из двух локаторов. Представьте, что вы хотите нажать кнопку «Новое письмо», но иногда вместо неё появляется диалоговое окно настроек безопасности. В этом случае можно дождаться появления кнопки «Новое письмо» или диалогового окна и действовать соответствующим образом:
const newEmail = page.getByRole('button', { name: 'New email' }); const dialog = page.getByText('Confirm security settings'); await expect(newEmail.or(dialog)).toBeVisible(); if (await dialog.isVisible()) await page.getByRole('button', { name: 'Dismiss' }).click(); await newEmail.click(); -
Используйте новые параметры hasNot и hasNotText в locator.filter(), чтобы находить элементы, которые не соответствуют заданным условиям.
const rowLocator = page.locator('tr'); await rowLocator .filter({ hasNotText: 'text in column 1' }) .filter({ hasNot: page.getByRole('button', { name: 'column 2 button' }) }) .screenshot(); -
Используйте новую проверку с ожиданием для веб-страниц expect(locator).toBeAttached(), чтобы убедиться, что элемент присутствует в DOM страницы. Не путайте её с expect(locator).toBeVisible(), которая проверяет, что элемент присутствует в DOM и видим.
Новые API
- locator.or()
- Новый параметр hasNot в locator.filter()
- Новый параметр hasNotText в locator.filter()
- expect(locator).toBeAttached()
- Новый параметр timeout в route.fetch()
- reporter.onExit()
⚠️ Несовместимое изменение
mcr.microsoft.com/playwright:v1.33.0теперь использует образ Playwright на основе Ubuntu Jammy. Чтобы использовать образ на основе Focal, используйте вместо негоmcr.microsoft.com/playwright:v1.33.0-focal.
Версии браузеров
- Chromium 113.0.5672.53
- Mozilla Firefox 112.0
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 112
- Microsoft Edge 112
Версия 1.32
Представляем режим UI (предварительная версия)
Новый режим UI позволяет изучать, запускать и отлаживать тесты. В него встроен режим наблюдения.
Запустите его с помощью нового флага --ui:
npx playwright test --ui
Новые API
- Новые параметры updateMode и updateContent в page.routeFromHAR() и browserContext.routeFromHAR().
- Цепочки вызовов для существующих объектов локаторов; подробности см. в документации по локаторам.
- Новое свойство testInfo.testId.
- Новый параметр name в методе tracing.startChunk().
⚠️ Несовместимое изменение в тестах компонентов
Примечание: касается только тестов компонентов и не затрагивает сквозные тесты.
-
Теперь
@playwright/experimental-ct-reactподдерживает только React 18. - Если вы запускаете тесты компонентов с React 16 или 17, замените
@playwright/experimental-ct-reactна@playwright/experimental-ct-react17.
Версии браузеров
- Chromium 112.0.5615.29
- Mozilla Firefox 111.0
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 111
- Microsoft Edge 111
Версия 1.31
Новые API
-
Новое свойство testProject.dependencies позволяет настроить зависимости между проектами.
Зависимости позволяют выполнять глобальную настройку с созданием трассировок и других артефактов, просматривать шаги настройки в отчёте о тестировании и многое другое.
import { defineConfig } from '@playwright/test'; export default defineConfig({ projects: [ { name: 'setup', testMatch: /global.setup\.ts/, }, { name: 'chromium', use: devices['Desktop Chrome'], dependencies: ['setup'], }, { name: 'firefox', use: devices['Desktop Firefox'], dependencies: ['setup'], }, { name: 'webkit', use: devices['Desktop Safari'], dependencies: ['setup'], }, ], }); -
Новая проверка expect(locator).toBeInViewport() проверяет, что локатор указывает на элемент, пересекающийся с областью просмотра, согласно API Intersection Observer.
const button = page.getByRole('button'); // Make sure at least some part of element intersects viewport. await expect(button).toBeInViewport(); // Make sure element is fully outside of viewport. await expect(button).not.toBeInViewport(); // Make sure that at least half of the element intersects viewport. await expect(button).toBeInViewport({ ratio: 0.5 });
Разное
- Снимки DOM в просмотрщике трассировок теперь можно открывать в отдельном окне.
- Новый метод
defineConfigдля использования вplaywright.config. - Новый параметр maxRedirects для метода route.fetch().
- Теперь Playwright поддерживает Debian 11 arm64.
- Официальные образы Docker теперь включают Node 18 вместо Node 16.
⚠️ Несовместимое изменение в тестах компонентов
Примечание: касается только тестов компонентов и не затрагивает сквозные тесты.
Для playwright-ct.config файл конфигурации тестирования компонентов теперь требует вызова defineConfig.
// Before
import { type PlaywrightTestConfig, devices } from '@playwright/experimental-ct-react';
const config: PlaywrightTestConfig = {
// ... config goes here ...
};
export default config; Замените определение переменной config вызовом defineConfig:
// After
import { defineConfig, devices } from '@playwright/experimental-ct-react';
export default defineConfig({
// ... config goes here ...
}); Версии браузеров
- Chromium 111.0.5563.19
- Mozilla Firefox 109.0
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 110
- Microsoft Edge 110
Версия 1.30
Версии браузеров
- Chromium 110.0.5481.38
- Mozilla Firefox 108.0.2
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 109
- Microsoft Edge 109
Версия 1.29
Новые API
-
Новый метод route.fetch() и новый параметр
jsonдля route.fulfill():await page.route('**/api/settings', async route => { // Fetch original settings. const response = await route.fetch(); // Force settings theme to a predefined value. const json = await response.json(); json.theme = 'Solorized'; // Fulfill with modified data. await route.fulfill({ json }); }); -
Новый метод locator.all() позволяет перебрать все совпавшие элементы:
// Check all checkboxes! const checkboxes = page.getByRole('checkbox'); for (const checkbox of await checkboxes.all()) await checkbox.check(); -
Теперь locator.selectOption() выполняет поиск по значению или метке:
<select multiple> <option value="red">Red</option> <option value="green">Green</option> <option value="blue">Blue</option> </select>
await element.selectOption('Red'); -
Повторяйте блоки кода, пока все проверки не пройдут успешно:
await expect(async () => { const response = await page.request.get('https://api.example.com'); await expect(response).toBeOK(); }).toPass();Подробнее читайте в нашей документации.
-
Автоматически делайте полноразмерный снимок страницы при сбое теста:
import { defineConfig } from '@playwright/test'; export default defineConfig({ use: { screenshot: { mode: 'only-on-failure', fullPage: true, } } });
Разное
- Playwright Test теперь учитывает
jsconfig.json. - Новые параметры
argsиproxyдля androidDevice.launchBrowser(). - Параметр
postDataв методе route.continue() теперь поддерживает значения типа Serializable.
Версии браузеров
- Chromium 109.0.5414.46
- Mozilla Firefox 107.0
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 108
- Microsoft Edge 108
Версия 1.28
Инструменты Playwright
- Запись с позиции курсора в VSCode. Можно запустить тест, установить курсор в конец теста и продолжить его создание.
- Интерактивные локаторы в VSCode. Наводите курсор на локаторы и редактируйте их в VSCode, чтобы они подсвечивались в открытом браузере.
- Интерактивные локаторы в CodeGen. Создавайте локатор для любого элемента на странице с помощью инструмента «Исследовать».
- Тёмная тема в Codegen и просмотрщике трассировок. Тема автоматически выбирается в соответствии с настройками операционной системы.
Средство запуска тестов
-
Настройте количество повторных попыток и тайм-аут теста для файла или теста с помощью test.describe.configure().
// Each test in the file will be retried twice and have a timeout of 20 seconds. test.describe.configure({ retries: 2, timeout: 20_000 }); test('runs first', async ({ page }) => {}); test('runs second', async ({ page }) => {}); -
Используйте testProject.snapshotPathTemplate и testConfig.snapshotPathTemplate, чтобы настроить шаблон, определяющий расположение снимков, создаваемых с помощью expect(page).toHaveScreenshot() и expect(value).toMatchSnapshot().
import { defineConfig } from '@playwright/test'; export default defineConfig({ testDir: './tests', snapshotPathTemplate: '{testDir}/__screenshots__/{testFilePath}/{arg}{ext}', });
Новые API
Версии браузеров
- Chromium 108.0.5359.29
- Mozilla Firefox 106.0
- WebKit 16.4
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 107
- Microsoft Edge 107
Версия 1.27
Локаторы
С этими новыми API писать локаторы — одно удовольствие:
- page.getByText() для поиска по текстовому содержимому.
- page.getByRole() для поиска по роли ARIA, атрибутам ARIA и доступному имени.
- page.getByLabel() для поиска элемента управления формой по тексту связанной с ним метки.
-
page.getByTestId() для поиска элемента по его атрибуту
data-testid(можно настроить использование другого атрибута). - page.getByPlaceholder() для поиска поля ввода по тексту-заполнителю.
- page.getByAltText() для поиска элемента, обычно изображения, по его текстовому описанию.
- page.getByTitle() для поиска элемента по его заголовку.
await page.getByLabel('User Name').fill('John');
await page.getByLabel('Password').fill('secret-password');
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.getByText('Welcome, John!')).toBeVisible(); Все те же методы также доступны в классах Locator, FrameLocator и Frame.
Другие особенности
-
Опция
workersвplaywright.config.tsтеперь принимает строку с процентным значением, чтобы использовать часть доступных процессоров. Ее также можно передать в командной строке:npx playwright test --workers=20%
-
Новые параметры
hostиportдля HTML-репортера.import { defineConfig } from '@playwright/test'; export default defineConfig({ reporter: [['html', { host: 'localhost', port: '9223' }]], }); -
Для тестовых репортеров доступно новое поле
FullConfig.configFile, указывающее путь к файлу конфигурации, если он задан. -
Как было объявлено в версии 1.25, поддержка Ubuntu 18 завершится в декабре 2022 года. Кроме того, начиная со следующего выпуска Playwright для Ubuntu 18 не будут выходить обновления WebKit.
Изменения поведения
-
expect(locator).toHaveAttribute() с пустым значением больше не совпадает с отсутствующим атрибутом. Например, следующий фрагмент кода завершится успешно, если у
buttonнет атрибутаdisabled.await expect(page.getByRole('button')).toHaveAttribute('disabled', ''); -
Параметры командной строки
--grepи--grep-invertраньше ошибочно игнорировали параметрыgrepиgrepInvert, указанные в конфигурации. Теперь применяются все параметры.
Версии браузеров
- Chromium 107.0.5304.18
- Mozilla Firefox 105.0.1
- WebKit 16.0
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 106
- Microsoft Edge 106
Версия 1.26
Проверки
- Новая опция
enabledдля expect(locator).toBeEnabled(). - expect(locator).toHaveText() теперь проникает в открытые корневые элементы Shadow DOM.
- Новая опция
editableдля expect(locator).toBeEditable(). - Новая опция
visibleдля expect(locator).toBeVisible().
Другие особенности
- Новая опция
maxRedirectsдля apiRequestContext.get() и других методов, ограничивающая количество перенаправлений. - Новый флаг командной строки
--pass-with-no-testsпозволяет тестовому набору завершиться успешно, если файлы не найдены. - Новый флаг командной строки
--ignore-snapshotsпозволяет пропускать проверки снимков, напримерexpect(value).toMatchSnapshot()иexpect(page).toHaveScreenshot().
Изменение поведения
Ряд API Playwright уже поддерживают опцию waitUntil: 'domcontentloaded'. Например:
await page.goto('https://playwright.dev', {
waitUntil: 'domcontentloaded',
}); До версии 1.26 этот вызов ожидал, пока все iframe вызовут событие DOMContentLoaded.
В соответствии со спецификацией веб-платформы значение 'domcontentloaded' ожидает, пока событие 'DOMContentLoaded' будет вызвано целевым фреймом. Чтобы дождаться события во всех iframe, используйте waitUntil: 'load'.
Версии браузеров
- Chromium 106.0.5249.30
- Mozilla Firefox 104.0
- WebKit 16.0
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 105
- Microsoft Edge 105
Версия 1.25
Расширение для VSCode
- Наблюдайте за запуском тестов в реальном времени и оставляйте инструменты разработчика открытыми.
- Выберите селектор.
- Запишите новый тест на основе текущего состояния страницы.
Средство запуска тестов
-
test.step() теперь возвращает значение функции шага:
test('should work', async ({ page }) => { const pageTitle = await test.step('get title', async () => { await page.goto('https://playwright.dev'); return await page.title(); }); console.log(pageTitle); }); -
Добавлен test.describe.fixme().
-
Новый статус теста
'interrupted'. -
Включение трассировки с помощью флага CLI:
npx playwright test --trace=on.
Объявления
- 🎁 Теперь мы поставляем образ Docker Ubuntu 22.04 Jammy Jellyfish:
mcr.microsoft.com/playwright:v1.34.0-jammy. - 🪦 Это последний выпуск с поддержкой macOS 10.15 (она объявлена устаревшей начиная с версии 1.21).
- 🪦 Это последний выпуск с поддержкой Node.js 12. Рекомендуем перейти на LTS-версию Node.js (16).
- ⚠️ Ubuntu 18 объявлена устаревшей; ее поддержка завершится в декабре 2022 года.
Версии браузеров
- Chromium 105.0.5195.19
- Mozilla Firefox 103.0
- WebKit 16.0
Эта версия также тестировалась со следующими стабильными версиями:
- Google Chrome 104
- Microsoft Edge 104
Версия 1.24
🌍 Несколько веб-серверов в playwright.config.ts
Запускайте несколько веб-серверов, баз данных или других процессов, передав массив конфигураций:
import { defineConfig } from '@playwright/test';
export default defineConfig({
webServer: [
{
command: 'npm run start',
url: 'http://127.0.0.1:3000',
timeout: 120 * 1000,
reuseExistingServer: !process.env.CI,
},
{
command: 'npm run backend',
url: 'http://127.0.0.1:3333',
timeout: 120 * 1000,
reuseExistingServer: !process.env.CI,
}
],
use: {
baseURL: 'http://localhost:3000/',
},
}); 🐂 Поддержка Debian 11 Bullseye
Playwright теперь поддерживает Debian 11 Bullseye на архитектуре x86_64 для Chromium, Firefox и WebKit. Сообщите нам, если столкнетесь с какими-либо проблемами!
Поддержка Linux выглядит так:
| | Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | :--- | :---: | :---: | :---: | :---: | | Chromium | ✅ | ✅ | ✅ | | WebKit | ✅ | ✅ | ✅ | | Firefox | ✅ | ✅ | ✅ |
🕵️ Анонимный Describe
Теперь можно вызывать test.describe(), чтобы создавать наборы тестов без заголовка. Это удобно, если нужно задать общую опцию для группы тестов с помощью test.use().
test.describe(() => {
test.use({ colorScheme: 'dark' });
test('one', async ({ page }) => {
// ...
});
test('two', async ({ page }) => {
// ...
});
}); 🧩 Обновление тестирования компонентов
В Playwright 1.24 для тестирования компонентов появились хуки beforeMount и afterMount. Используйте их для настройки приложения перед тестами.
Например, их можно использовать для настройки маршрутизатора приложения в Vue.js:
import { test } from '@playwright/experimental-ct-vue';
import { Component } from './mycomponent';
test('should work', async ({ mount }) => {
const component = await mount(Component, {
hooksConfig: {
/* anything to configure your app */
}
});
}); import { router } from '../router';
import { beforeMount } from '@playwright/experimental-ct-vue/hooks';
beforeMount(async ({ app, hooksConfig }) => {
app.use(router);
}); Аналогичная конфигурация в Next.js будет выглядеть так:
import { test } from '@playwright/experimental-ct-react';
import { Component } from './mycomponent';
test('should work', async ({ mount }) => {
const component = await mount(<Component></Component>, {
// Pass mock value from test into `beforeMount`.
hooksConfig: {
router: {
query: { page: 1, per_page: 10 },
asPath: '/posts'
}
}
});
}); import router from 'next/router';
import { beforeMount } from '@playwright/experimental-ct-react/hooks';
beforeMount(async ({ hooksConfig }) => {
// Before mount, redefine useRouter to return mock value from test.
router.useRouter = () => hooksConfig.router;
}); Версия 1.23
Воспроизведение сетевого трафика
Теперь можно записывать сетевой трафик в файл HAR и повторно использовать его в тестах.
Чтобы записать сетевой трафик в файл HAR:
npx playwright open --save-har=github.har.zip https://github.com/microsoft
Кроме того, можно записать HAR программно:
const context = await browser.newContext({
recordHar: { path: 'github.har.zip' }
});
// ... do stuff ...
await context.close(); Используйте новые методы page.routeFromHAR() или browserContext.routeFromHAR(), чтобы предоставлять подходящие ответы из файла HAR:
await context.routeFromHAR('github.har.zip'); Подробнее читайте в нашей документации.
Расширенная маршрутизация
Теперь можно использовать route.fallback(), чтобы передавать обработку маршрутизации другим обработчикам.
Рассмотрим следующий пример:
// Remove a header from all requests.
test.beforeEach(async ({ page }) => {
await page.route('**/*', async route => {
const headers = await route.request().allHeaders();
delete headers['if-none-match'];
await route.fallback({ headers });
});
});
test('should work', async ({ page }) => {
await page.route('**/*', async route => {
if (route.request().resourceType() === 'image')
await route.abort();
else
await route.fallback();
});
}); Обратите внимание: новые методы page.routeFromHAR() и browserContext.routeFromHAR() также участвуют в маршрутизации, и обработку можно передать им.
Обновление проверок с ожиданием результата
- Новый метод expect(locator).toHaveValues() проверяет все выбранные значения элемента
<select multiple>. - Методы expect(locator).toContainText() и expect(locator).toHaveText() теперь принимают опцию
ignoreCase.
Обновление тестирования компонентов
- Поддержка Vue2 через пакет
@playwright/experimental-ct-vue2. - Поддержка тестирования компонентов для create-react-app с компонентами в файлах
.js.
Подробнее о тестировании компонентов с Playwright.
Разное
-
Если вам мешает service worker, теперь его можно легко отключить с помощью новой опции контекста
serviceWorkers:export default { use: { serviceWorkers: 'block', } }; -
Использование пути
.zipдля опции контекстаrecordHarавтоматически упаковывает полученный HAR в ZIP-архив:const context = await browser.newContext({ recordHar: { path: 'github.har.zip', } }); -
Если вы собираетесь редактировать HAR вручную, рассмотрите режим записи HAR
"minimal", который записывает только информацию, необходимую для воспроизведения:const context = await browser.newContext({ recordHar: { path: 'github.har', mode: 'minimal', } }); -
Теперь Playwright работает на Ubuntu 22 amd64 и Ubuntu 22 arm64. Мы также публикуем новый образ Docker
mcr.microsoft.com/playwright:v1.34.0-jammy.
⚠️ Изменения, нарушающие обратную совместимость ⚠️
Теперь WebServer считается «готовым», если запрос к указанному URL возвращает один из следующих кодов состояния HTTP:
200-299-
300-399(новый) -
400,401,402,403(новые)
Версия 1.22
Основные моменты
-
Тестирование компонентов (предварительная версия)
Playwright Test теперь может тестировать компоненты React или Vue.js. Вы можете использовать все возможности Playwright Test (например, параллельное выполнение, эмуляцию и отладку), запуская компоненты в настоящих браузерах.
Вот как выглядит типичный тест компонента:
import { test, expect } from '@playwright/experimental-ct-react'; import App from './App'; // Let's test component in a dark scheme! test.use({ colorScheme: 'dark' }); test('should render', async ({ mount }) => { const component = await mount(<App></App>); // As with any Playwright test, assert locator text. await expect(component).toContainText('React'); // Or do a screenshot 🚀 await expect(component).toHaveScreenshot(); // Or use any Playwright method await component.click(); });Подробнее читайте в нашей документации.
-
Селекторы ролей, позволяющие выбирать элементы по их роли ARIA, атрибутам ARIA и доступному имени.
// Click a button with accessible name "log in" await page.locator('role=button[name="log in"]').click();Подробнее читайте в нашей документации.
-
Новый API locator.filter() для фильтрации существующего locator
const buttons = page.locator('role=button'); // ... const submitButton = buttons.filter({ hasText: 'Submit' }); await submitButton.click(); -
Новые проверки с ожиданием для веба expect(page).toHaveScreenshot() и expect(locator).toHaveScreenshot(), которые дожидаются стабилизации снимка экрана и повышают надёжность тестов.
Для новых проверок заданы специальные значения по умолчанию, связанные со снимками экрана, например:
- отключают анимацию
- используют параметр масштабирования CSS
await page.goto('https://playwright.dev'); await expect(page).toHaveScreenshot();Новая проверка expect(page).toHaveScreenshot() сохраняет снимки экрана в том же месте, что и expect(value).toMatchSnapshot().
Версия 1.21
Основные моменты
-
Новые селекторы ролей, позволяющие выбирать элементы по их роли ARIA, атрибутам ARIA и доступному имени.
// Click a button with accessible name "log in" await page.locator('role=button[name="log in"]').click();Подробнее читайте в нашей документации.
-
Новая опция
scaleв page.screenshot() для снимков экрана меньшего размера. -
Новая опция
caretв page.screenshot() для управления текстовым курсором. По умолчанию используется"hide". -
Новый метод
expect.pollдля ожидания произвольного условия:// Poll the method until it returns an expected result. await expect.poll(async () => { const response = await page.request.get('https://api.example.com'); return response.status(); }).toBe(200);expect.pollподдерживает большинство синхронных средств проверки, например.toBe(),.toContain()и т. д. Подробнее читайте в нашей документации.
Изменения в поведении
- Поддержка ESM при запуске тестов TypeScript теперь включена по умолчанию. Переменная среды
PLAYWRIGHT_EXPERIMENTAL_TS_ESMбольше не требуется. - Образ Docker
mcr.microsoft.com/playwrightбольше не содержит Python. Для готового к использованию с Playwright образа Docker с предварительно установленным Python используйтеmcr.microsoft.com/playwright/python. - Теперь Playwright поддерживает загрузку больших файлов (сотни МБ) через API locator.setInputFiles().
Версии браузеров
- Chromium 101.0.4951.26
- Mozilla Firefox 98.0.2
- WebKit 15.4
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 100
- Microsoft Edge 100
Версия 1.20
Основные моменты
-
Новые параметры для методов page.screenshot(), locator.screenshot() и elementHandle.screenshot():
- Параметр
animations: "disabled"возвращает все CSS-анимации и переходы в согласованное состояние - Параметр
mask: Locator[]маскирует заданные элементы, накладывая на них розовые блоки#FF00FF.
- Параметр
-
expect().toMatchSnapshot()теперь поддерживает анонимные снимки: если имя снимка не указано, Playwright Test сгенерирует его автоматически:expect('Web is Awesome <3').toMatchSnapshot(); -
Новые параметры
maxDiffPixelsиmaxDiffPixelRatioдля точного сравнения снимков экрана с помощьюexpect().toMatchSnapshot():expect(await page.screenshot()).toMatchSnapshot({ maxDiffPixels: 27, // allow no more than 27 different pixels. });Удобнее всего один раз указать
maxDiffPixelsилиmaxDiffPixelRatioв testConfig.expect. -
Теперь Playwright Test поддерживает режим testConfig.fullyParallel. По умолчанию Playwright Test выполняет файлы параллельно. В полностью параллельном режиме тесты внутри одного файла также запускаются параллельно. Вы также можете использовать флаг командной строки
--fully-parallel.export default { fullyParallel: true, }; -
Параметры testProject.grep и testProject.grepInvert теперь можно настраивать отдельно для каждого проекта. Например, теперь можно настроить проект smoke-тестов с помощью
grep:export default { projects: [ { name: 'smoke tests', grep: /@smoke/, }, ], }; -
Trace Viewer теперь показывает запросы API-тестирования.
-
locator.highlight() визуально выделяет элементы для упрощения отладки.
Объявления
- Теперь мы выпускаем отдельный образ Docker для Python
mcr.microsoft.com/playwright/python. Если вы используете Python, перейдите на него. Это последний выпуск, в котором Python входит в наш образ Docker для JavaScriptmcr.microsoft.com/playwright. - v1.20 — последний выпуск с обновлением WebKit для macOS 10.15 Catalina. Обновите macOS, чтобы пользоваться самой свежей версией WebKit!
Версии браузеров
- Chromium 101.0.4921.0
- Mozilla Firefox 97.0.1
- WebKit 15.4
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 99
- Microsoft Edge 99
Версия 1.19
Обновление Playwright Test
-
Playwright Test v1.19 теперь поддерживает мягкие проверки. Неудачные мягкие проверки
не прерывают выполнение теста, а помечают его как неудачный.
// Make a few checks that will not stop the test when failed... await expect.soft(page.locator('#status')).toHaveText('Success'); await expect.soft(page.locator('#eta')).toHaveText('1 day'); // ... and continue the test to check more things. await page.locator('#next-page').click(); await expect.soft(page.locator('#title')).toHaveText('Make another order');Подробнее читайте в нашей документации
-
Теперь можно указать собственное сообщение для expect вторым аргументом функций
expectиexpect.soft, например:await expect(page.locator('text=Name'), 'should be logged in').toBeVisible();Ошибка будет выглядеть так:
Error: should be logged in Call log: - expect.toBeVisible with timeout 5000ms - waiting for "getByText('Name')" 2 | 3 | test('example test', async({ page }) => { > 4 | await expect(page.locator('text=Name'), 'should be logged in').toBeVisible(); | ^ 5 | }); 6 |Подробнее читайте в нашей документации
-
По умолчанию тесты в одном файле выполняются по порядку. Если в одном файле у вас много независимых тестов, теперь их можно запускать параллельно с помощью test.describe.configure().
Другие обновления
-
Теперь Locator поддерживает параметр
has, который проверяет, что внутри него находится другой locator:await page.locator('article', { has: page.locator('.highlight'), }).click();Подробнее читайте в документации по locator
-
Новый метод locator.page()
-
page.screenshot() и locator.screenshot() теперь автоматически скрывают мигающий текстовый курсор
-
Playwright Codegen теперь генерирует локаторы и локаторы фреймов
-
Новая опция
urlв testConfig.webServer, позволяющая убедиться, что веб-сервер готов к запуску тестов -
Новые свойства testInfo.errors и testResult.errors, содержащие все неудачные проверки, в том числе мягкие.
Потенциально несовместимое изменение в глобальной настройке Playwright Test
Маловероятно, что это изменение вас затронет. Ничего делать не нужно, если ваши тесты продолжают выполняться как раньше.
Мы заметили, что в редких случаях набор тестов для запуска настраивался в глобальной настройке с помощью переменных среды. Также мы заметили приложения, которые обрабатывали результаты репортёров после выполнения в глобальной очистке. Если вы делаете что-либо из этого, узнайте подробнее
Версии браузеров
- Chromium 100.0.4863.0
- Mozilla Firefox 96.0.1
- WebKit 15.4
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 98
- Microsoft Edge 98
Версия 1.18
Улучшения Locator
-
Теперь каждый locator можно при необходимости отфильтровать по содержащемуся в нём тексту:
await page.locator('li', { hasText: 'my item' }).locator('button').click();Подробнее читайте в документации по locator
Улучшения API тестирования
Улучшенная поддержка TypeScript
- Playwright Test теперь учитывает параметры
tsconfig.jsonbaseUrlиpaths, поэтому можно использовать псевдонимы - Добавлена переменная среды
PW_EXPERIMENTAL_TS_ESM, позволяющая импортировать модули ESM в код TS без этапа компиляции. Не забывайте добавлять суффикс.jsпри импорте модулей ESM. Запускайте тесты следующим образом:
npm i --save-dev @playwright/test@1.18.0-rc1 PW_EXPERIMENTAL_TS_ESM=1 npx playwright test
Create Playwright
Команда npm init playwright теперь доступна всем:
# Run from your project's root directory npm init playwright@latest # Or create a new project npm init playwright@latest new-project
Она создаст файл конфигурации Playwright Test, при необходимости добавит примеры, рабочий процесс GitHub Actions и первый тест example.spec.ts.
Новые API и изменения
- новый API
testCase.repeatEachIndex -
для параметра
acceptDownloadsтеперь по умолчанию используется значениеtrue
Несовместимое изменение: пользовательские параметры конфигурации
Пользовательские параметры конфигурации — это удобный способ задавать разные значения для проектов. Подробнее см. в этом руководстве.
Ранее любую фикстуру, добавленную с помощью test.extend(), можно было переопределить в разделе конфигурации testProject.use. Например:
// WRONG: THIS SNIPPET DOES NOT WORK SINCE v1.18.
// fixtures.js
const test = base.extend({
myParameter: 'default',
});
// playwright.config.js
module.exports = {
use: {
myParameter: 'value',
},
}; Чтобы сделать фикстуру параметризуемой в файле конфигурации, нужно указать option: true при ее определении. Например:
// CORRECT: THIS SNIPPET WORKS SINCE v1.18.
// fixtures.js
const test = base.extend({
// Fixtures marked as "option: true" will get a value specified in the config,
// or fallback to the default value.
myParameter: ['default', { option: true }],
});
// playwright.config.js
module.exports = {
use: {
myParameter: 'value',
},
}; Версии браузеров
- Chromium 99.0.4812.0
- Mozilla Firefox 95.0
- WebKit 15.4
Эта версия также тестировалась со следующими стабильными каналами:
- Google Chrome 97
- Microsoft Edge 97
Версия 1.17
Локаторы фреймов
В Playwright 1.17 появились локаторы фреймов — локаторы для iframe на странице. Локаторы фреймов сохраняют логику, достаточную для получения iframe и последующего поиска элементов в этом iframe. По умолчанию локаторы фреймов работают в строгом режиме, ожидают появления iframe и могут использоваться в проверках Web-First.
Локаторы фреймов можно создать с помощью метода page.frameLocator() или locator.frameLocator().
const locator = page.frameLocator('#my-iframe').locator('text=Submit');
await locator.click(); Подробнее см. в нашей документации.
Обновление Trace Viewer
Теперь Playwright Trace Viewer доступен онлайн по адресу https://trace.playwright.dev! Просто перетащите файл trace.zip, чтобы просмотреть его содержимое.
ПРИМЕЧАНИЕ: файлы трассировки никуда не загружаются; trace.playwright.dev — это прогрессивное веб-приложение, которое обрабатывает трассировки локально.
- Теперь трассировки Playwright Test по умолчанию включают исходный код (это можно отключить с помощью параметра tracing)
- Теперь Trace Viewer показывает имя теста
- Новая вкладка с метаданными трассировки и сведениями о браузере
- Теперь снимки содержат адресную строку
Обновление HTML-отчета
- Теперь HTML-отчет поддерживает динамическую фильтрацию
- Теперь отчет представляет собой один статический HTML-файл, который можно отправить по электронной почте или прикрепить к сообщению в Slack.
Поддержка Ubuntu ARM64 и не только
-
Теперь Playwright поддерживает Ubuntu 20.04 ARM64. Теперь можно запускать тесты Playwright в Docker на Apple M1 и Raspberry Pi.
-
Теперь с помощью Playwright можно установить стабильную версию Edge в Linux:
npx playwright install msedge
Новые API
- Теперь трассировка поддерживает параметр
'title' - Для навигации по страницам доступен новый параметр ожидания
'commit' - В HTML-репортер добавлены новые параметры конфигурации
- параметр
testConfig.snapshotDir testInfo.parallelIndextestInfo.titlePath-
для
testOptions.traceдобавлены новые параметры -
expect.toMatchSnapshotподдерживает вложенные каталоги reporter.printsToStdio()
Версия 1.16
🎭 Playwright Test
Тестирование API
В Playwright 1.16 появилось новое средство тестирования API, позволяющее отправлять запросы непосредственно на сервер из Node.js! Теперь вы можете:
- тестировать API сервера
- подготавливать состояние на стороне сервера перед посещением веб-приложения в тесте
- проверять конечные условия на стороне сервера после выполнения действий в браузере
Чтобы выполнить запрос от имени страницы Playwright, используйте новый API page.request:
import { test, expect } from '@playwright/test';
test('context fetch', async ({ page }) => {
// Do a GET request on behalf of page
const response = await page.request.get('http://example.com/foo.json');
// ...
}); Чтобы выполнить отдельный запрос к конечной точке API из node.js, используйте новую фикстуру request:
import { test, expect } from '@playwright/test';
test('context fetch', async ({ request }) => {
// Do a GET request on behalf of page
const response = await request.get('http://example.com/foo.json');
// ...
}); Подробнее см. в нашем руководстве по тестированию API.
Перехват ответов
Теперь можно перехватывать ответы, сочетая тестирование API с перехватом запросов.
Например, можно размыть все изображения на странице:
import { test, expect } from '@playwright/test';
import jimp from 'jimp'; // image processing library
test('response interception', async ({ page }) => {
await page.route('**/*.jpeg', async route => {
const response = await page._request.fetch(route.request());
const image = await jimp.read(await response.body());
await image.blur(5);
await route.fulfill({
response,
body: await image.getBufferAsync('image/jpeg'),
});
});
const response = await page.goto('https://playwright.dev');
expect(response.status()).toBe(200);
}); Подробнее о перехвате ответов.
Новый HTML-репортер
Попробуйте новый HTML-репортер, добавив --reporter=html или запись reporter в файл playwright.config.ts:
$ npx playwright test --reporter=html
HTML-репортер содержит всю информацию о тестах и их сбоях, включая трассировки и графические артефакты.
Подробнее см. о наших репортерах.
🎭 Библиотека Playwright
locator.waitFor
Ожидает, пока локатор не будет указывать на один элемент в заданном состоянии. По умолчанию используется state: 'visible'.
Особенно удобно при работе со списками:
import { test, expect } from '@playwright/test';
test('context fetch', async ({ page }) => {
const completeness = page.locator('text=Success');
await completeness.waitFor();
expect(await page.screenshot()).toMatchSnapshot('screen.png');
}); Подробнее см. о locator.waitFor().
Поддержка Arm64 в Docker
Теперь образ Playwright для Docker публикуется для Arm64, поэтому его можно использовать на устройствах Apple Silicon.
Подробнее см. о интеграции с Docker.
🎭 Playwright Trace Viewer
- проверки Web-First в Trace Viewer
- запуск Trace Viewer с помощью
npx playwright show-traceи перетаскивание файлов трассировки в PWA Trace Viewer - интеграция тестирования API с Trace Viewer
- улучшенное визуальное обозначение целей действий
Подробнее см. о Trace Viewer.
Версии браузеров
- Chromium 97.0.4666.0
- Mozilla Firefox 93.0
- WebKit 15.4
Эта версия Playwright также тестировалась со следующими стабильными каналами:
- Google Chrome 94
- Microsoft Edge 94
Версия 1.15
🎭 Библиотека Playwright
🖱️ Колесо мыши
С помощью mouse.wheel() теперь можно прокручивать страницу по вертикали и горизонтали.
📜 Новый API заголовков
Ранее получить несколько значений заголовков ответа было невозможно. Теперь это возможно, а также доступны дополнительные вспомогательные функции:
- request.allHeaders()
- request.headersArray()
- request.headerValue()
- response.allHeaders()
- response.headersArray()
- response.headerValue()
- response.headerValues()
🌈 Эмуляция Forced-Colors
Теперь можно эмулировать CSS-медиавозможность forced-colors, передав ее в browser.newContext() или вызвав page.emulateMedia().
Новые API
-
page.route() принимает новый параметр
times, задающий количество совпадений для этого маршрута. - Добавлены page.setChecked() и locator.setChecked() для установки состояния флажка.
- request.sizes() возвращает сведения о размере ресурса для указанного HTTP-запроса.
- tracing.startChunk() — начинает новый фрагмент трассировки.
- tracing.stopChunk() — останавливает новый фрагмент трассировки.
🎭 Playwright Test
🤝 test.parallel() запускать тесты в одном файле параллельно
test.describe.parallel('group', () => {
test('runs in parallel 1', async ({ page }) => {
});
test('runs in parallel 2', async ({ page }) => {
});
}); По умолчанию тесты в одном файле выполняются последовательно. Если в одном файле есть много независимых тестов, теперь их можно запускать параллельно с помощью test.describe.parallel(title, callback).
🛠 Добавлен флаг CLI --debug
Использование npx playwright test --debug включает Playwright Inspector, чтобы вы могли отлаживать тесты.
Версии браузеров
- Chromium 96.0.4641.0
- Mozilla Firefox 92.0
- WebKit 15.0
Версия 1.14
🎭 Библиотека Playwright
⚡️ Новый режим «strict»
Неоднозначность селекторов — распространенная проблема при автоматизированном тестировании. Режим «strict» гарантирует, что селектор указывает на один элемент, и в противном случае вызывает ошибку.
Чтобы включить этот режим, передайте strict: true в вызовы действий.
// This will throw if you have more than one button!
await page.click('button', { strict: true }); 📍 Новый API локаторов
Локатор представляет собой представление элемента (или элементов) на странице. Он содержит логику, достаточную для получения элемента в любой момент времени.
Разница между Locator и ElementHandle заключается в том, что последний указывает на конкретный элемент, а Locator содержит логику получения этого элемента.
Кроме того, по умолчанию локаторы являются «строгими»!
const locator = page.locator('button');
await locator.click(); Подробнее см. в документации.
🧩 Экспериментальные механизмы выбора элементов для React и Vue
Селекторы React и Vue позволяют выбирать элементы по имени компонента и/или значениям свойств. Синтаксис очень похож на селекторы атрибутов и поддерживает все операторы селекторов атрибутов.
await page.locator('_react=SubmitButton[enabled=true]').click();
await page.locator('_vue=submit-button[enabled=true]').click(); Подробнее см. в документации по селекторам React и документации по селекторам Vue.
✨ Новые механизмы выбора элементов nth и visible
-
Механизм выбора элементов
nthэквивалентен псевдоклассу:nth-match, но может сочетаться с другими механизмами выбора элементов. -
Механизм выбора элементов
visibleэквивалентен псевдоклассу:visible, но может сочетаться с другими механизмами выбора элементов.
// select the first button among all buttons
await button.click('button >> nth=0');
// or if you are using locators, you can use first(), nth() and last()
await page.locator('button').first().click();
// click a visible button
await button.click('button >> visible=true'); 🎭 Playwright Test
✅ Проверки с автоматическим ожиданием
expect теперь поддерживает множество новых проверок с автоматическим ожиданием.
Рассмотрим следующий пример:
await expect(page.locator('.status')).toHaveText('Submitted'); Playwright Test будет повторно искать узел по селектору .status, пока полученный узел не будет содержать текст "Submitted". Узел будет извлекаться и проверяться снова и снова, пока условие не будет выполнено или не истечёт время ожидания. Это время ожидания можно передать напрямую или задать один раз с помощью значения testProject.expect в конфигурации тестов.
По умолчанию для проверок время ожидания не задано, поэтому они будут выполняться бесконечно, пока не истечёт время ожидания всего теста.
Список всех новых проверок:
expect(locator).toBeChecked()expect(locator).toBeDisabled()expect(locator).toBeEditable()expect(locator).toBeEmpty()expect(locator).toBeEnabled()expect(locator).toBeFocused()expect(locator).toBeHidden()expect(locator).toBeVisible()expect(locator).toContainText(text, options?)expect(locator).toHaveAttribute(name, value)expect(locator).toHaveClass(expected)expect(locator).toHaveCount(count)expect(locator).toHaveCSS(name, value)expect(locator).toHaveId(id)expect(locator).toHaveJSProperty(name, value)expect(locator).toHaveText(expected, options)expect(page).toHaveTitle(title)expect(page).toHaveURL(url)expect(locator).toHaveValue(value)
⛓ Последовательный режим с describe.serial
Объявляет группу тестов, которые всегда должны выполняться последовательно. Если один из тестов завершается с ошибкой, все последующие тесты пропускаются. Все тесты в группе повторно запускаются вместе.
test.describe.serial('group', () => {
test('runs first', async ({ page }) => { /* ... */ });
test('runs second', async ({ page }) => { /* ... */ });
}); Подробнее см. в документации.
🐾 API шагов с test.step
Разделяйте длинные тесты на несколько шагов с помощью API test.step():
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await test.step('Log in', async () => {
// ...
});
await test.step('news feed', async () => {
// ...
});
}); Информация о шагах доступна через API репортёров.
🌎 Запуск веб-сервера перед выполнением тестов
Чтобы запустить сервер во время тестов, используйте параметр webServer в файле конфигурации. Перед запуском тестов сервер будет ждать, пока указанный URL станет доступен; этот URL будет передан Playwright в качестве baseURL при создании контекста.
import { defineConfig } from '@playwright/test';
export default defineConfig({
webServer: {
command: 'npm run start', // command to launch
url: 'http://127.0.0.1:3000', // url to await for
timeout: 120 * 1000,
reuseExistingServer: !process.env.CI,
},
}); Подробнее см. в документации.
Версии браузеров
- Chromium 94.0.4595.0
- Mozilla Firefox 91.0
- WebKit 15.0
Версия 1.13
Playwright Test
- ⚡️ Представляем API репортёров, уже используемый для создания репортёра Allure для Playwright.
-
⛺️ Новая фикстура
baseURLдля поддержки относительных путей в тестах.
Playwright
- 🖖 Поддержка перетаскивания элементов средствами API через API page.dragAndDrop().
-
🔎 Улучшенный HAR с указанием размеров тел запросов и ответов. Используйте параметр
recordHarв browser.newContext().
Инструменты
- В средстве просмотра трассировок Playwright теперь отображаются параметры, возвращаемые значения и вызовы
console.log(). - Инспектор Playwright может создавать тесты Playwright Test.
Новые и обновлённые руководства
- Введение
- Аутентификация
- Расширения Chrome
- Аннотации Playwright Test
- Конфигурация Playwright Test
- Фикстуры Playwright Test
Версии браузеров
- Chromium 93.0.4576.0
- Mozilla Firefox 90.0
- WebKit 14.2
Новые API Playwright
- новый параметр
baseURLв browser.newContext() и browser.newPage() - response.securityDetails() и response.serverAddr()
- page.dragAndDrop() и frame.dragAndDrop()
- download.cancel()
- page.inputValue(), frame.inputValue() и elementHandle.inputValue()
- новый параметр
forceв page.fill(), frame.fill() и elementHandle.fill() - новый параметр
forceв page.selectOption(), frame.selectOption() и elementHandle.selectOption()
Версия 1.12
⚡️ Представляем Playwright Test
Playwright Test — это новый модуль запуска тестов, созданный командой Playwright с нуля специально для нужд сквозного тестирования:
- Запуск тестов во всех браузерах.
- Параллельное выполнение тестов.
- Изоляция контекстов и разумные настройки по умолчанию из коробки.
- Сохранение видео, снимков экрана и других артефактов при сбое.
- Интеграция ваших POM в качестве расширяемых фикстур.
Установка:
npm i -D @playwright/test
Простой тест tests/foo.spec.ts:
import { test, expect } from '@playwright/test';
test('basic test', async ({ page }) => {
await page.goto('https://playwright.dev/');
const name = await page.innerText('.navbar__title');
expect(name).toBe('Playwright');
}); Запуск:
npx playwright test
👉 Подробнее см. в документации Playwright Test.
🧟♂️ Представляем средство просмотра трассировок Playwright
Средство просмотра трассировок Playwright — это новый графический инструмент, который помогает изучать записанные трассировки Playwright после выполнения скрипта. Трассировки Playwright позволяют просматривать:
- DOM страницы до и после каждого действия Playwright
- отрисовку страницы до и после каждого действия Playwright
- сетевую активность браузера во время выполнения скрипта
Трассировки записываются с помощью нового API browserContext.tracing:
const browser = await chromium.launch();
const context = await browser.newContext();
// Start tracing before creating / navigating a page.
await context.tracing.start({ screenshots: true, snapshots: true });
const page = await context.newPage();
await page.goto('https://playwright.dev');
// Stop tracing and export it into a zip archive.
await context.tracing.stop({ path: 'trace.zip' }); Трассировки просматриваются позднее с помощью CLI Playwright:
npx playwright show-trace trace.zip
Откроется следующее графическое окно:
👉 Подробнее см. в документации по средству просмотра трассировок.
Версии браузеров
- Chromium 93.0.4530.0
- Mozilla Firefox 89.0
- WebKit 14.2
Эта версия Playwright также тестировалась со следующими стабильными каналами выпуска:
- Google Chrome 91
- Microsoft Edge 91
Новые API
-
параметр
reducedMotionв page.emulateMedia(), browserType.launchPersistentContext(), browser.newContext() и browser.newPage() - browserContext.on('request')
- browserContext.on('requestfailed')
- browserContext.on('requestfinished')
- browserContext.on('response')
-
параметр
tracesDirв browserType.launch() и browserType.launchPersistentContext() - новое пространство имён API browserContext.tracing
- новый метод download.page()
Версия 1.11
🎥 Новое видео: Playwright: новая платформа автоматизации тестирования для современного веба (слайды)
- Мы рассказали о Playwright
- Показали, как устроена работа инженеров за кулисами
- Провели демонстрации новых функций в прямом эфире ✨
- Особая благодарность компании applitools за организацию мероприятия и приглашение!
Версии браузеров
- Chromium 92.0.4498.0
- Mozilla Firefox 89.0b6
- WebKit 14.2
Новые API
- поддержка асинхронных предикатов во всех API, в том числе в таких методах, как page.waitForRequest() и других
- новые устройства для эмуляции: Galaxy S8, Galaxy S9+, Galaxy Tab S4, Pixel 3, Pixel 4
- новые методы:
- page.waitForURL() для ожидания перехода на URL
- video.delete() и video.saveAs() для управления записью экрана
- новые параметры:
-
параметр
screenв методе browser.newContext() для эмуляции размеровwindow.screen -
параметр
positionв методах page.check() и page.uncheck() -
параметр
trialдля пробного запуска действий в методах page.check(), page.uncheck(), page.click(), page.dblclick(), page.hover() и page.tap()
-
параметр
Версия 1.10
- Playwright для Java v1.10 теперь стабилен!
- Запускайте Playwright в стабильных каналах Google Chrome и Microsoft Edge с помощью нового API каналов.
- Создание скриншотов Chromium на Mac и Windows стало быстрее.
Входящие в комплект версии браузеров
- Chromium 90.0.4430.0
- Mozilla Firefox 87.0b10
- WebKit 14.2
Эта версия Playwright также тестировалась со следующими стабильными каналами:
- Google Chrome 89
- Microsoft Edge 89
Новые API
-
browserType.launch() теперь принимает новый параметр
'channel'. Подробнее читайте в нашей документации.
Версия 1.9
-
Инспектор Playwright — это новый инструмент с графическим интерфейсом для написания и отладки тестов.
- Пошаговая отладка скриптов Playwright с возможностью запуска, приостановки и пошагового выполнения.
- Создавайте новые скрипты, записывая действия пользователя.
- Создавайте селекторы элементов для скрипта, наводя курсор на элементы.
- Задайте переменную окружения
PWDEBUG=1для запуска инспектора
- Приостанавливайте выполнение скрипта с помощью page.pause() в режиме с отображением браузера. Приостановка страницы запускает инспектор Playwright для отладки.
-
Новый псевдокласс has-text для CSS-селекторов.
:has-text("example")соответствует любому элементу, содержащему"example"где-либо внутри, в том числе во вложенном или дочернем элементе. См. другие примеры. -
Диалоговые окна страниц теперь закрываются автоматически во время выполнения, если только не настроен обработчик события
dialog. Подробнее. - Playwright для Python теперь стабилен и предлагает идиоматичный API в snake_case, а также готовый образ Docker для запуска тестов в CI/CD.
Версии браузеров
- Chromium 90.0.4421.0
- Mozilla Firefox 86.0b10
- WebKit 14.1
Новые API
Версия 1.8
-
Выбор элементов на основе их расположения с помощью
:left-of(),:right-of(),:above()и:below(). -
Теперь Playwright включает интерфейс командной строки, ранее называвшийся playwright-cli.
npx playwright --help
-
Теперь page.selectOption() ожидает появления параметров.
-
Новые методы для проверки состояния элемента, например page.isEditable().
Новые API
- elementHandle.isChecked().
- elementHandle.isDisabled().
- elementHandle.isEditable().
- elementHandle.isEnabled().
- elementHandle.isHidden().
- elementHandle.isVisible().
- page.isChecked().
- page.isDisabled().
- page.isEditable().
- page.isEnabled().
- page.isHidden().
- page.isVisible().
- Новый параметр
'editable'в elementHandle.waitForElementState().
Версии браузеров
- Chromium 90.0.4392.0
- Mozilla Firefox 85.0b5
- WebKit 14.1
Версия 1.7
- Новый SDK для Java: Playwright для Java теперь не уступает привязкам для JavaScript, Python и .NET.
- API хранилища браузера: новые удобные API для сохранения и загрузки состояния хранилища браузера (файлов cookie, локального хранилища), упрощающие сценарии автоматизации с аутентификацией.
- Новые CSS-селекторы: мы учли ваши пожелания о более гибких селекторах и обновили их реализацию. В Playwright 1.7 появились новые расширения CSS, и скоро появятся новые.
- Новый сайт: сайт документации playwright.dev обновлён и теперь создан с помощью Docusaurus.
- Поддержка Apple Silicon: двоичные файлы браузеров Playwright для WebKit и Chromium теперь собраны для Apple Silicon.
Новые API
- browserContext.storageState() для получения текущего состояния с целью его повторного использования в дальнейшем.
-
параметр
storageStateв методах browser.newContext() и browser.newPage() для настройки состояния контекста браузера.
Версии браузеров
- Chromium 89.0.4344.0
- Mozilla Firefox 84.0b9
- WebKit 14.1
© 2026 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/release-notes