Перейти к основному содержимому

Release Notes

Версия 1.51

Основные моменты

  • Новая опция IndexedDB для BrowserContext.StorageStateAsync() позволяет сохранять и восстанавливать содержимое IndexedDB. Полезно, когда ваше приложение использует IndexedDB API для хранения токенов аутентификации, таких как Firebase Authentication.

    Вот пример, следующий руководству по аутентификации:

    // Сохраните состояние хранилища в файл. Убедитесь, что IndexedDB включен.
    await context.StorageStateAsync(new()
    {
    Path = "../../../playwright/.auth/state.json",
    IndexedDB = true
    });

    // Создайте новый контекст с сохраненным состоянием хранилища.
    var context = await browser.NewContextAsync(new()
    {
    StorageStatePath = "../../../playwright/.auth/state.json"
    });
  • Новая опция Visible для Locator.Filter() позволяет выбирать только видимые элементы.

    // Игнорировать невидимые элементы списка дел.
    var todoItems = Page.GetByTestId("todo-item").Filter(new() { Visible = true });
    // Убедитесь, что их ровно 3 видимых.
    await Expect(todoItems).ToHaveCountAsync(3);
  • Новая опция Contrast для методов Page.EmulateMediaAsync() и Browser.NewContextAsync() позволяет эмулировать медиа-функцию prefers-contrast.

  • Новая опция FailOnStatusCode заставляет все запросы, выполненные через APIRequestContext, выбрасывать исключение при кодах ответа, отличных от 2xx и 3xx.

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

  • Chromium 134.0.6998.35
  • Mozilla Firefox 135.0
  • WebKit 18.4

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

  • Google Chrome 133
  • Microsoft Edge 133

Версия 1.50

Поддержка Xunit

Разное

Обновления интерфейса

  • Новая кнопка в Codegen для выбора элементов для создания снимков aria.
  • Дополнительные детали (например, нажатые клавиши) теперь отображаются вместе с вызовами API действий в трассах.
  • Отображение содержимого canvas в трассах является ошибочным. Отображение теперь отключено по умолчанию и может быть включено через настройку интерфейса Display canvas content.
  • Панели Call и Network теперь отображают дополнительную информацию о времени.

Изменения

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

  • Chromium 133.0.6943.16
  • Mozilla Firefox 134.0
  • WebKit 18.2

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

  • Google Chrome 132
  • Microsoft Edge 132

Версия 1.49

Снимки Aria

Новая проверка Expect(Locator).ToMatchAriaSnapshotAsync() проверяет структуру страницы, сравнивая с ожидаемым деревом доступности, представленным в формате YAML.

await page.GotoAsync("https://playwright.dev");
await Expect(page.Locator("body")).ToMatchAriaSnapshotAsync(@"
- 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""
");

Вы можете сгенерировать эту проверку с помощью Генератора тестов или вызвав Locator.AriaSnapshotAsync().

Узнайте больше в руководстве по снимкам aria.

Группы трассировки

Новый метод Tracing.GroupAsync() позволяет визуально группировать действия в просмотрщике трассировки.

// Все действия между GroupAsync и GroupEndAsync
// будут показаны в просмотрщике трассировки как группа.
await Page.Context.Tracing.GroupAsync("Open Playwright.dev > API");
await Page.GotoAsync("https://playwright.dev/");
await Page.GetByRole(AriaRole.Link, new() { Name = "API" }).ClickAsync();
await Page.Context.Tracing.GroupEndAsync();

Изменения: каналы chrome и msedge переключаются на новый режим без головы

Это изменение затрагивает вас, если вы используете один из следующих каналов в вашем playwright.config.ts:

  • chrome, chrome-dev, chrome-beta или chrome-canary
  • msedge, msedge-dev, msedge-beta или msedge-canary

После обновления до Playwright v1.49 запустите ваш тестовый набор. Если он все еще проходит, вы в порядке. Если нет, вам, вероятно, потребуется обновить ваши снимки и адаптировать часть вашего тестового кода вокруг просмотрщиков PDF и расширений. См. вопрос #33566 для получения более подробной информации.

Попробуйте новый режим без головы в Chromium

Вы можете включить новый режим без головы, используя канал 'chromium'. Как говорится в официальной документации Chrome:

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

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

runsettings.xml
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<Playwright>
<BrowserName>chromium</BrowserName>
<LaunchOptions>
<Channel>chromium</Channel>
</LaunchOptions>
</Playwright>
</RunSettings>
dotnet test -- Playwright.BrowserName=chromium Playwright.LaunchOptions.Channel=chromium

Разное

  • Больше не будет обновлений для WebKit на Ubuntu 20.04 и Debian 11. Мы рекомендуем обновить вашу ОС до более поздней версии.
  • Элементы <canvas> внутри снимка теперь отображают предварительный просмотр.

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

  • Chromium 131.0.6778.33
  • Mozilla Firefox 132.0
  • WebKit 18.2

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

  • Google Chrome 130
  • Microsoft Edge 130

Версия 1.48

Маршрутизация WebSocket

Новые методы Page.RouteWebSocketAsync() и BrowserContext.RouteWebSocketAsync() позволяют перехватывать, изменять и имитировать соединения WebSocket, инициированные на странице. Ниже приведен простой пример, который имитирует общение по WebSocket, отвечая на "request" с "response".

await page.RouteWebSocketAsync("/ws", ws => {
ws.OnMessage(frame => {
if (frame.Text == "request")
ws.Send("response");
});
});

См. WebSocketRoute для получения более подробной информации.

Обновления интерфейса

  • Новые кнопки "копировать" для аннотаций и местоположения теста в HTML-отчете.
  • Вызовы методов маршрута, таких как Route.FulfillAsync(), больше не отображаются в отчете и просмотрщике трассировки. Вы можете увидеть, какие сетевые запросы были маршрутизированы, на вкладке сети.
  • Новые кнопки "Копировать как cURL" и "Копировать как fetch" для запросов на вкладке сети.

Разное

  • Новый метод Page.RequestGCAsync() может помочь обнаружить утечки памяти.
  • Запросы, выполненные APIRequestContext, теперь записывают подробную информацию о времени и безопасности в HAR.

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

  • Chromium 130.0.6723.19
  • Mozilla Firefox 130.0
  • WebKit 18.0

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

  • Google Chrome 129
  • Microsoft Edge 129

Версия 1.47

Улучшения вкладки сети

Вкладка сети в просмотрщике трассировки получила несколько приятных улучшений:

  • фильтрация по типу ресурса и URL
  • лучшее отображение параметров строки запроса
  • предварительный просмотр шрифтовых ресурсов

Вкладка сети теперь имеет фильтры

Разное

  • mcr.microsoft.com/playwright/dotnet:v1.47.0 теперь предоставляет образ Playwright на основе Ubuntu 24.04 Noble. Чтобы использовать образ на основе 22.04 jammy, используйте mcr.microsoft.com/playwright/dotnet:v1.47.0-jammy.
  • Теги :latest/:focal/:jammy для образов Playwright Docker больше не публикуются. Закрепите на конкретной версии для лучшей стабильности и воспроизводимости.
  • Клиентские сертификаты TLS теперь могут передаваться из памяти, передавая ClientCertificates.Cert и ClientCertificates.Key в виде массивов байтов вместо путей к файлам.
  • NoWaitAfter в Locator.SelectOptionAsync() был устаревшим.
  • Мы видели сообщения о неправильной работе 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.

Вы можете предоставить клиентские сертификаты в качестве параметра Browser.NewContextAsync() и ApiRequest.NewContextAsync(). Следующий фрагмент кода настраивает клиентский сертификат для https://example.com:

var context = await Browser.NewContextAsync(new() {
ClientCertificates = [
new() {
Origin = "https://example.com",
CertPath = "client-certificates/cert.pem",
KeyPath = "client-certificates/key.pem",
}
]
});

Обновления просмотрщика трассировки

  • Содержимое текстовых вложений теперь отображается в строке в панели вложений.
  • Новая настройка для отображения/скрытия действий маршрутизации, таких как Route.ContinueAsync().
  • Метод и статус запроса отображаются на вкладке сетевых деталей.
  • Новая кнопка для копирования местоположения исходного файла в буфер обмена.
  • Панель метаданных теперь отображает BaseURL.

Разное

  • Новая опция maxRetries в ApiRequestContext.FetchAsync(), которая повторяет попытки при сетевой ошибке ECONNRESET.

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

  • Chromium 128.0.6613.18
  • Mozilla Firefox 128.0
  • WebKit 18.0

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

  • Google Chrome 127
  • Microsoft Edge 127

Версия 1.45

Часы

Использование нового API Clock позволяет манипулировать и контролировать время в тестах для проверки поведения, связанного со временем. Этот API охватывает многие распространенные сценарии, включая:

  • тестирование с предопределенным временем;
  • поддержание согласованного времени и таймеров;
  • мониторинг бездействия;
  • ручное продвижение времени.
// Инициализируйте часы с некоторым временем до времени теста и позвольте странице загружаться естественным образом.
// `Date.now` будет прогрессировать по мере срабатывания таймеров.
await Page.Clock.InstallAsync(new()
{
TimeDate = new DateTime(2024, 2, 2, 8, 0, 0)
});
await Page.GotoAsync("http://localhost:3333");

// Предположим, что пользователь закрыл крышку ноутбука и снова открыл ее в 10 утра.
// Приостановите время, как только достигнете этой точки.
await Page.Clock.PauseAtAsync(new DateTime(2024, 2, 2, 10, 0, 0));

// Проверьте состояние страницы.
await Expect(Page.GetByTestId("current-time")).ToHaveTextAsync("2/2/2024, 10:00:00 AM");

// Снова закройте крышку ноутбука и откройте ее в 10:30 утра.
await Page.Clock.FastForwardAsync("30:00");
await Expect(Page.GetByTestId("current-time")).ToHaveTextAsync("2/2/2024, 10:30:00 AM");

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

Разное

  • Метод Locator.SetInputFilesAsync() теперь поддерживает загрузку каталога для элементов <input type=file webkitdirectory>.

    await page.GetByLabel("Upload directory").SetInputFilesAsync("mydir");
  • Несколько методов, таких как Locator.ClickAsync() или Locator.PressAsync(), теперь поддерживают модификаторную клавишу ControlOrMeta. Эта клавиша сопоставляется с Meta на macOS и с Control на Windows и Linux.

    // Нажмите общую комбинацию клавиш Control+S или Meta+S, чтобы вызвать операцию "Сохранить".
    await page.Keyboard.PressAsync("ControlOrMeta+S");
  • Новое свойство httpCredentials.send в ApiRequest.NewContextAsync(), которое позволяет либо всегда отправлять заголовок Authorization, либо отправлять его только в ответ на 401 Unauthorized.

  • 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).ToHaveAccessibleNameAsync() проверяет, имеет ли элемент указанное доступное имя:

    var locator = Page.GetByRole(AriaRole.Button);
    await Expect(locator).ToHaveAccessibleNameAsync("Submit");
  • Expect(Locator).ToHaveAccessibleDescriptionAsync() проверяет, имеет ли элемент указанное доступное описание:

    var locator = Page.GetByRole(AriaRole.Button);
    await Expect(locator).ToHaveAccessibleDescriptionAsync("Upload a photo");
  • Expect(Locator).ToHaveRoleAsync() проверяет, имеет ли элемент указанную роль ARIA:

    var locator = Page.GetByTestId("save-button");
    await Expect(locator).ToHaveRoleAsync(AriaRole.Button);

Обработчик локаторов

  • После выполнения обработчика, добавленного с помощью Page.AddLocatorHandlerAsync(), Playwright теперь будет ждать, пока оверлей, вызвавший обработчик, больше не будет виден. Вы можете отказаться от этого поведения с помощью новой опции NoWaitAfter.
  • Вы можете использовать новую опцию Times в Page.AddLocatorHandlerAsync(), чтобы указать максимальное количество раз, которое обработчик должен быть выполнен.
  • Обработчик в Page.AddLocatorHandlerAsync() теперь принимает локатор в качестве аргумента.
  • Новый метод Page.RemoveLocatorHandlerAsync() для удаления ранее добавленных обработчиков локаторов.
var locator = Page.GetByText("This interstitial covers the button");
await Page.AddLocatorHandlerAsync(locator, async (overlay) =>
{
await overlay.Locator("#close").ClickAsync();
}, new() { Times = 3, NoWaitAfter = true });
// Запустите ваши тесты, которые могут быть прерваны оверлеем.
// ...
await Page.RemoveLocatorHandlerAsync(locator);

Разные опции

  • Новый метод FormData.Append() позволяет указывать повторяющиеся поля с одинаковым именем в опции Multipart в APIRequestContext.FetchAsync():

    var formData = Context.APIRequest.CreateFormData();
    formData.Append("file", new FilePayload()
    {
    Name = "f1.js",
    MimeType = "text/javascript",
    Buffer = System.Text.Encoding.UTF8.GetBytes("var x = 2024;")
    });
    formData.Append("file", new FilePayload()
    {
    Name = "f2.txt",
    MimeType = "text/plain",
    Buffer = System.Text.Encoding.UTF8.GetBytes("hello")
    });
    var response = await Context.APIRequest.PostAsync("https://example.com/uploadFiles", new() { Multipart = formData });
  • Expect(Page).ToHaveURLAsync() теперь поддерживает опцию IgnoreCase option.

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

  • Chromium 125.0.6422.14
  • Mozilla Firefox 125.0.1
  • WebKit 17.4

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

  • Google Chrome 124
  • Microsoft Edge 124

Версия 1.43

Новые API

  • Метод BrowserContext.ClearCookiesAsync() теперь поддерживает фильтры для удаления только некоторых файлов cookie.

    // Очистить все файлы cookie.
    await Context.ClearCookiesAsync();
    // Новое: очистить файлы cookie с определенным именем.
    await Context.ClearCookiesAsync(new() { Name = "session-id" });
    // Новое: очистить файлы cookie для определенного домена.
    await Context.ClearCookiesAsync(new() { Domain = "my-origin.com" });
  • Новое свойство Locator.ContentFrame преобразует объект Locator в FrameLocator. Это может быть полезно, когда у вас есть объект Locator, полученный где-то, и позже вы хотите взаимодействовать с содержимым внутри фрейма.

    var locator = Page.Locator("iframe[name='embedded']");
    // ...
    var frameLocator = locator.ContentFrame;
    await frameLocator.GetByRole(AriaRole.Button).ClickAsync();
  • Новое свойство FrameLocator.Owner преобразует объект FrameLocator в Locator. Это может быть полезно, когда у вас есть объект FrameLocator, полученный где-то, и позже вы хотите взаимодействовать с элементом iframe.

    var frameLocator = page.FrameLocator("iframe[name='embedded']");
    // ...
    var locator = frameLocator.Owner;
    await Expect(locator).ToBeVisibleAsync();

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

  • Chromium 124.0.6367.8
  • Mozilla Firefox 124.0
  • WebKit 17.4

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

  • Google Chrome 123
  • Microsoft Edge 123

Версия 1.42

Новый обработчик локаторов

Новый метод Page.AddLocatorHandlerAsync() регистрирует обратный вызов, который будет вызван, когда указанный элемент станет видимым и может блокировать действия Playwright. Обратный вызов может избавиться от оверлея. Вот пример, который закрывает диалоговое окно cookie, когда оно появляется.

// Настройте обработчик.
await Page.AddLocatorHandlerAsync(
Page.GetByRole(AriaRole.Heading, new() { Name = "Hej! You are in control of your cookies." }),
async () =>
{
await Page.GetByRole(AriaRole.Button, new() { Name = "Accept all" }).ClickAsync();
});
// Напишите тест как обычно.
await Page.GotoAsync("https://www.ikea.com/");
await Page.GetByRole(AriaRole.Link, new() { Name = "Collection of blue and white" }).ClickAsync();
await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Light and easy" })).ToBeVisibleAsync();

Новые API

Объявления

  • ⚠️ Ubuntu 18 больше не поддерживается.

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

  • Chromium 123.0.6312.4
  • Mozilla Firefox 123.0
  • WebKit 17.4

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

  • Google Chrome 122
  • Microsoft Edge 123

Версия 1.41

Новые API

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

  • Chromium 121.0.6167.57
  • Mozilla Firefox 121.0
  • WebKit 17.4

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

  • Google Chrome 120
  • Microsoft Edge 120

Версия 1.40

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

Генератор тестов Playwright

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

Вот пример сгенерированного теста с проверками:

await Page.GotoAsync("https://playwright.dev/");
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
await Expect(Page.GetByLabel("Breadcrumbs").GetByRole(AriaRole.List)).ToContainTextAsync("Installation");
await Expect(Page.GetByLabel("Search")).ToBeVisibleAsync();
await Page.GetByLabel("Search").ClickAsync();
await Page.GetByPlaceholder("Search docs").FillAsync("locator");
await Expect(Page.GetByPlaceholder("Search docs")).ToHaveValueAsync("locator");

Новые API

Другие изменения

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

  • Chromium 120.0.6099.28
  • Mozilla Firefox 119.0
  • WebKit 17.4

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

  • Google Chrome 119
  • Microsoft Edge 119

Версия 1.39

Обновление evergreen браузеров.

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

  • Chromium 119.0.6045.9
  • Mozilla Firefox 118.0.1
  • WebKit 17.4

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

  • Google Chrome 118
  • Microsoft Edge 118

Версия 1.38

Обновления Trace Viewer

Playwright Trace Viewer

  1. Увеличение временного диапазона.
  2. Переработка панели сети.

Новые API

Устаревшие функции

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

  • Chromium 117.0.5938.62
  • Mozilla Firefox 117.0
  • WebKit 17.0

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

  • Google Chrome 116
  • Microsoft Edge 116

Версия 1.37

📚 Поддержка Debian 12 Bookworm

Playwright теперь поддерживает Debian 12 Bookworm на x86_64 и arm64 для Chromium, Firefox и WebKit. Сообщите нам, если у вас возникнут какие-либо проблемы!

Поддержка Linux выглядит следующим образом:

Ubuntu 20.04Ubuntu 22.04Debian 11Debian 12
Chromium
WebKit
Firefox

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

  • 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

Основные моменты

  • Новая опция MaskColor для методов Page.ScreenshotAsync() и Locator.ScreenshotAsync() для изменения цвета маски по умолчанию.

  • Новая команда CLI uninstall для удаления бинарных файлов браузера:

    $ pwsh bin/Debug/netX/playwright.ps1 uninstall # удалить браузеры, установленные этой установкой
    $ pwsh bin/Debug/netX/playwright.ps1 uninstall --all # удалить все когда-либо установленные браузеры Playwright

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

  • Chromium 115.0.5790.13
  • Mozilla Firefox 113.0
  • WebKit 16.4

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

  • Google Chrome 114
  • Microsoft Edge 114

Версия 1.34

Основные моменты

  • Новый Locator.And() для создания локатора, который соответствует обоим локаторам.

    var button = page.GetByRole(AriaRole.BUTTON).And(page.GetByTitle("Subscribe"));
  • Новые события BrowserContext.Console и BrowserContext.Dialog для подписки на любые диалоги и сообщения консоли с любой страницы из данного контекста браузера. Используйте новые методы ConsoleMessage.Page и Dialog.Page для определения источника события.

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

  • Chromium 114.0.5735.26
  • Mozilla Firefox 113.0
  • WebKit 16.4

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

  • Google Chrome 113
  • Microsoft Edge 113

Версия 1.33

Обновление локаторов

  • Используйте Locator.Or() для создания локатора, который соответствует любому из двух локаторов. Рассмотрите сценарий, когда вы хотите нажать кнопку "Новое письмо", но иногда вместо этого появляется диалоговое окно настроек безопасности. В этом случае вы можете ожидать либо кнопку "Новое письмо", либо диалоговое окно и действовать соответственно:

    var newEmail = Page.GetByRole(AriaRole.Button, new() { Name = "New email" });
    var dialog = Page.GetByText("Confirm security settings");
    await Expect(newEmail.Or(dialog)).ToBeVisibleAsync();
    if (await dialog.IsVisibleAsync())
    await Page.GetByRole(AriaRole.Button, new() { Name = "Dismiss" }).ClickAsync();
    await newEmail.ClickAsync();
  • Используйте новые опции HasNot и HasNotText|HasNotTextRegex в Locator.Filter() для поиска элементов, которые не соответствуют определенным условиям.

    var rowLocator = Page.Locator("tr");
    await rowLocator
    .Filter(new() { HasNotText = "text in column 1" })
    .Filter(new() { HasNot = Page.GetByRole(AriaRole.Button, new() { Name = "column 2 button" })})
    .ScreenshotAsync();
  • Используйте новое утверждение Expect(Locator).ToBeAttachedAsync(), чтобы убедиться, что элемент присутствует в DOM страницы. Не путайте с Expect(Locator).ToBeVisibleAsync(), которое гарантирует, что элемент как прикреплен, так и видим.

Новые API

⚠️ Изменение, нарушающее совместимость

  • mcr.microsoft.com/playwright/dotnet:v1.33.0 теперь предоставляет образ Playwright на основе Ubuntu Jammy. Чтобы использовать образ на основе focal, используйте mcr.microsoft.com/playwright/dotnet:v1.33.0-focal.

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

  • Chromium 113.0.5672.53
  • Mozilla Firefox 112.0
  • WebKit 16.4

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

  • Google Chrome 112
  • Microsoft Edge 112

Версия 1.32

Новые API

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

  • Chromium 112.0.5615.29
  • Mozilla Firefox 111.0
  • WebKit 16.4

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

  • Google Chrome 111
  • Microsoft Edge 111

Версия 1.31

Новые API

  • Новое утверждение Expect(Locator).ToBeInViewportAsync() гарантирует, что локатор указывает на элемент, который пересекается с областью просмотра, в соответствии с API наблюдателя пересечений.

    var locator = Page.GetByRole(AriaRole.Button);

    // Убедитесь, что хотя бы часть элемента пересекается с областью просмотра.
    await Expect(locator).ToBeInViewportAsync();

    // Убедитесь, что элемент полностью вне области просмотра.
    await Expect(locator).Not.ToBeInViewportAsync();

    // Убедитесь, что хотя бы половина элемента пересекается с областью просмотра.
    await Expect(locator).ToBeInViewportAsync(new() { Ratio = 0.5 });
  • Новые методы BrowserContext.NewCDPSessionAsync() и Browser.NewBrowserCDPSessionAsync() создают сессию Chrome DevTools Protocol для страницы и браузера соответственно.

Разное

  • Снимки DOM в trace viewer теперь можно открывать в отдельном окне.
  • Новая опция MaxRedirects для метода Route.FetchAsync().
  • Playwright теперь поддерживает Debian 11 arm64.
  • Официальные docker образы теперь включают Node 18 вместо Node 16.

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

  • 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.FetchAsync() и новая опция Json для Route.FulfillAsync():

    await Page.RouteAsync("**/api/settings", async route => {
    // Получить оригинальные настройки.
    var response = await route.FetchAsync();

    // Установить тему настроек в предопределенное значение.
    var json = await response.JsonAsync<MyDataType>();
    json.Theme = "Solarized";

    // Выполнить с измененными данными.
    await route.FulfillAsync(new() {
    Json = json
    });
    });
  • Новый метод Locator.AllAsync() для итерации по всем соответствующим элементам:

    // Отметить все флажки!
    var checkboxes = Page.GetByRole(AriaRole.Checkbox);
    foreach (var checkbox in await checkboxes.AllAsync())
    await checkbox.CheckAsync();
  • Locator.SelectOptionAsync() теперь соответствует по значению или метке:

    <select multiple>
    <option value="red">Red</option>
    <option value="green">Green</option>
    <option value="blue">Blue</option>
    </select>
    await element.SelectOptionAsync("Red");

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

  • Chromium 109.0.5414.46
  • Mozilla Firefox 107.0
  • WebKit 16.4

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

  • Google Chrome 108
  • Microsoft Edge 108

Версия 1.28

Инструменты Playwright

  • Живые локаторы в CodeGen. Генерируйте локатор для любого элемента на странице с помощью инструмента "Explore".

Locator Explorer

Новые API

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

  • Chromium 108.0.5359.29
  • Mozilla Firefox 106.0
  • WebKit 16.4

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

  • Google Chrome 107
  • Microsoft Edge 107

Версия 1.27

Локаторы

С этими новыми API написание локаторов становится удовольствием:

await page.GetByLabel("User Name").FillAsync("John");

await page.GetByLabel("Password").FillAsync("secret-password");

await page.GetByRole(AriaRole.Button, new() { NameString = "Sign in" }).ClickAsync();

await Expect(Page.GetByText("Welcome, John!")).ToBeVisibleAsync();

Все те же методы также доступны в классах Locator, FrameLocator и Frame.

Другие основные моменты

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

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

  • Expect(Locator).ToHaveAttributeAsync() с пустым значением больше не соответствует отсутствующему атрибуту. Например, следующий фрагмент будет успешным, когда у button нет атрибута disabled.

    await Expect(Page.GetByRole(AriaRole.Button)).ToHaveAttributeAsync("disabled", "");

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

  • Chromium 107.0.5304.18
  • Mozilla Firefox 105.0.1
  • WebKit 16.0

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

  • Google Chrome 106
  • Microsoft Edge 106

Версия 1.26

Утверждения

Другие основные моменты

  • Новая опция MaxRedirects для ApiRequestContext.GetAsync() и других для ограничения количества перенаправлений.
  • Codegen теперь поддерживает фреймворки MSTest и NUnit.
  • ASP .NET теперь поддерживается.

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

Множество API Playwright уже поддерживают опцию WaitUntil: WaitUntilState.DOMContentLoaded. Например:

await Page.GotoAsync("https://playwright.dev", new() { WaitUntil = WaitUntilState.DOMContentLoaded });

До версии 1.26 это ожидало, пока все фреймы не сгенерируют событие DOMContentLoaded.

Чтобы соответствовать веб-спецификации, значение WaitUntilState.DOMContentLoaded теперь ожидает, пока целевой фрейм не сгенерирует событие 'DOMContentLoaded'. Используйте WaitUntil: WaitUntilState.Load, чтобы дождаться всех фреймов.

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

  • Chromium 106.0.5249.30
  • Mozilla Firefox 104.0
  • WebKit 16.0

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

  • Google Chrome 105
  • Microsoft Edge 105

Версия 1.25

Новая поддержка файла .runsettings

Microsoft.Playwright.NUnit и Microsoft.Playwright.MSTest теперь будут учитывать файл .runsettings и переданные настройки через CLI при запуске end-to-end тестов. См. в документации полный список поддерживаемых настроек.

Теперь это работает:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<!-- Playwright -->
<Playwright>
<BrowserName>chromium</BrowserName>
<ExpectTimeout>5000</ExpectTimeout>
<LaunchOptions>
<Headless>true</Headless>
<Channel>msedge</Channel>
</LaunchOptions>
</Playwright>
<!-- Общая конфигурация запуска -->
<RunConfiguration>
<EnvironmentVariables>
<!-- Для отладки селекторов рекомендуется установить следующую переменную окружения -->
<DEBUG>pw:api</DEBUG>
</EnvironmentVariables>
</RunConfiguration>
</RunSettings>

Объявления

  • 🪦 Это последний выпуск с поддержкой macOS 10.15 (устарел с версии 1.21).
  • ⚠️ Ubuntu 18 теперь устарел и не будет поддерживаться с декабря 2022 года.

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

  • Chromium 105.0.5195.19
  • Mozilla Firefox 103.0
  • WebKit 16.0

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

  • Google Chrome 104
  • Microsoft Edge 104

Версия 1.24

🐂 Поддержка Debian 11 Bullseye

Playwright теперь поддерживает Debian 11 Bullseye на x86_64 для Chromium, Firefox и WebKit. Сообщите нам, если у вас возникнут какие-либо проблемы!

Поддержка Linux выглядит следующим образом:

| | Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | :--- | :---: | :---: | :---: | :---: | | Chromium | ✅ | ✅ | ✅ | | WebKit | ✅ | ✅ | ✅ | | Firefox | ✅ | ✅ | ✅ |

Новые вводные документы

Мы переписали наши документы по началу работы, чтобы они были более ориентированы на end-to-end тестирование. Ознакомьтесь с ними на playwright.dev.

Версия 1.23

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

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

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

Чтобы сделать запрос от имени страницы Playwright, используйте новый Page.APIRequest API:

// Выполнить GET-запрос от имени страницы
var response = await Page.APIRequest.GetAsync("http://example.com/foo.json");
Console.WriteLine(response.Status);
Console.WriteLine(response.StatusText);
Console.WriteLine(response.Ok);
Console.WriteLine(response.Headers["Content-Type"]);
Console.WriteLine(await response.TextAsync());
Console.WriteLine((await response.JsonAsync())?.GetProperty("foo").GetString());

Подробнее об этом читайте в нашем руководстве по тестированию API.

Воспроизведение сети

Теперь вы можете записывать сетевой трафик в файл HAR и повторно использовать этот трафик в ваших тестах.

Чтобы записать сеть в файл HAR:

pwsh bin/Debug/netX/playwright.ps1 open --save-har=example.har --save-har-glob="**/api/**" https://example.com

Кроме того, вы можете записать HAR программно:

var context = await browser.NewContextAsync(new()
{
RecordHarPath = harPath,
RecordHarUrlFilterString = "**/api/**",
});

// ... Выполнить действия ...

// Закрыть контекст, чтобы убедиться, что HAR сохранен на диск.
context.CloseAsync();

Используйте новые методы Page.RouteFromHARAsync() или BrowserContext.RouteFromHARAsync(), чтобы обслуживать соответствующие ответы из файла HAR:

await context.RouteFromHARAsync("example.har");

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

Расширенная маршрутизация

Теперь вы можете использовать Route.FallbackAsync() для передачи маршрутизации другим обработчикам.

Рассмотрите следующий пример:

// Удалить заголовок из всех запросов.
await page.RouteAsync("**/*", async route =>
{
var headers = route.Request.Headers;
headers.Remove("X-Secret");
await route.ContinueAsync(new() { Headers = headers });
});

// Прервать все изображения.
await page.RouteAsync("**/*", async route =>
{
if (route.Request.ResourceType == "image")
{
await route.AbortAsync();
}
else
{
await route.FallbackAsync();
}
});

Обратите внимание, что новые методы Page.RouteFromHARAsync() и BrowserContext.RouteFromHARAsync() также участвуют в маршрутизации и могут быть переданы.

Обновление Web-First Assertions

Разное

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

    var context = await Browser.NewContextAsync(new()
    {
    ServiceWorkers = ServiceWorkerPolicy.Block
    });
  • Использование пути .zip для опции контекста recordHar автоматически архивирует полученный HAR:

    var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har.zip" });
  • Если вы планируете редактировать HAR вручную, рассмотрите возможность использования режима записи HAR "minimal", который записывает только информацию, необходимую для воспроизведения:

    var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har", RecordHarMode = HarMode.Minimal });
  • Playwright теперь работает на Ubuntu 22 amd64 и Ubuntu 22 arm64.

  • Playwright для .NET теперь поддерживает linux-arm64 и предоставляет arm64 Ubuntu 20.04 Docker image для него.

Версия 1.22

Основные моменты

  • Селекторы ролей, которые позволяют выбирать элементы по их ARIA роли, ARIA атрибутам и доступному имени.

    // Нажмите кнопку с доступным именем "log in"
    await page.Locator("role=button[name='log in']").ClickAsync();

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

  • Новый API Locator.Filter() для фильтрации существующего локатора

    var buttons = page.Locator("role=button");
    // ...
    var submitLocator = buttons.Filter(new() { HasText = "Sign up" });
    await submitLocator.ClickAsync();

Версия 1.21

Основные моменты

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

  • Playwright теперь поддерживает загрузку больших файлов (сотни МБ) через API Locator.SetInputFilesAsync().

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

  • Chromium 101.0.4951.26
  • Mozilla Firefox 98.0.2
  • WebKit 15.4

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

  • Google Chrome 100
  • Microsoft Edge 100

Версия 1.20

Web-First Assertions

Playwright для .NET 1.20 представляет Web-First Assertions.

Рассмотрим следующий пример:

using System.Threading.Tasks;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;

namespace PlaywrightTests;

[TestFixture]
public class ExampleTests : PageTest
{
[Test]
public async Task StatusBecomesSubmitted()
{
await Expect(Page.Locator(".status")).ToHaveTextAsync("Submitted");
}
}

Playwright будет повторно тестировать узел с селектором .status, пока извлеченный узел не будет содержать текст "Submitted". Он будет повторно извлекать узел и проверять его снова и снова, пока условие не будет выполнено или не истечет время ожидания. Вы можете передать это время ожидания в качестве опции.

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

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

  • Новые опции для методов Page.ScreenshotAsync(), Locator.ScreenshotAsync() и ElementHandle.ScreenshotAsync():
    • Опция ScreenshotAnimations.Disabled перематывает все CSS-анимации и переходы в согласованное состояние
    • Опция mask: Locator[] маскирует указанные элементы, накладывая на них розовые #FF00FF блоки.
  • Locator.HighlightAsync() визуально выделяет элемент(ы) для упрощения отладки.

Объявления

  • 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

Основные моменты

  • Локатор теперь поддерживает опцию has, которая гарантирует, что он содержит другой локатор внутри:

    await Page.Locator("article", new() { Has = Page.Locator(".highlight") }).ClickAsync();

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

  • Новый Locator.Page

  • Page.ScreenshotAsync() и Locator.ScreenshotAsync() теперь автоматически скрывают мигающий курсор

  • Playwright Codegen теперь генерирует локаторы и локаторы фреймов

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

  • Chromium 100.0.4863.0
  • Mozilla Firefox 96.0.1
  • WebKit 15.4

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

  • Google Chrome 98
  • Microsoft Edge 98

Версия 1.18

Улучшения локаторов

  • Locator.DragToAsync()

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

    await Page.Locator("li", new() { HasTextString = "My Item" })
    .Locator("button").click();

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

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

  • Опция AcceptDownloads теперь по умолчанию установлена в true.
  • Опция Sources для встраивания источников в трассировки.

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

  • Chromium 99.0.4812.0
  • Mozilla Firefox 95.0
  • WebKit 15.4

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

  • Google Chrome 97
  • Microsoft Edge 97

Версия 1.17

Локаторы фреймов

Playwright 1.17 представляет локаторы фреймов - локатор для iframe на странице. Локаторы фреймов захватывают логику, достаточную для получения iframe, а затем нахождения элементов в этом iframe. Локаторы фреймов по умолчанию строгие, будут ждать появления iframe и могут использоваться в Web-First утверждениях.

Графика

Локаторы фреймов могут быть созданы с помощью методов Page.FrameLocator() или Locator.FrameLocator().

var locator = page.FrameLocator("#my-frame").Locator("text=Submit");
await locator.ClickAsync();

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

Обновление Trace Viewer

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

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

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

изображение

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

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

изображение

Поддержка Ubuntu ARM64 и многое другое

  • Playwright теперь поддерживает Ubuntu 20.04 ARM64. Теперь вы можете запускать тесты Playwright внутри Docker на Apple M1 и Raspberry Pi.

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

    pwsh bin/Debug/netX/playwright.ps1 install msedge

Новые API

  • Трассировка теперь поддерживает опцию 'title'
  • Навигация по страницам поддерживает новую опцию ожидания 'commit'

Версия 1.16

🎭 Библиотека Playwright

Locator.WaitForAsync

Ожидание разрешения локатора на один элемент с заданным состоянием. По умолчанию state: 'visible'.

var orderSent = page.Locator("#order-sent");
orderSent.WaitForAsync();

Подробнее о Locator.WaitForAsync().

🎭 Playwright Trace Viewer

  • запустите просмотрщик трассировок с помощью pwsh bin/Debug/netX/playwright.ps1 show-trace и перетащите файлы трассировок в PWA просмотрщика трассировок
  • лучшее визуальное отображение целей действий

Подробнее о Trace Viewer.

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

  • Chromium 97.0.4666.0
  • Mozilla Firefox 93.0
  • WebKit 15.4

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

  • Google Chrome 94
  • Microsoft Edge 94

Версия 1.15

🖱️ Колесо мыши

С помощью Mouse.WheelAsync() теперь можно прокручивать вертикально или горизонтально.

📜 Новый API заголовков

Ранее было невозможно получить несколько значений заголовков ответа. Теперь это возможно, и доступны дополнительные вспомогательные функции:

🌈 Эмуляция Forced-Colors

Теперь можно эмулировать CSS-медиафичу forced-colors, передав ее в Browser.NewContextAsync() или вызвав Page.EmulateMediaAsync().

Новые API

Важно ⚠

  • ⬆ Приложения .NET Core 2.1 больше не поддерживаются для нашего CLI-инструментария. С 31 августа 2021 года .NET Core 2.1 больше не поддерживается и не будет получать обновления безопасности. Мы решили продвинуть CLI вперед и требовать .NET Core 3.1 как минимум.

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

  • Chromium 96.0.4641.0
  • Mozilla Firefox 92.0
  • WebKit 15.0

Версия 1.14

⚡️ Новый "строгий" режим

Неоднозначность селекторов является распространенной проблемой в автоматизированном тестировании. "Строгий" режим гарантирует, что ваш селектор указывает на один элемент и выдает ошибку в противном случае.

Установите setStrict(true) в ваших вызовах действий, чтобы включить его.

// Это вызовет ошибку, если у вас больше одной кнопки!
await page.Locator("button", new() { Strict = true });

📍 Новый API локаторов

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

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

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

var locator = page.Locator("button");
await locator.ClickAsync();

Узнайте больше в документации.

🧩 Экспериментальные React и Vue селекторные движки

Селекторы React и Vue позволяют выбирать элементы по имени их компонента и/или значениям свойств. Синтаксис очень похож на селекторы атрибутов и поддерживает все операторы селекторов атрибутов.

await page.Locator("_react=SubmitButton[enabled=true]").ClickAsync();
await page.Locator("_vue=submit-button[enabled=true]").ClickAsync();

Узнайте больше в документации по селекторам React и документации по селекторам Vue.

✨ Новые селекторные движки nth и visible

  • nth селекторный движок эквивалентен псевдоклассу :nth-match, но может быть объединен с другими селекторными движками.
  • visible селекторный движок эквивалентен псевдоклассу :visible, но может быть объединен с другими селекторными движками.
// выберите первую кнопку среди всех кнопок
await button.ClickAsync("button >> nth=0");
// или если вы используете локаторы, вы можете использовать First, Nth() и Last
await page.Locator("button").First.ClickAsync();

// нажмите видимую кнопку
await button.ClickAsync("button >> visible=true");

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

  • Chromium 94.0.4595.0
  • Mozilla Firefox 91.0
  • WebKit 15.0

Версия 1.13

Playwright

  • 🖖 Программная поддержка drag-and-drop через API Page.DragAndDropAsync().
  • 🔎 Улучшенный HAR с размерами тел для запросов и ответов. Используйте через опцию recordHar в Browser.NewContextAsync().

Инструменты

  • Playwright Trace Viewer теперь показывает параметры, возвращаемые значения и вызовы console.log().

Новые и переработанные руководства

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

  • Chromium 93.0.4576.0
  • Mozilla Firefox 90.0
  • WebKit 14.2

Новые API Playwright

Версия 1.12

Основные моменты

  • Playwright для .NET v1.12 теперь стабилен!
  • Поставляется с инструментами codegen и trace viewer из коробки

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

  • Chromium 93.0.4530.0
  • Mozilla Firefox 89.0
  • WebKit 14.2

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

  • Google Chrome 91
  • Microsoft Edge 91