← Back to microsoft/playwright
microsoft / playwright · Issue No. 42808
1.64.0-next (main @ 07f1a6154); also affects 1.59 through 1.63
playwright.config.ts:
export default { timeout: 1000 };
a.spec.ts (this is the documented form from the test.slow docs, "You can mark all tests in a file or test.describe group as slow ... by passing a callback"):
import { test } from '@playwright/test';
test.slow(({ browserName }) => browserName === 'chromium', 'all tests are slow in chromium');
test('first', async ({}) => {
console.log('first timeout=' + test.info().timeout);
await new Promise(r => setTimeout(r, 1500));
});
test('second', async ({}) => {
console.log('second timeout=' + test.info().timeout);
await new Promise(r => setTimeout(r, 1500));
});
npx playwright test --workers=1
Both tests run with a 3000ms timeout and pass.
first timeout=1000
1) a.spec.ts:5:5 › first ─── Test timeout of 1000ms exceeded.
second timeout=1000
2) a.spec.ts:10:5 › second ─ Test timeout of 1000ms exceeded.
2 failed
The first test never gets the extended timeout. When it fails, the worker restarts, the modifier re-runs for the next test and again does not apply, so every test in the file fails at the base timeout. The same happens with test.slow(() => true).
If the tests do not time out, the second and later tests do get 3000ms (the slow annotation is inherited by subsequent tests in the suite), which hides the problem until a test really needs the extra time.
browserName, or no fixtures at all) is classified as a beforeAll-style hook and runs in its own time slot (workerMain.ts, _runAllHooksForSuite).TimeoutManager.slow() triples the currently running slot (this._running.slot) instead of the test's default slot, so the modifier's private slot is tripled and the test's timeout is untouched.test.slow() idempotency, 1.59) the _slow flag is set on that first call, so the inherited annotation or a later test.slow() in the test body is a no-op.The same mechanism affects test.slow() called from a fixture that has its own { timeout }: the fixture slot is tripled, the test slot is not, and a subsequent test.slow() in the test body silently does nothing.
I intend to work on this and will send a PR.
- Operating System: macOS (Darwin 25.6.0)
- Node.js: 24.8.0
- Browser: Chromium (bundled r1246)
- Playwright: main @ 07f1a6154
Relay reads this issue against the repository's contribution signals: the files it is likely to touch, how the maintainers triage work this size, and what the first contribution would exercise.
The full analysis for this issue is still being assembled. Until then, the description above and the thread on GitHub are the most reliable context.