Динамический контент и ожидания в Playwright

Динамический контент — асинхронная загрузка данных, анимация и интерактивные элементы — создает проблемы в автоматизации. Одним из преимуществ Playwright является встроенная возможность обработки динамического контента с помощью механизмов автоматического ожидания. Эта функция позволяет дождаться появления, изменения и исчезновения элементов, прежде чем взаимодействовать с ними, это повышает стабильность тестов.

В отличие от многих инструментов, Playwright автоматически ожидает готовности элементов, прежде чем взаимодействовать с ними. Авто-ожидание применимо к большинству действий с элементами, таких как щелчки, вводы и утверждения

Принцип работы автоматического ожидания 

Всякий раз, когда Playwright взаимодействует с элементом — например, click(), fill(), или waitForSelector(), он автоматически:

  • Ожидает появления элемента: Playwright обеспечивает добавление элемента в DOM. 
  • Ожидает, пока элемент станет стабильным: Playwright ждет окончания анимации или переходов, прежде чем взаимодействовать с элементом. 
  • Ждет, пока элемент станет видимым: Playwright проверяет, что элемент виден (не скрыт и не свернут).

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

await page.click('button#submit'); // Автоматическое ожидание появления кнопки и ее кликабельности

Это значительно упрощает написание тестов, так как Playwright решает большую часть проблем, связанных с таймингами доступности элементов и динамическим контентом. 

Ожидание определенного условия

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

Ожидание селекторов 

Метод waitForSelector() ожидает появления элемента в DOM и выполнения определенных условий (статус “видимый”, “включенный” и т. д.). 

Пример:

await page.waitForSelector('input[name="username"]'); // Ожидание доступности поля ввода

Можно задать дополнительные условия, например дождаться, пока элемент станет видимым или включенным:

await page.waitForSelector('button#submit', { state: 'visible' }); // Ожидание видимости кнопки

Ожидание навигации 

Playwright может дождаться завершения навигации по странице, прежде чем выполнять дальнейшие действия, используя метод waitForNavigation()

Пример:

await page.click('a#next-page'); // Кликает ссылку
await page.waitForNavigation(); // Ожидание полной загрузки новой страницы

Это гарантирует, что скрипт не будет пытаться взаимодействовать с новой страницей или ее элементами, пока навигация не будет полностью завершена. 

Ожидание ответа сети 

В некоторых случаях может потребоваться дождаться завершения определенных сетевых запросов, например вызова API, вызванного нажатием кнопки. Для этого можно использовать функцию waitForResponse()

Пример:

await page.click('button#load-data');
await page.waitForResponse(response => response.url().includes('/api/data') && response.status() === 200);

Ожидание, пока сетевой запрос к /api/data не завершится успешным ответом. 

Ожидание таймаута

Бывают ситуации, когда необходима стандартная временная задержка (хотя в целом лучше ожидать определенных событий). В таких случаях можно использовать page.waitForTimeout(). Пример:

await page.waitForTimeout(5000); // Ждать 5 секунд

Не используйте таймауты без крайней необходимости, поскольку ожидание определенного события или условия — в целом более надежно. 

Обработка динамического контента

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

Бесконечная прокрутка

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

Пример:

await page.evaluate(() => {
  window.scrollBy(0, window.innerHeight); // Прокрутка на одну страницу
});
await page.waitForSelector('.new-content', { timeout: 5000 }); // Ожидание загрузки нового контента

Такой подход обеспечивает ожидание появления новых элементов после прокрутки, предотвращая попытки скрипта взаимодействовать с элементами, которые еще не загрузились. 

Обработка всплывающих окон и модалов 

Всплывающие окна и модалы, которые появляются динамически, иногда могут вызывать проблемы в тестовых скриптах. Методы Playwright waitForSelector() или waitForEvent() можно использовать для взаимодействия тестового сценария с всплывающими окнами только после их появления. 

Пример:

await page.click('#open-modal'); // Кликнуть и открыть модал
await page.waitForSelector('.modal', { state: 'visible' }); // Ожидание видимости модала
await page.click('.modal button#confirm'); // Взаимодействие с модалом

Обработка элементов с задержкой 

Иногда некоторые элементы требуют времени для загрузки из-за анимации, переходов или «ленивой» загрузки. Стандартные автоматические ожидания Playwright обычно хорошо справляются с этим, но вы можете использовать кастомные настраиваемые условия для более сложных случаев.

Пример:

await page.waitForSelector('.lazy-loaded', { timeout: 10000 }); // Ожидать 10 секунд ленивой загрузки контента

Лучшие практики механизмов ожидания 

Хотя механизмы ожидания Playwright являются достаточно мощными, важно использовать их с умом, чтобы избежать замедления выполнения тестов или их нестабильности. Вот несколько лучших практик: 

Лучше автоматическое ожидание 

Везде, где это возможно, используйте встроенные в Playwright автоматические ожидания. Избегайте использования явных (эксплицитных) ожиданий, таких как waitForTimeout(), если в них нет необходимости. 

Ожидание конкретных условий 

Всегда ожидайте конкретных условий, а не прописанных наугад таймаутов. Например, ожидайте появления элементов, завершения сетевых запросов, или завершения анимации. 

Используйте кастомные таймауты реже

Хотя в Playwright можно задавать кастомные таймауты (например timeout: 10000), используйте их как можно реже. Вместо этого старайтесь дожидаться определенных событий или элементов.

Отладка с помощью Trace Viewer 

Если вы не знаете, почему тест не работает, и подозреваете какие-то проблемы с таймингом в тесте, вам поможет встроенный трассировщик Trace Viewer. Вы можете записать трассировку выполнения тестов и затем просмотреть ее, чтобы проконтролировать, как Playwright работает с динамическим контентом в этом тесте. 

Пример включения трассировки:

await page.tracing.start({ screenshots: true, snapshots: true });
await page.goto('https://example.com');
await page.tracing.stop({ path: 'trace.zip' });

Решение проблем с динамическим контентом

Отладка тестов с динамическим содержимым может быть сложной задачей, но в Playwright есть несколько инструментов, облегчающих задачу: 

  • Headed-режим: Запускайте тесты с интерфейсом браузера (а не в безголовом режиме), чтобы наглядно увидеть, как загружается динамический контент, и найти проблемы с таймингом.
npx playwright test --headed
  • Playwright Inspector: Используйте Inspector, чтобы проверять тесты и взаимодействовать с элементами во время выполнения.
npx playwright test --debug
  • Трассировщик (Trace Viewer): Записывайте и воспроизводите трассировки тестовых прогонов, чтобы проследить, как элементы загружаются и взаимодействуют друг с другом.
npx playwright show-trace trace.zip

Заключение

Итак, в этом блоге мы рассмотрели: 

  • Автоматическое ожидание и то, как Playwright обрабатывает состояния элементов. 
  • Специальные стратегии ожиданий для селекторов, навигации и сетевых запросов. 
  • Техники работы с динамическим контентом, включая бесконечную прокрутку, всплывающие окна и задержку загрузки. 
  • Лучшие практики для обеспечения надежности и эффективности тестов.

Manish Saini


Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

1 КОММЕНТАРИЙ

Подписаться
Уведомить о
guest

1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Евгений
Евгений
14 дней назад

Отличная статья по ожиданиям! Спасибо автору!

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

? Популярное

? Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас