diff --git a/docs/src/test-api/class-test.md b/docs/src/test-api/class-test.md
index f20562e557..4faf65c989 100644
--- a/docs/src/test-api/class-test.md
+++ b/docs/src/test-api/class-test.md
@@ -943,7 +943,7 @@ test('very slow test', async ({ page }) => {
});
```
-Changing timeout from a slow hook:
+Changing timeout from a slow `beforeEach` or `afterEach` hook. Note that this affects the test timeout that is shared with `beforeEach`/`afterEach` hooks.
```js js-flavor=js
const { test, expect } = require('@playwright/test');
@@ -963,6 +963,54 @@ test.beforeEach(async ({ page }, testInfo) => {
});
```
+Changing timeout for a `beforeAll` or `afterAll` hook. Note this affects the hook's timeout, not the test timeout.
+
+```js js-flavor=js
+const { test, expect } = require('@playwright/test');
+
+test.beforeAll(async () => {
+ // Set timeout for this hook.
+ test.setTimeout(60000);
+});
+```
+
+```js js-flavor=ts
+import { test, expect } from '@playwright/test';
+
+test.beforeAll(async () => {
+ // Set timeout for this hook.
+ test.setTimeout(60000);
+});
+```
+
+Changing timeout for all tests in a [`method: Test.describe`] group.
+
+```js js-flavor=js
+const { test, expect } = require('@playwright/test');
+
+test.describe('group', () => {
+ // Applies to all tests in this group.
+ test.setTimeout(60000);
+
+ test('test one', async () => { /* ... */ });
+ test('test two', async () => { /* ... */ });
+ test('test three', async () => { /* ... */ });
+});
+```
+
+```js js-flavor=ts
+import { test, expect } from '@playwright/test';
+
+test.describe('group', () => {
+ // Applies to all tests in this group.
+ test.setTimeout(60000);
+
+ test('test one', async () => { /* ... */ });
+ test('test two', async () => { /* ... */ });
+ test('test three', async () => { /* ... */ });
+});
+```
+
Timeout for the currently running test is available through [`property: TestInfo.timeout`].
### param: Test.setTimeout.timeout
@@ -1175,6 +1223,10 @@ test('slow test', async ({ page }) => {
});
```
+:::note
+[`method: Test.slow#1`] cannot be used in a `beforeAll` or `afterAll` hook. Use [`method: Test.setTimeout`] instead.
+:::
+
## method: Test.slow#2
Conditionally mark a test as "slow" with an optional description. Slow test will be given triple the default timeout.
diff --git a/docs/src/test-timeouts-js.md b/docs/src/test-timeouts-js.md
index 62c9bc70b8..660e10c6f1 100644
--- a/docs/src/test-timeouts-js.md
+++ b/docs/src/test-timeouts-js.md
@@ -16,6 +16,7 @@ Playwright Test has multiple configurable timeouts for various tasks.
|Action timeout| no timeout |Timeout for each action:
Set default
{`config = { use: { actionTimeout: 10000 } }`}
Override
`locator.click({ timeout: 10000 })` |
|Navigation timeout| no timeout |Timeout for each navigation action:
Set default
{`config = { use: { navigationTimeout: 30000 } }`}
Override
`page.goto('/', { timeout: 30000 })` |
|Global timeout|no timeout |Global timeout for the whole test run:
Set in config
`config = { globalTimeout: 60*60*1000 }`
|
+|`beforeAll`/`afterAll` timeout|30000 ms|Timeout for the hook:
Set in hook
`test.setTimeout(60000)`
|
|Fixture timeout|no timeout |Timeout for an individual fixture:
Set in fixture
`{ scope: 'test', timeout: 30000 }`
|
## Test timeout
@@ -30,7 +31,7 @@ example.spec.ts:3:1 › basic test ===========================
Timeout of 30000ms exceeded.
```
-The same test timeout also applies to `beforeAll` and `afterAll` hooks.
+The same timeout value also applies to `beforeAll` and `afterAll` hooks, but they do not share time with any test.
### Set test timeout in the config
@@ -90,7 +91,7 @@ test('very slow test', async ({ page }) => {
API reference: [`method: Test.setTimeout`] and [`method: Test.slow#1`].
-### Change timeout from a hook
+### Change timeout from a slow hook
```js js-flavor=js
const { test, expect } = require('@playwright/test');
@@ -112,6 +113,30 @@ test.beforeEach(async ({ page }, testInfo) => {
API reference: [`method: TestInfo.setTimeout`].
+### Change timeout for `beforeAll`/`afterAll` hook
+
+`beforeAll` and `afterAll` hooks have a separate timeout, by default equal to test timeout. You can change it separately for each hook by calling [`method: TestInfo.setTimeout`] inside the hook.
+
+```js js-flavor=js
+const { test, expect } = require('@playwright/test');
+
+test.beforeAll(async () => {
+ // Set timeout for this hook.
+ test.setTimeout(60000);
+});
+```
+
+```js js-flavor=ts
+import { test, expect } from '@playwright/test';
+
+test.beforeAll(async () => {
+ // Set timeout for this hook.
+ test.setTimeout(60000);
+});
+```
+
+API reference: [`method: TestInfo.setTimeout`].
+
## Expect timeout
Web-first assertions like `expect(locator).toHaveText()` have a separate timeout, 5 seconds by default. Assertion timeout is unrelated to the test timeout. It produces the following error:
diff --git a/packages/playwright-test/types/test.d.ts b/packages/playwright-test/types/test.d.ts
index 95401720f0..e013500181 100644
--- a/packages/playwright-test/types/test.d.ts
+++ b/packages/playwright-test/types/test.d.ts
@@ -2144,6 +2144,8 @@ export interface TestType NOTE: [test.slow()](https://playwright.dev/docs/api/class-test#test-slow-1) cannot be used in a `beforeAll` or
+ * `afterAll` hook. Use [test.setTimeout(timeout)](https://playwright.dev/docs/api/class-test#test-set-timeout) instead.
*/
slow(): void;
/**
@@ -2196,7 +2198,8 @@ export interface TestType {
+ * // Set timeout for this hook.
+ * test.setTimeout(60000);
+ * });
+ * ```
+ *
+ * Changing timeout for all tests in a
+ * [test.describe(title, callback)](https://playwright.dev/docs/api/class-test#test-describe) group.
+ *
+ * ```ts
+ * import { test, expect } from '@playwright/test';
+ *
+ * test.describe('group', () => {
+ * // Applies to all tests in this group.
+ * test.setTimeout(60000);
+ *
+ * test('test one', async () => { /* ... *\/ });
+ * test('test two', async () => { /* ... *\/ });
+ * test('test three', async () => { /* ... *\/ });
+ * });
+ * ```
+ *
* Timeout for the currently running test is available through
* [testInfo.timeout](https://playwright.dev/docs/api/class-testinfo#test-info-timeout).
* @param timeout Timeout in milliseconds.