TGViewer
Сергей Лебедев | QA Сергей Лебедев | QA @qabigtech · 5.69K subscribers
Post #227 2.7K
20 день моего погружения в автоматизацию на TS+Playwright и сегодня хочу поговорить про ожидания !

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


Базово в Selenium используется Polling-based подход:
Selenium постоянно опрашивает DOM каждые 500мс

В Playwright же используется Event-driven подход:
Playwright слушает события браузера и реагирует мгновенно

И это уже жирнючий плюс к скорости PW автотестов!


Подготовил для себя и вас памятку по ожиданиям в PW , сохрани чтобы не потерять :

Явные ожидания элементов на странице:
test('явные ожидания элементов', async ({ page }) => {
await page.goto('https://example.com')
// Ожидание появления элемента
await page.locator('#dynamic-content').waitFor()
// Ожидание видимости
await page.locator('.modal').waitFor({ state: 'visible' })
// Ожидание скрытия
await page.locator('.loading-spinner').waitFor({
state: 'hidden',
timeout: 5000
})
// Ожидание присутствия в DOM
await page.locator('#new-item').waitFor({ state: 'attached' })
// Ожидание удаления из DOM
await page.locator('#removed-item').waitFor({ state: 'detached' })
})

Ожидания страницы:
test('ожидания состояния страницы', async ({ page }) => {
await page.goto('https://example.com')
// Ожидание полной загрузки
await page.waitForLoadState('load')
// Ожидание завершения сетевых запросов
await page.waitForLoadState('networkidle')
// Ожидание готовности DOM
await page.waitForLoadState('domcontentloaded')
// Ожидание конкретного URL
await page.waitForURL('**/dashboard')
})

Ожидание API запросов: (работает из коробки и постоянно использую в АТ)
test('ожидания API запросов', async ({ page }) => {
// Ожидание конкретного запроса
const responsePromise = page.waitForResponse('**/api/users')
await page.locator('#load-users').click()
const response = await responsePromise
expect(response.status()).toBe(200)
// Ожидание запроса с условием
const apiResponse = page.waitForResponse(response =>
response.url().includes('/api/data') && response.status() === 200
)
})

Ожидания событий:
test('ожидания событий браузера', async ({ page }) => {
// Ожидание новой страницы/вкладки
const [newPage] = await Promise.all([
page.context().waitForEvent('page'),
page.locator('#open-new-tab').click()
])
// Ожидание скачивания файла
const [download] = await Promise.all([
page.waitForEvent('download'),
page.locator('#download-btn').click()
])
await download.saveAs('./downloads/' + download.suggestedFilename())
})

И кастомные ожидания с waitForFunction:
test('кастомные ожидания', async ({ page }) => {
await page.goto('https://example.com')
// Ожидание изменения количества элементов
await page.waitForFunction(() => {
return document.querySelectorAll('.item').length > 5
})
})


На собесах, вопросы про ожидания в автотестах тоже часто присутствуют, поэтому сохраняй, чтобы не забыть !

С вас 🎉 если было полезно!

#воскрессобес
  • ❤ 5
  • 👍 3
  • 🔥 3
More from @qabigtech
  1. Sep 27, 2026Всем добрейшего воскресенья 🎉 Через час, в 19:00 по мск, встречаемся на эфире: https://ww…
  2. Sep 25, 2026Всех с пятницей, коллеги! У нас в чате тестировщиков весь день одни мемы и крайне нерабоча…
  3. Sep 24, 2026Сегодня финал нашего марафона в «AQA за 60 дней». 18 уроков, 243 пулреквеста, десятки заме…
  4. Sep 23, 2026Мой последний SQA Days прошёл примерно так как на фото выше! Я слушал много докладов, сним…
  5. Sep 21, 2026Уже через несколько минут, в 21:00, пишем крутое резюме для хордового QA Джуна с автоматиз…
  6. Sep 20, 2026На YouTube вышла 2-я часть нашего исследования рынка QA-профессии: https://www.youtube.com…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →