Каждый написанный нами сценарий, как правило, включает три основные операции:
- Навигация на целевую веб-страницу
- Ожидание определенного события
- Обработка возможного тайм-аута при загрузке страницы
Содержание
БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм-канале "Библиотека тестировщика"
Навигация
Процесс первоначальной навигации в большинстве фреймворков схож и поддерживает несколько методов.
- Вызов
page.goto()
или клик по ссылке черезpage.click()
в вашем коде явно запускает процесс навигации. - Текущая страница также может инициировать навигацию, изменяя
location.href = 'https://example.com'
или используя APIhistory.pushState().
В примере ниже мы инициируем две навигации:
- Начальная загрузка страницы.
- Навигация в корзину по ссылке.
import { test } from '@playwright/test' test('basic navigation', async ({ page }) => { await page.goto('https://danube-web.shop/') await page.click('#cart') })
Выполните этот пример следующим образом:
npx playwright test basic-browser-navigation.spec.ts
Ожидания
Ожидание событий является важным элементом любого автоматизированного сценария. В большинстве случаев Playwright автоматически управляет этим процессом. Например, при клике на кнопку Playwright сначала ожидает, пока она не станет доступной для взаимодействия, и только после этого выполняет клик.
В приведенном ниже примере мы вводим адрес электронной почты в поле ввода на модальном окне входа. Метод fill()
в Playwright обладает встроенным механизмом ожидания.
import { test } from '@playwright/test' test('basic built-in waiting', async ({ page }) => { await page.goto('https://danube-web.shop/') await page.getByRole('button', { name: 'Log in' }).click() await page.getByPlaceholder('Email').click() await page.getByPlaceholder('Email').fill('test@test.com') })
Выполните этот пример следующим образом:
npx playwright test basic-browser-waiting.spec.ts
Однако в некоторых случаях необходимо явно ожидать определенного события. Например, если требуется дождаться появления конкретного элемента на странице, можно использовать метод page.waitForSelector()
.
Этот метод ожидает, пока элемент появится в DOM. Он является одним из ключевых инструментов автоматизации и должен применяться в ситуациях, когда загрузка элемента происходит после клика, наведения курсора, перехода на другую страницу и т. д. При необходимости можно передать объект с атрибутом timeout
, чтобы изменить стандартное время ожидания (по умолчанию 30 секунд).
Это работает точно так же, как и функция page.waitForXpath()
, если вы используете селекторы XPath вместо селекторов CSS.
Таймауты
Метод page.waitForNavigation()
, а также аналогичные методы, такие как page.reload()
и page.goBack()
, позволяют задать параметры, определяющие способ ожидания навигации и пределы таймаута.
Эти параметры бывают двух типов:
1. Жесткий таймаут
Время в миллисекундах, передаваемое через параметр timeout
, например: page.waitForNavigation({ timeout: 2000 })
Мы не рекомендуем использовать этот параметр, если в этом нет явной необходимости.
2а. Ожидание на основе событий DOM
Эти параметры зависят от событий, которые браузер генерирует при достижении определенного этапа загрузки.
load
– ожидает полной загрузки всей страницы, включая все ресурсы (изображения, скрипты, CSS и т. д.). Это значение по умолчанию и самое строгое.domcontentloaded
– менее строгий режим ожидания, который срабатывает, когда HTML-документ загружен и разобран, но внешние ресурсы (например, стили и изображения) могут продолжать загружаться.
Примечание: параметр load
используется по умолчанию.
2б. Ожидание с использованием эвристики
Данные два варианта основаны на эвристическом подходе, предполагающем, что если все сетевые соединения в браузере становятся неактивными, это означает, что загрузка страницы, скорее всего, завершена.
networkidle0
: навигация считается завершенной, если в течение как минимум 500 мс не было более 0 сетевых соединений.networkidle2
: навигация считается завершенной, если в течение как минимум 500 мс не было более 2 активных сетевых соединений.
Playwright отказался от различия между networkidle0
и networkidle2
, объединив их в один параметр:
networkidle
: навигация считается завершенной, если в течение как минимум 500 мс не было более 0 сетевых соединений.
Оба варианта 2а и 2б передаются с помощью свойства waitUntil
, например: page.waitForNavigation({ waitUntil: 'networkidle2' })
Какой из этих вариантов будет наиболее полезен, зависит от вашей ситуации:
- Если ваш SPA должен быть полностью отрисован и завершить все вызовы XHR, используйте метод загрузки
load
. - Если вам нужно выполнить ленивую загрузку (lazy loading) несущественного элемента на сервере, выберите один из вариантов
networkidle
.
Перевод статьи «How to Use Playwright for Navigation and Interaction».