Skip to main content

Тайм-ауты

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, но они не делят время с каким-либо тестом.

Установить тайм-аут теста в конфигурации

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
timeout: 120_000,
});

Ссылка на API: testConfig.timeout.

Установить тайм-аут для одного теста

example.spec.ts
import { test, expect } from '@playwright/test';

test('slow test', async ({ page }) => {
test.slow(); // Легкий способ утроить тайм-аут по умолчанию
// ...
});

test('very slow test', async ({ page }) => {
test.setTimeout(120_000);
// ...
});

Ссылка на API: test.setTimeout() и test.slow().

Изменить тайм-аут из хука beforeEach

example.spec.ts
import { test, expect } from '@playwright/test';

test.beforeEach(async ({ page }, testInfo) => {
// Увеличить тайм-аут для всех тестов, использующих этот хук, на 30 секунд.
testInfo.setTimeout(testInfo.timeout + 30_000);
});

Ссылка на API: testInfo.setTimeout().

Изменить тайм-аут для хука beforeAll/afterAll

Хуки beforeAll и afterAll имеют отдельный тайм-аут, по умолчанию равный тайм-ауту теста. Вы можете изменить его отдельно для каждого хука, вызвав testInfo.setTimeout() внутри хука.

example.spec.ts
import { test, expect } from '@playwright/test';

test.beforeAll(async () => {
// Установить тайм-аут для этого хука.
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')"

Установить тайм-аут ожидания в конфигурации

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
expect: {
timeout: 10_000,
},
});

Ссылка на API: testConfig.expect.

Указать тайм-аут ожидания для одного утверждения

example.spec.ts
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

Вы можете установить глобальный тайм-аут в конфигурации.

playwright.config.ts
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/afterAll30_000 мсТайм-аут для хука
Установить в хуке
test.setTimeout(60_000)
Тайм-аут фикстурынет тайм-аутаТайм-аут для отдельной фикстуры
Установить в фикстуре
{ scope: 'test', timeout: 30_000 }

Установить тайм-ауты действий и навигации в конфигурации

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
use: {
actionTimeout: 10 * 1000,
navigationTimeout: 30 * 1000,
},
});

Ссылка на API: testOptions.actionTimeout и testOptions.navigationTimeout.

Установить тайм-аут для одного действия

example.spec.ts
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 });
});

Тайм-аут фикстуры

По умолчанию фикстура делит тайм-аут с тестом. Однако для медленных фикстур, особенно связанных с рабочими, удобно иметь отдельный тайм-аут. Таким образом, вы можете сохранить общий тайм-аут теста небольшим и дать медленной фикстуре больше времени.

example.spec.ts
import { test as base, expect } from '@playwright/test';

const test = base.extend<{ slowFixture: string }>({
slowFixture: [async ({}, use) => {
// ... выполнить медленную операцию ...
await use('hello');
}, { timeout: 60_000 }]
});

test('example test', async ({ slowFixture }) => {
// ...
});

Ссылка на API: test.extend().