Spec-Zone.ru › Playwright

Примечания к выпуску

Версия 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 предоставляет единый интерфейс для захвата содержимого страницы, включая:

  • Запись экрана
  • Аннотации действий
  • Визуальные наложения
  • Захват кадров в реальном времени
  • Видеоподтверждения действий агента
Demo

Запись экрана — записывайте видео с точным управлением началом и остановкой в качестве альтернативы параметру 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, чтобы проверять страницы в фоновых браузерах.
Demo
  • 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-отчета теперь отображается временная шкала:

Timeline chart in the HTML report

Улучшения режима 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:

Speedboard

Здесь отображаются все выполненные тесты, отсортированные по времени выполнения. Это поможет понять, какие тесты выполняются дольше ожидаемого. Загляните туда — возможно, вы обнаружите тесты, которые тратят на ожидание больше времени, чем нужно!

Chrome for Testing​

Теперь Playwright работает со сборками Chrome for Testing, а не Chromium. В оконном режиме используется chrome, а в безголовом режиме — chrome-headless-shell. После обновления до версии 1.57 существующие тесты должны продолжить работать.

Мы не ожидаем функциональных изменений в результате этого перехода. Самое заметное изменение — новый значок и название на панели инструментов.

new and old logo

Если вы все же заметите неожиданное изменение поведения, создайте задачу.

В 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 отображают и сравнивают input placeholder
  • В процессы-воркеры 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-репортере:

    New Trace Viewer Steps
  • Новая опция репортера '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 с сообщением об ошибке и полезным контекстом для её исправления.

Copy prompt

Фильтрация видимых элементов​

Новая опция 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-отчёте, если она доступна:

Git information in the report

Улучшения шагов теста​

В шагах теста теперь доступен новый объект 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;
  • улучшенное отображение параметров строки запроса;
  • предварительный просмотр шрифтов.
Network tab now has filters

Параметр командной строки --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​

Playwright UI Mode
  • Теги отображаются в списке тестов.
  • Чтобы отфильтровать тесты по тегам, введите @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​

Обновление генератора тестов​

Playwright Test Generator

Новые инструменты для создания проверок:

  • Инструмент «Проверить видимость» генерирует 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​

  • expect(locator).toHaveAttribute()

Версии браузеров​

  • Chromium 119.0.6045.9
  • Mozilla Firefox 118.0.1
  • WebKit 17.4

Эта версия также прошла тестирование в следующих стабильных каналах:

  • Google Chrome 118
  • Microsoft Edge 118

Версия 1.38​

Обновления режима UI​

Playwright UI Mode
  1. Масштабирование временного диапазона.
  2. Обновлённая панель сети.

Новые 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 выполните следующие действия:

  1. Добавьте новый репортёр "blob" в конфигурацию при запуске в CI:

    export default defineConfig({
      testDir: './tests',
      reporter: process.env.CI ? 'blob' : 'html',
    });

    Репортёр "blob" создаёт файлы ".zip", содержащие всю информацию о запуске тестов.

  2. Скопируйте все отчёты "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»:

    Playwright UI Mode
  • Режим UI и просмотрщик трассировок отмечают сетевые запросы, обработанные обработчиками page.route() и browserContext.route(), а также запросы, отправленные через тестирование API:

    Trace Viewer
  • Новый параметр 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. Поэтому, если вы используете CLI playwright-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 теперь отображаются шаги, фикстуры и вложения:

    UI Mode attachments
  • Новое свойство 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 позволяет изучать, запускать и отлаживать тесты. В него встроен режим наблюдения.

Playwright UI Mode

Запустите его с помощью нового флага --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. Можно запустить тест, установить курсор в конец теста и продолжить его создание.
New VSCode Extension
  • Интерактивные локаторы в VSCode. Наводите курсор на локаторы и редактируйте их в VSCode, чтобы они подсвечивались в открытом браузере.
  • Интерактивные локаторы в CodeGen. Создавайте локатор для любого элемента на странице с помощью инструмента «Исследовать».
Locator Explorer
  • Тёмная тема в Codegen и просмотрщике трассировок. Тема автоматически выбирается в соответствии с настройками операционной системы.
Dark Theme

Средство запуска тестов​

  • Настройте количество повторных попыток и тайм-аут теста для файла или теста с помощью 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​

  • locator.blur()
  • locator.clear()
  • android.launchServer() и android.connect()
  • androidDevice.on('close')

Версии браузеров​

  • 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​

  • Наблюдайте за запуском тестов в реальном времени и оставляйте инструменты разработчика открытыми.
  • Выберите селектор.
  • Запишите новый тест на основе текущего состояния страницы.
vscode extension screenshot

Средство запуска тестов​

  • 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 для JavaScript mcr.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.dragTo()

  • expect(locator).toBeChecked({ checked })

  • Теперь каждый locator можно при необходимости отфильтровать по содержащемуся в нём тексту:

    await page.locator('li', { hasText: 'my item' }).locator('button').click();

    Подробнее читайте в документации по locator

Улучшения API тестирования​

  • expect(response).toBeOK()
  • testInfo.attach()
  • test.info()

Улучшенная поддержка TypeScript​

  1. Playwright Test теперь учитывает параметры tsconfig.json baseUrl и paths, поэтому можно использовать псевдонимы
  2. Добавлена переменная среды 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.

Graphics

Локаторы фреймов можно создать с помощью метода 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 показывает имя теста
  • Новая вкладка с метаданными трассировки и сведениями о браузере
  • Теперь снимки содержат адресную строку
image

Обновление HTML-отчета​

  • Теперь HTML-отчет поддерживает динамическую фильтрацию
  • Теперь отчет представляет собой один статический HTML-файл, который можно отправить по электронной почте или прикрепить к сообщению в Slack.
image

Поддержка 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.parallelIndex
  • testInfo.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-репортер содержит всю информацию о тестах и их сбоях, включая трассировки и графические артефакты.

html reporter

Подробнее см. о наших репортерах.

🎭 Библиотека 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

Откроется следующее графическое окно:

image

👉 Подробнее см. в документации по средству просмотра трассировок.

Версии браузеров​

  • 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​

  • page.pause().

Версия 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API