Spec-Zone.ru › Playwright

Примечания к релизу

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

Новый бесголовый режим, с другой стороны, — это настоящий браузер Chrome, и поэтому он более достоверен, надёжен и предлагает больше функций. Это делает его более подходящим для высокоточного тестирования веб-приложений по принципу «конец-конец» или тестирования расширений браузера.

См. вопрос #33566 для списка возможных проблем, с которыми вы можете столкнуться, и более подробной информации о бесголовом Chromium. Пожалуйста, создайте вопрос, если вы увидите какие-либо проблемы после включения.

import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'], channel: 'chromium' },
    },
  ],
});

Разное​

  • <canvas> элементы внутри снимка теперь отображают предварительный просмотр.
  • Новый метод 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​

Улучшения вкладки «Сеть»​

Вкладка «Сеть» в режиме пользовательского интерфейса и представлении трассировки претерпела ряд улучшений:

  • фильтрация по типу актива и 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 в качестве параметров запроса​

Теперь вы можете передавать URLSearchParams и string в качестве параметров запроса в APIRequestContext:

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 Client Authentication.

Следующий фрагмент кода настраивает сертификат клиента для 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().

--only-changed опция командной строки​

Новая опция командной строки --only-changed будет запускать только те файлы тестов, которые были изменены с последней коммита в git или со специфической "ref" git. Это также запустит все файлы тестов, которые импортируют любые изменённые файлы.

# 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.

Разное​

  • Новая опция maxRetries в apiRequestContext.fetch(), которая повторно пытается выполнить запрос при сетевой ошибке 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');

См. руководство по часам для получения дополнительной информации.

Запуск тестов​

  • Новая опция командной строки --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 шаблонам, при поиске тестов.

  • Новое свойство 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. Эта клавиша соответствует Meta на macOS и соответствует Control на Windows и Linux.

    // 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 параметр.

Командная строка

  • --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() теперь поддерживает фильтры для удаления только некоторых куки.

    // 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 консоли.
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() теперь возвращают ошибку при неудачных и отменённых загрузках.
  • Изображение Playwright Docker теперь поставляется с 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();
});

Скрыть детали реализации: шаги тестовых блоков​

Вы можете отметить шаг test.step() как «заключенный в блок», чтобы ошибки внутри него указывали на место вызова шага.

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.

Устаревшие методы​

  • Следующие методы устарели: page.type(), frame.type(), locator.type() и elementHandle.type(). Используйте locator.fill(), он намного быстрее. Используйте locator.pressSequentially() только если на странице используется специальная обработка клавиатуры, и вам нужно нажимать клавиши по одной.

Изменения, вносящие разрыв совместимости: Playwright больше не загружает браузеры автоматически​

Примечание: Если вы используете @playwright/test пакет, это изменение вас не затронет.

Playwright рекомендует использовать @playwright/test пакет и загружать браузеры с помощью команды npx playwright install. Если вы следуете этой рекомендации, ничего не изменилось.

Однако, до версии 1.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 теперь учитывает зависимости проекта. Вы можете управлять зависимостями, которые нужно учитывать, отмечая/сняв флажки в списке проектов.
  • Логи консоли из теста теперь отображаются во вкладке Консоль.

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

  • 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 теперь доступен в расширении VSCode Playwright через новую кнопку «Показать просмотр трассировки»:

    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
    });
  • Новая команда uninstall CLI для удаления библиотек браузера:

    $ 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. Поэтому, если вы используете команду playwright-core CLI, убедитесь, что обновили имя:

    $ 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 для указания проекта, который необходимо запустить после завершения этого и всех зависимых проектов. Разборка полезна для очистки любых ресурсов, полученных этим проектом.

    Распространенным шаблоном была бы зависимость 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() для создания локатора, соответствующего любому из двух локаторов. Рассмотрим сценарий, в котором вы хотите нажать кнопку «Новый email», но вместо этого иногда появляется диалоговое окно настроек безопасности. В этом случае вы можете дождаться либо кнопки «Новый email», либо диалогового окна и действовать соответственно:

    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(), который гарантирует, что элемент и прикреплён, и видимый.

Новые 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().

⚠️ Разрыв совместимости в тестах компонентов​

Примечание: только для тестов компонентов, не влияет на тесты end-to-end.

  • @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 наблюдателя пересечения.

    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</div>
      <option value="green">Green</div>
      <option value="blue">Blue</div>
    </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() теперь поддерживает значения сериализуемые.

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

  • 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. Сгенерировать локетор для любого элемента на странице с помощью инструмента "Explore".

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

  • Как было объявлено в v1.25, Ubuntu 18 больше не будет поддерживаться с декабря 2022 года. Кроме того, обновлений WebKit для Ubuntu 18 не будет начиная со следующего выпуска Playwright.

Изменения поведения​

  • 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() теперь проникает через тенированные корни.
  • Новый параметр 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 это ожидание всех фреймов iframes для запуска события DOMContentLoaded.

В соответствии со спецификацией веб-стандартов, значение 'domcontentloaded' ожидает, только что целевой фрейм запустит событие 'DOMContentLoaded'. Используйте waitUntil: 'load' для ожидания запуска события во всех iframes.

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

  • 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'.

  • Включить трассировку через флаг командной строки: 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, мы рекомендуем обновление до Node.js LTS (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 | ✅ | ✅ | ✅ |

🕵️ Анонимное описание​

Теперь можно вызвать 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() также участвуют в маршрутизации и могут быть делегированы.

Обновление утверждений Web-First​

  • Новый метод expect(locator).toHaveValues(), который утверждает все выбранные значения элемента <select multiple>.
  • Методы expect(locator).toContainText() и expect(locator).toHaveText() теперь принимают параметр ignoreCase.

Обновление компонентных тестов​

  • Поддержка Vue2 с помощью пакета @playwright/experimental-ct-vue2.
  • Поддержка компонентных тестов для create-react-app с компонентами в файлах .js.

Подробнее о тестировании компонентов с помощью Playwright.

Разное​

  • Если в вашем пути есть сервис-воркер, вы теперь можете легко его отключить с помощью нового параметра контекста serviceWorkers:

    export default {
      use: {
        serviceWorkers: 'block',
      }
    };
  • Использование пути .zip для параметра контекста recordHar автоматически архивирует полученный HAR:

    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 или Svelte компоненты. Вы можете использовать все возможности 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() для фильтрации существующего селектора

    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. Используйте mcr.microsoft.com/playwright/python как изображение Docker, готовое к использованию с 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 теперь настраиваются на проект. Например, теперь можно настроить проект для тестов приёма используя grep:

    export default {
      projects: [
        {
          name: 'smoke tests',
          grep: /@smoke/,
        },
      ],
    };
  • Просмотр трассировки теперь отображает запросы API-тестирования.

  • locator.highlight() визуально выделяет элемент(ы) для более удобной отладки.

Объявления​

  • Теперь предоставляется выделенное изображение Docker для Python mcr.microsoft.com/playwright/python. Переключитесь на него, если используете Python. Это последний выпуск, включающий Python в нашем javascript mcr.microsoft.com/playwright контейнере Docker.
  • 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.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().

Другие обновления​

  • Селектор теперь поддерживает has параметр, который гарантирует, что он содержит другой селектор внутри:

    await page.locator('article', {
      has: page.locator('.highlight'),
    }).click();

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

  • Новый 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.dragTo()

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

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

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

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

Улучшения 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

Создание 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 Action и первый тестовый example.spec.ts.

Новые API и изменения​

  • новый testCase.repeatEachIndex API
  • 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 и могут использоваться в веб-первых утверждениях.

Graphics

Локаторы фреймов можно создать с помощью метода page.frameLocator() или locator.frameLocator().

const locator = page.frameLocator('#my-iframe').locator('text=Submit');
await locator.click();

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

Обновление Визуализатора трассировки​

Визуализатор трассировки Playwright теперь доступен онлайн по адресу https://trace.playwright.dev! Просто перетащите файл trace.zip , чтобы проверить его содержимое.

ПРИМЕЧАНИЕ: файлы трассировки никуда не загружаются; trace.playwright.dev - это прогрессивное веб-приложение, которое обрабатывает трассировки локально.

  • Трассировки Playwright Test теперь по умолчанию включают источники (их можно отключить с помощью опции трассировки)
  • Визуализатор трассировки теперь отображает имя теста
  • Новая вкладка метаданных трассировки с информацией о браузере
  • Снимки экрана теперь имеют адресную строку

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​

Тестирование API​

Playwright 1.16 представляет новое тестирование API, которое позволяет отправлять запросы на сервер непосредственно из Node.js! Теперь вы можете:

  • тестировать ваш API сервера
  • подготавливать состояние сервера перед посещением веб-приложения в тесте
  • валидировать пост-условия сервера после выполнения некоторых действий в браузере

Для отправки запроса от имени страницы Playwright используйте новый page.request API:

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');
  // ...
});

Для отправки автономного запроса из node.js на конечную точку API используйте новый 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().

Поддержка Docker для Arm64​

Изображение Playwright Docker теперь опубликовано для Arm64, так что его можно использовать на Apple Silicon.

Подробнее о интеграции Docker.

🎭 Визуализатор трассировки Playwright​

  • утверждения web-first внутри просмотра трассировки
  • запустить просмотр трассировки с npx playwright show-trace и перетащить файлы трассировки в PWA просмотра трассировки
  • тестирование API интегрировано с просмотром трассировки
  • лучшая визуальная привязка целей действий

Узнать больше о Просмотре трассировки.

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

  • 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.parallel() запуск тестов в одном файле параллельно​

test.describe.parallel('group', () => {
  test('runs in parallel 1', async ({ page }) => {
  });
  test('runs in parallel 2', async ({ page }) => {
  });
});

По умолчанию тесты в одном файле выполняются последовательно. Если у вас много независимых тестов в одном файле, вы можете теперь запускать их параллельно с помощью test.describe.parallel(title, callback).

🛠 Добавить --debug флаг командной строки​

Используя npx playwright test --debug вы активируете Инспектор Playwright для отладки тестов.

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

  • 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 Локаторов​

Локатор представляет собой представление к элементу(ам) на странице. Он сохраняет логику, достаточную для извлечения элемента в любой момент времени.

Разница между Локатором и ElementHandle заключается в том, что последний указывает на конкретный элемент, а Локатор сохраняет логику извлечения этого элемента.

Кроме того, локаторы по умолчанию работают в режиме "strict"!

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​

✅ Веб-утверждения​

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 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, специально для нужд end-to-end тестирования:

  • Выполнение тестов на всех браузерах.
  • Параллельное выполнение тестов.
  • Изоляция контекстов и разумные значения по умолчанию.
  • Запись видео, снимков экрана и других артефактов при ошибках.
  • Интеграция ваших 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 — новый инструмент GUI, который помогает изучить записанные трассировки 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' });

Трассировки анализируются позже с помощью Playwright CLI:

npx playwright show-trace trace.zip

Это откроет следующее GUI:

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 — новый инструмент GUI для создания и отладки ваших тестов.
    • Построчная отладка ваших скриптов 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​

  • Новый Java SDK: Playwright для Java теперь соответствует JavaScript, Python и .NET bindings.
  • API хранения браузера: Новые удобные API для сохранения и загрузки состояния хранилища браузера (куки, локальное хранилище) для упрощения сценариев автоматизации с аутентификацией.
  • Новые селекторы 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

© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/release-notes

Spec-Zone.ru

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