Таймауты
В Playwright Test есть несколько настраиваемых таймаутов для различных задач.
| Таймаут | По умолчанию | Описание |
|---|---|---|
| Таймаут теста | 30 000 мс | Таймаут для каждого теста Устанавливается в конфигурации { timeout: 60_000 }Переопределяется в тесте test.setTimeout(120_000)
|
| Таймаут ожидания | 5 000 мс | Таймаут для каждого утверждения Устанавливается в конфигурации { expect: { timeout: 10_000 } }Переопределяется в тесте expect(locator).toBeVisible({ timeout: 10_000 })
|
Таймаут теста
Playwright Test накладывает таймаут на каждый тест, по умолчанию 30 секунд. Время, затраченное функцией теста, настройкой фикстуры и beforeEach хуками, учитывается в таймауте теста.
Тест, который превысил таймаут, выводит следующую ошибку:
example.spec.ts:3:1 › basic test =========================== Timeout of 30000ms exceeded.
Дополнительный отдельный таймаут, того же значения, разделяется между разбором фикстуры и afterEach хуками после завершения функции теста.
То же значение таймаута также применяется к beforeAll и afterAll хукам, но они не разделяют время ни с каким тестом.
Установить таймаут теста в конфигурации
import { defineConfig } from '@playwright/test';
export default defineConfig({
timeout: 120_000,
}); Ссылка на API: testConfig.timeout.
Установить таймаут для отдельного теста
import { test, expect } from '@playwright/test';
test('slow test', async ({ page }) => {
test.slow(); // Easy way to triple the default timeout
// ...
});
test('very slow test', async ({ page }) => {
test.setTimeout(120_000);
// ...
}); Ссылка на API: test.setTimeout() и test.slow().
Изменить таймаут из beforeEach хука
import { test, expect } from '@playwright/test';
test.beforeEach(async ({ page }, testInfo) => {
// Extend timeout for all tests running this hook by 30 seconds.
testInfo.setTimeout(testInfo.timeout + 30_000);
}); Ссылка на API: testInfo.setTimeout().
Изменить таймаут для beforeAll/afterAll хука
beforeAll и afterAll хуки имеют отдельный таймаут, по умолчанию равный таймауту теста. Вы можете изменить его отдельно для каждого хука, вызвав testInfo.setTimeout() внутри хука.
import { test, expect } from '@playwright/test';
test.beforeAll(async () => {
// Set timeout for this hook.
test.setTimeout(60000);
}); Ссылка на API: testInfo.setTimeout().
Таймаут ожидания
Автоповторные утверждения, такие как expect(locator).toHaveText(), имеют отдельный таймаут, по умолчанию 5 секунд. Таймаут утверждения не связан с таймаутом теста. Он выводит следующую ошибку:
example.spec.ts:3:1 › basic test ===========================
Error: expect(received).toHaveText(expected)
Expected string: "my text"
Received string: ""
Call log:
- expect.toHaveText with timeout 5000ms
- waiting for "locator('button')" Установить таймаут ожидания в конфигурации
import { defineConfig } from '@playwright/test';
export default defineConfig({
expect: {
timeout: 10_000,
},
}); Ссылка на API: testConfig.expect.
Указать таймаут ожидания для отдельного утверждения
import { test, expect } from '@playwright/test';
test('example', async ({ page }) => {
await expect(locator).toHaveText('hello', { timeout: 10_000 });
}); Глобальный таймаут
Playwright Test поддерживает таймаут для всего выполнения теста. Это предотвращает чрезмерное использование ресурсов, когда всё пошло не так. Глобального таймаута по умолчанию нет, но вы можете установить разумный в конфигурации, например, один час. Глобальный таймаут выводит следующую ошибку:
Running 1000 tests using 10 workers 514 skipped 486 passed Timed out waiting 3600s for the entire test run
Вы можете установить глобальный таймаут в конфигурации.
import { defineConfig } from '@playwright/test';
export default defineConfig({
globalTimeout: 3_600_000,
}); Ссылка на API: testConfig.globalTimeout.
Расширенные: таймауты низкого уровня
Это таймауты низкого уровня, предварительно настроенные исполнителем теста, вам не нужно их изменять. Если вы оказались в этом разделе, потому что ваши тесты нестабильны, скорее всего, вам нужно искать решение где-то в другом месте.
| Таймаут | По умолчанию | Описание |
|---|---|---|
| Таймаут действия | нет таймаута | Таймаут для каждого действия Устанавливается в конфигурации { use: { actionTimeout: 10_000 } }Переопределяется в тесте locator.click({ timeout: 10_000 })
|
| Таймаут навигации | нет таймаута | Таймаут для каждого действия навигации Устанавливается в конфигурации { use: { navigationTimeout: 30_000 } }Переопределяется в тесте page.goto('/', { timeout: 30_000 })
|
| Глобальный таймаут | нет таймаута | Глобальный таймаут для всего выполнения теста Устанавливается в конфигурации { globalTimeout: 3_600_000 } |
beforeAll/afterAll таймаут |
30 000 мс | Таймаут для хука Устанавливается в хуке test.setTimeout(60_000) |
| Таймаут фикстуры | нет таймаута | Таймаут для отдельной фикстуры Устанавливается в фикстуре { scope: 'test', timeout: 30_000 } |
Установить таймауты действий и навигации в конфигурации
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
actionTimeout: 10 * 1000,
navigationTimeout: 30 * 1000,
},
}); Ссылка на API: testOptions.actionTimeout и testOptions.navigationTimeout.
Установить таймаут для отдельного действия
import { test, expect } from '@playwright/test';
test('basic test', async ({ page }) => {
await page.goto('https://playwright.dev', { timeout: 30000 });
await page.getByText('Get Started').click({ timeout: 10000 });
}); Таймаут фикстуры
По умолчанию фикстура разделяет таймаут с тестом. Однако для медленных фикстур, особенно рабочих, удобно иметь отдельный таймаут. Таким образом, вы можете поддерживать общий таймаут теста небольшим и дать медленной фикстуре больше времени.
import { test as base, expect } from '@playwright/test';
const test = base.extend<{ slowFixture: string }>({
slowFixture: [async ({}, use) => {
// ... perform a slow operation ...
await use('hello');
}, { timeout: 60_000 }]
});
test('example test', async ({ slowFixture }) => {
// ...
}); Ссылка на API: test.extend().
© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/test-timeouts