Тестирование Playwright
Playwright Test предоставляет функцию test для объявления тестов и функцию expect для написания утверждений.
import { test, expect } from '@playwright/test';
test('basic test', async ({ page }) => {
await page.goto('https://playwright.dev/');
const name = await page.innerText('.navbar__title');
expect(name).toBe('Playwright');
}); Методы
test
Объявляет тест.
test(title, body)test(title, details, body)
Использование
import { test, expect } from '@playwright/test';
test('basic test', async ({ page }) => {
await page.goto('https://playwright.dev/');
// ...
}); Теги
Вы можете добавлять теги к тестам, указывая дополнительные сведения о тесте. Также можно включить теги в название теста. Обратите внимание: каждый тег должен начинаться с символа @.
import { test, expect } from '@playwright/test';
test('basic test', {
tag: '@smoke',
}, async ({ page }) => {
await page.goto('https://playwright.dev/');
// ...
});
test('another test @smoke', async ({ page }) => {
await page.goto('https://playwright.dev/');
// ...
}); Теги тестов отображаются в отчете о тестировании и доступны пользовательскому репортеру через свойство TestCase.tags.
Также можно фильтровать тесты по тегам во время выполнения тестов:
- в командной строке;
- в конфигурации с помощью testConfig.grep и testProject.grep;
Подробнее о добавлении тегов.
Аннотации
Вы можете добавлять аннотации к тестам, указывая дополнительные сведения о тесте.
import { test, expect } from '@playwright/test';
test('basic test', {
annotation: {
type: 'issue',
description: 'https://github.com/microsoft/playwright/issues/23180',
},
}, async ({ page }) => {
await page.goto('https://playwright.dev/');
// ...
}); Аннотации тестов отображаются в отчете о тестировании и доступны пользовательскому репортеру через свойство TestCase.annotations.
Также можно добавлять аннотации во время выполнения, изменяя testInfo.annotations.
Подробнее об аннотациях тестов.
Блокировки
Вы можете объявлять именованные блокировки, чтобы определенные тесты не выполнялись одновременно, в то время как все остальные тесты продолжали выполняться параллельно. Тесты с одинаковым именем блокировки никогда не выполняются одновременно, даже если они объявлены в разных файлах или относятся к разным проектам. Это полезно, когда несколько тестов обращаются к общему ресурсу, который не поддерживает параллельный доступ.
import { test, expect } from '@playwright/test';
test('update user settings', {
lock: 'user-settings',
}, async ({ page }) => {
// This test never runs concurrently with other tests
// that declare the 'user-settings' lock.
}); Подробнее о блокировках тестов.
Аргументы
-
titlestringНазвание теста.
-
detailsObject (необязательно)Дополнительные сведения о тесте.
-
bodyfunction(Fixtures, TestInfo)Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.
test.abort
Прерывает выполняющийся тест, выбрасывая ошибку. Тест сразу же помечается как неуспешный, и выполнение останавливается. Это полезно внутри фикстуры или обработчика маршрута, если вы обнаружили неисправимое неправильное использование и хотите немедленно завершить тест с ошибкой.
Использование
import { test, expect } from '@playwright/test';
test('does not publish to shared page', async ({ page }) => {
await page.route('**/publish', route => {
test.abort('Tests must not publish to the shared page. Use the `clone` option.');
return route.abort();
});
// ...
}); Аргументы
-
messagestring (необязательно)Необязательное сообщение с описанием причины прерывания. Оно будет включено в сообщение об ошибке.
test.afterAll
Объявляет хук afterAll, который выполняется один раз для каждого рабочего процесса после всех тестов.
При вызове в области файла тестов выполняется после всех тестов в файле. При вызове внутри группы test.describe() выполняется после всех тестов в группе.
Использование
test.afterAll(async () => {
console.log('Done with tests');
// ...
}); Кроме того, можно объявить хук с названием.
test.afterAll('Teardown', async () => {
console.log('Done with tests');
// ...
}); Аргументы
-
titlestring (необязательно)Название хука.
-
hookFunctionfunction(Fixtures, TestInfo)Функция хука, принимающая один или два аргумента: объект с фикстурами рабочего процесса и необязательный TestInfo.
Подробности
Если добавлено несколько хуков afterAll, они будут выполняться в порядке регистрации.
Обратите внимание: при сбое теста рабочий процесс перезапускается, и хук afterAll снова выполняется в новом рабочем процессе. Подробнее о рабочих процессах и сбоях.
Playwright продолжит выполнять все применимые хуки, даже если некоторые из них завершились с ошибкой.
test.afterAll(hookFunction)test.afterAll(title, hookFunction)
test.afterEach
Объявляет хук afterEach, который выполняется после каждого теста.
При вызове в области файла тестов выполняется после каждого теста в файле. При вызове внутри группы test.describe() выполняется после каждого теста в группе.
Вам доступны те же фикстуры, что и самому телу теста, а также объект TestInfo, содержащий множество полезных сведений. Например, можно проверить, завершился ли тест успешно или с ошибкой.
test.afterEach(hookFunction)test.afterEach(title, hookFunction)
Использование
import { test, expect } from '@playwright/test';
test.afterEach(async ({ page }) => {
console.log(`Finished ${test.info().title} with status ${test.info().status}`);
if (test.info().status !== test.info().expectedStatus)
console.log(`Did not run as expected, ended up at ${page.url()}`);
});
test('my test', async ({ page }) => {
// ...
}); Кроме того, можно объявить хук с названием.
test.afterEach('Status check', async ({ page }) => {
if (test.info().status !== test.info().expectedStatus)
console.log(`Did not run as expected, ended up at ${page.url()}`);
}); Аргументы
-
titlestring (необязательно)Название хука.
-
hookFunctionfunction(Fixtures, TestInfo)Функция хука, принимающая один или два аргумента: объект с фикстурами и необязательный TestInfo.
Подробности
Если добавлено несколько хуков afterEach, они будут выполняться в порядке регистрации.
Playwright продолжит выполнять все применимые хуки, даже если некоторые из них завершились с ошибкой.
test.beforeAll
Объявляет хук beforeAll, который выполняется один раз в каждом рабочем процессе перед всеми тестами.
При вызове в области файла тестов выполняется перед всеми тестами в файле. При вызове внутри группы test.describe() выполняется перед всеми тестами в группе.
Можно использовать test.afterAll(), чтобы освободить ресурсы, созданные в beforeAll.
test.beforeAll(hookFunction)test.beforeAll(title, hookFunction)
Использование
import { test, expect } from '@playwright/test';
test.beforeAll(async () => {
console.log('Before tests');
});
test.afterAll(async () => {
console.log('After tests');
});
test('my test', async ({ page }) => {
// ...
}); Кроме того, можно объявить хук с названием.
test.beforeAll('Setup', async () => {
console.log('Before tests');
}); Аргументы
-
titlestring (необязательно)Название хука.
-
hookFunctionfunction(Fixtures, TestInfo)Функция хука, принимающая один или два аргумента: объект с фикстурами рабочего процесса и необязательный TestInfo.
Подробности
Если добавлено несколько хуков beforeAll, они будут выполняться в порядке регистрации.
Обратите внимание: при сбое теста рабочий процесс перезапускается, и хук beforeAll снова выполняется в новом рабочем процессе. Подробнее о рабочих процессах и сбоях.
Playwright продолжит выполнять все применимые хуки, даже если некоторые из них завершились с ошибкой.
test.beforeEach
Объявляет хук beforeEach, который выполняется перед каждым тестом.
При вызове в области файла тестов выполняется перед каждым тестом в файле. При вызове внутри группы test.describe() выполняется перед каждым тестом в группе.
Вам доступны те же фикстуры, что и самому телу теста, а также объект TestInfo, содержащий множество полезных сведений. Например, можно перейти на страницу до начала теста.
Можно использовать test.afterEach(), чтобы освободить ресурсы, созданные в beforeEach.
test.beforeEach(hookFunction)test.beforeEach(title, hookFunction)
Использование
import { test, expect } from '@playwright/test';
test.beforeEach(async ({ page }) => {
console.log(`Running ${test.info().title}`);
await page.goto('https://my.start.url/');
});
test('my test', async ({ page }) => {
expect(page.url()).toBe('https://my.start.url/');
}); Кроме того, можно объявить хук с названием.
test.beforeEach('Open start URL', async ({ page }) => {
console.log(`Running ${test.info().title}`);
await page.goto('https://my.start.url/');
}); Аргументы
-
titlestring (необязательно)Название хука.
-
hookFunctionfunction(Fixtures, TestInfo)Функция хука, принимающая один или два аргумента: объект с фикстурами и необязательный TestInfo.
Подробности
Если добавлено несколько хуков beforeEach, они будут выполняться в порядке регистрации.
Playwright продолжит выполнять все применимые хуки, даже если некоторые из них завершились с ошибкой.
test.describe
Объявляет группу тестов.
test.describe(title, callback)test.describe(callback)test.describe(title, details, callback)
Использование
Вы можете объявить группу тестов с названием. Название будет отображаться в отчете о тестировании как часть названия каждого теста.
test.describe('two tests', () => {
test('one', async ({ page }) => {
// ...
});
test('two', async ({ page }) => {
// ...
});
}); Анонимная группа
Также можно объявить группу тестов без названия. Это удобно, чтобы задать общую настройку для группы тестов с помощью test.use().
test.describe(() => {
test.use({ colorScheme: 'dark' });
test('one', async ({ page }) => {
// ...
});
test('two', async ({ page }) => {
// ...
});
}); Теги
Вы можете добавлять теги ко всем тестам в группе, указывая дополнительные сведения. Обратите внимание: каждый тег должен начинаться с символа @.
import { test, expect } from '@playwright/test';
test.describe('two tagged tests', {
tag: '@smoke',
}, () => {
test('one', async ({ page }) => {
// ...
});
test('two', async ({ page }) => {
// ...
});
}); Подробнее о добавлении тегов.
Аннотации
Вы можете добавлять аннотации ко всем тестам в группе, указывая дополнительные сведения.
import { test, expect } from '@playwright/test';
test.describe('two annotated tests', {
annotation: {
type: 'issue',
description: 'https://github.com/microsoft/playwright/issues/23180',
},
}, () => {
test('one', async ({ page }) => {
// ...
});
test('two', async ({ page }) => {
// ...
});
}); Подробнее об аннотациях тестов.
Блокировки
Вы можете объявлять именованные блокировки для всех тестов в группе, указывая дополнительные сведения. Тесты с одинаковым именем блокировки никогда не выполняются одновременно. Подробнее о блокировках тестов.
import { test, expect } from '@playwright/test';
test.describe('two tests with a lock', {
lock: 'user-settings',
}, () => {
test('one', async ({ page }) => {
// ...
});
test('two', async ({ page }) => {
// ...
});
}); Аргументы
-
titlestring (необязательно)Название группы.
-
detailsObject (необязательно)Дополнительные сведения для всех тестов в группе.
-
callbackfunctionФункция обратного вызова, которая выполняется сразу при вызове test.describe(). Все тесты, объявленные в этой функции, будут относиться к группе.
test.describe.configure
Настраивает охватывающую область. Может выполняться как на верхнем уровне, так и внутри describe. Конфигурация применяется ко всей области независимо от того, была ли она выполнена до или после объявления теста.
Подробнее о режимах выполнения здесь.
Использование
-
Параллельное выполнение тестов.
// Run all the tests in the file concurrently using parallel workers. test.describe.configure({ mode: 'parallel' }); test('runs in parallel 1', async ({ page }) => {}); test('runs in parallel 2', async ({ page }) => {}); -
Выполнение тестов по порядку с независимым повторным запуском каждого неудачного теста.
Это режим по умолчанию. Его можно задать явно, чтобы переопределить конфигурацию проекта, в которой используется
fullyParallel.// Tests in this file run in order. Retries, if any, run independently. test.describe.configure({ mode: 'default' }); test('runs first', async ({ page }) => {}); test('runs second', async ({ page }) => {}); -
Последовательное выполнение тестов с повторным запуском с самого начала. Если один из последовательных тестов завершается с ошибкой, все последующие тесты пропускаются.
примечаниеПоследовательное выполнение не рекомендуется. Обычно лучше изолировать тесты, чтобы их можно было запускать независимо.
// Annotate tests as inter-dependent. test.describe.configure({ mode: 'serial' }); test('runs first', async ({ page }) => {}); test('runs second', async ({ page }) => {}); -
Настройка количества повторных запусков и времени ожидания для каждого теста.
// Each test in the file will be retried twice and have a timeout of 20 seconds. test.describe.configure({ retries: 2, timeout: 20_000 }); test('runs first', async ({ page }) => {}); test('runs second', async ({ page }) => {}); -
Параллельное выполнение нескольких describe, но последовательное выполнение тестов внутри каждого describe.
test.describe.configure({ mode: 'parallel' }); test.describe('A, runs in parallel with B', () => { test.describe.configure({ mode: 'default' }); test('in order A1', async ({ page }) => {}); test('in order A2', async ({ page }) => {}); }); test.describe('B, runs in parallel with A', () => { test.describe.configure({ mode: 'default' }); test('in order B1', async ({ page }) => {}); test('in order B2', async ({ page }) => {}); });
Аргументы
-
optionsObject (необязательно)-
mode"default" | "parallel" | "serial" (необязательно)Режим выполнения. Подробнее о режимах выполнения здесь.
-
retriesnumber (необязательно)Количество повторных запусков для каждого теста.
-
timeoutnumber (необязательно)Время ожидания для каждого теста в миллисекундах. Переопределяет testProject.timeout и testConfig.timeout.
-
test.describe.fixme
Объявляет группу тестов, аналогично test.describe(). Тесты в этой группе помечаются как "fixme" и не выполняются.
test.describe.fixme(title, callback)test.describe.fixme(callback)test.describe.fixme(title, details, callback)
Использование
test.describe.fixme('broken tests that should be fixed', () => {
test('example', async ({ page }) => {
// This test will not run
});
}); Также можно опустить название.
test.describe.fixme(() => {
// ...
}); Аргументы
-
titlestring (необязательно)Название группы.
-
detailsObject (необязательно)Подробное описание см. в test.describe().
-
callbackfunctionФункция обратного вызова, которая выполняется сразу при вызове test.describe.fixme(). Все тесты, добавленные в эту функцию, будут относиться к группе и не будут выполняться.
test.describe.only
Объявляет группу тестов с фокусом. Если есть тесты или наборы тестов с фокусом, будут выполняться только они.
test.describe.only(title, callback)test.describe.only(callback)test.describe.only(title, details, callback)
Использование
test.describe.only('focused group', () => {
test('in the focused group', async ({ page }) => {
// This test will run
});
});
test('not in the focused group', async ({ page }) => {
// This test will not run
}); Также можно опустить название.
test.describe.only(() => {
// ...
}); Аргументы
-
titlestring (необязательно)Название группы.
-
detailsObject (необязательно)Подробное описание см. в test.describe().
-
callbackfunctionФункция обратного вызова, которая выполняется сразу при вызове test.describe.only(). Все тесты, добавленные в эту функцию, будут относиться к группе.
test.describe.skip
Объявляет пропускаемую группу тестов, аналогично test.describe(). Тесты в пропускаемой группе никогда не запускаются.
test.describe.skip(title, callback)test.describe.skip(title)test.describe.skip(title, details, callback)
Использование
test.describe.skip('skipped group', () => {
test('example', async ({ page }) => {
// This test will not run
});
}); Также можно опустить название.
test.describe.skip(() => {
// ...
}); Аргументы
-
titlestringНазвание группы.
-
detailsObject (необязательно)Подробное описание см. в test.describe().
-
callbackfunctionФункция обратного вызова, которая выполняется сразу при вызове test.describe.skip(). Все тесты, добавленные в эту функцию, будут относиться к группе и не будут выполняться.
test.extend
Расширяет объект test, определяя фикстуры и/или параметры, которые можно использовать в тестах.
Использование
Сначала определите фикстуру и/или параметр.
- TypeScript
- JavaScript
import { test as base } from '@playwright/test';
import { TodoPage } from './todo-page';
export type Options = { defaultItem: string };
// Extend basic test by providing a "defaultItem" option and a "todoPage" fixture.
export const test = base.extend<Options & { todoPage: TodoPage }>({
// Define an option and provide a default value.
// We can later override it in the config.
defaultItem: ['Do stuff', { option: true }],
// Define a fixture. Note that it can use built-in fixture "page"
// and a new option "defaultItem".
todoPage: async ({ page, defaultItem }, use) => {
const todoPage = new TodoPage(page);
await todoPage.goto();
await todoPage.addToDo(defaultItem);
await use(todoPage);
await todoPage.removeAll();
},
});const base = require('@playwright/test');
const { TodoPage } = require('./todo-page');
// Extend basic test by providing a "defaultItem" option and a "todoPage" fixture.
exports.test = base.test.extend({
// Define an option and provide a default value.
// We can later override it in the config.
defaultItem: ['Do stuff', { option: true }],
// Define a fixture. Note that it can use built-in fixture "page"
// and a new option "defaultItem".
todoPage: async ({ page, defaultItem }, use) => {
const todoPage = new TodoPage(page);
await todoPage.goto();
await todoPage.addToDo(defaultItem);
await use(todoPage);
await todoPage.removeAll();
},
});Затем используйте фикстуру в тесте.
import { test } from './my-test';
test('test 1', async ({ todoPage }) => {
await todoPage.addToDo('my todo');
// ...
}); Настройте параметр в файле конфигурации.
- TypeScript
- JavaScript
import { defineConfig } from '@playwright/test';
import type { Options } from './my-test';
export default defineConfig<Options>({
projects: [
{
name: 'shopping',
use: { defaultItem: 'Buy milk' },
},
{
name: 'wellbeing',
use: { defaultItem: 'Exercise!' },
},
]
});// @ts-check
module.exports = defineConfig({
projects: [
{
name: 'shopping',
use: { defaultItem: 'Buy milk' },
},
{
name: 'wellbeing',
use: { defaultItem: 'Exercise!' },
},
]
});Подробнее о фикстурах и параметризации тестов.
Аргументы
-
fixturesObjectОбъект, содержащий фикстуры и/или параметры. Подробнее о формате фикстур.
Возвращает
test.fail
Помечает тест как «должен завершиться с ошибкой». Playwright запускает этот тест и проверяет, что он действительно завершается с ошибкой. Это полезно для документирования случаев, когда какая-либо функциональность не работает и ожидает исправления.
Чтобы объявить тест, который должен завершиться с ошибкой:
test.fail(title, body)test.fail(title, details, body)
Чтобы пометить тест как «завершающийся с ошибкой» во время выполнения:
test.fail(condition, description)test.fail(callback, description)test.fail()
Использование
Вы можете объявить тест как завершающийся с ошибкой, чтобы Playwright проверял, что он действительно завершается с ошибкой.
import { test, expect } from '@playwright/test';
test.fail('not yet ready', async ({ page }) => {
// ...
}); Если тест должен завершаться с ошибкой только в некоторых конфигурациях, вы можете пометить его соответствующим образом внутри тела теста, используя условие. В этом случае рекомендуем передать аргумент description.
import { test, expect } from '@playwright/test';
test('fail in WebKit', async ({ page, browserName }) => {
test.fail(browserName === 'webkit', 'This feature is not implemented for Mac yet');
// ...
}); Вы можете пометить все тесты в файле или группе test.describe() как «должны завершиться с ошибкой» при выполнении некоторого условия с помощью одного вызова test.fail(callback, description).
import { test, expect } from '@playwright/test';
test.fail(({ browserName }) => browserName === 'webkit', 'not implemented yet');
test('fail in WebKit 1', async ({ page }) => {
// ...
});
test('fail in WebKit 2', async ({ page }) => {
// ...
}); Также можно вызвать test.fail() без аргументов внутри тела теста, чтобы всегда помечать тест как завершившийся с ошибкой. Вместо этого рекомендуем объявлять такой тест с помощью test.fail(title, body).
import { test, expect } from '@playwright/test';
test('less readable', async ({ page }) => {
test.fail();
// ...
}); Аргументы
-
titlestring (необязательно)Название теста.
-
detailsObject (необязательно)См. test() для описания параметров теста.
-
bodyfunction(Fixtures, TestInfo) (необязательно)Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.
-
conditionboolean (необязательно)Тест помечается как «должен завершиться с ошибкой», если условие равно
true. -
callbackfunction(Fixtures):boolean (необязательно)Функция, которая на основе фикстур теста возвращает значение, определяющее, нужно ли пометить тест как «должен завершиться с ошибкой». Тест или тесты помечаются таким образом, если возвращаемое значение равно
true. -
descriptionstring (необязательно)Необязательное описание, которое будет отображаться в отчёте о тестировании.
test.fail.only
Вы можете использовать test.fail.only, чтобы сфокусироваться на конкретном тесте, который должен завершиться с ошибкой. Это особенно полезно при отладке теста, завершающегося с ошибкой, или при работе над конкретной проблемой.
Чтобы объявить сфокусированный тест, который должен завершиться с ошибкой:
test.fail.only(title, body)test.fail.only(title, details, body)
Использование
Вы можете объявить сфокусированный тест, который должен завершиться с ошибкой, чтобы Playwright запускал только его и проверял, что он действительно завершается с ошибкой.
import { test, expect } from '@playwright/test';
test.fail.only('focused failing test', async ({ page }) => {
// This test is expected to fail
});
test('not in the focused group', async ({ page }) => {
// This test will not run
}); Аргументы
-
titlestring (необязательно)Название теста.
-
detailsObject (необязательно)См. test.describe() для описания параметров теста.
-
bodyfunction(Fixtures, TestInfo) (необязательно)Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.
test.fixme
Помечает тест как «fixme», чтобы его можно было исправить. Playwright не будет выполнять тест после вызова test.fixme().
Чтобы объявить тест «fixme»:
test.fixme(title, body)test.fixme(title, details, body)
Чтобы пометить тест как «fixme» во время выполнения:
test.fixme(condition, description)test.fixme(callback, description)test.fixme()
Использование
Вы можете объявить тест требующим исправления, и Playwright не будет его запускать.
import { test, expect } from '@playwright/test';
test.fixme('to be fixed', async ({ page }) => {
// ...
}); Если тест нужно исправить только в некоторых конфигурациях, вы можете пометить его как «fixme» внутри тела теста, используя условие. В этом случае рекомендуем передать аргумент description. Playwright запустит тест, но немедленно прервёт его после вызова test.fixme.
import { test, expect } from '@playwright/test';
test('to be fixed in Safari', async ({ page, browserName }) => {
test.fixme(browserName === 'webkit', 'This feature breaks in Safari for some reason');
// ...
}); Вы можете пометить все тесты в файле или группе test.describe() как «fixme» при выполнении некоторого условия с помощью одного вызова test.fixme(callback, description).
import { test, expect } from '@playwright/test';
test.fixme(({ browserName }) => browserName === 'webkit', 'Should figure out the issue');
test('to be fixed in Safari 1', async ({ page }) => {
// ...
});
test('to be fixed in Safari 2', async ({ page }) => {
// ...
}); Также можно вызвать test.fixme() без аргументов внутри тела теста, чтобы всегда помечать тест как завершившийся с ошибкой. Вместо этого рекомендуем использовать test.fixme(title, body).
import { test, expect } from '@playwright/test';
test('less readable', async ({ page }) => {
test.fixme();
// ...
}); Аргументы
-
titlestring (необязательно)Название теста.
-
detailsObject (необязательно)См. test() для описания параметров теста.
-
bodyfunction(Fixtures, TestInfo) (необязательно)Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.
-
conditionboolean (необязательно)Тест помечается как «fixme», если условие равно
true. -
callbackfunction(Fixtures):boolean (необязательно)Функция, которая на основе фикстур теста возвращает значение, определяющее, нужно ли пометить тест как «fixme». Тест или тесты помечаются таким образом, если возвращаемое значение равно
true. -
descriptionstring (необязательно)Необязательное описание, которое будет отображаться в отчёте о тестировании.
test.info
Возвращает информацию о выполняющемся в данный момент тесте. Этот метод можно вызывать только во время выполнения теста, в противном случае он выбрасывает исключение.
Использование
test('example test', async ({ page }) => {
// ...
await test.info().attach('screenshot', {
body: await page.screenshot(),
contentType: 'image/png',
});
}); Возвращает
test.only
Объявляет тест сфокусированным. Если есть сфокусированные тесты или наборы тестов, будут запущены все они и никакие другие.
test.only(title, body)test.only(title, details, body)
Использование
test.only('focus this test', async ({ page }) => {
// Run only focused tests in the entire project.
}); Аргументы
-
titlestringНазвание теста.
-
detailsObject (необязательно)См. test() для описания параметров теста.
-
bodyfunction(Fixtures, TestInfo)Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.
test.setTimeout
Изменяет время ожидания для теста. Нулевое значение означает отсутствие ограничения по времени. Подробнее о различных ограничениях времени.
Ограничение времени для выполняющегося теста доступно через testInfo.timeout.
Использование
-
Изменение времени ожидания теста.
test('very slow test', async ({ page }) => { test.setTimeout(120000); // ... }); -
Изменение времени ожидания в хуке
beforeEachс увеличенным временем выполнения. Обратите внимание: это влияет на ограничение времени теста, общее для хуковbeforeEach.test.beforeEach(async ({ page }, testInfo) => { // Extend timeout for all tests running this hook by 30 seconds. test.setTimeout(testInfo.timeout + 30000); }); -
Изменение времени ожидания для хука
beforeAllилиafterAll. Обратите внимание: это влияет на ограничение времени хука, а не теста.test.beforeAll(async () => { // Set timeout for this hook. test.setTimeout(60000); }); -
Изменение времени ожидания для всех тестов в группе test.describe().
test.describe('group', () => { // Applies to all tests in this group. test.describe.configure({ timeout: 60000 }); test('test one', async () => { /* ... */ }); test('test two', async () => { /* ... */ }); test('test three', async () => { /* ... */ }); });
Аргументы
-
timeoutnumberВремя ожидания в миллисекундах.
test.skip
Пропускает тест. Playwright не будет выполнять тест после вызова test.skip().
Пропущенные тесты не должны запускаться. Если вы собираетесь исправить тест, используйте вместо этого test.fixme().
Чтобы объявить пропускаемый тест:
test.skip(title, body)test.skip(title, details, body)
Чтобы пропустить тест во время выполнения:
test.skip(condition, description)test.skip(callback, description)test.skip()
Использование
Вы можете объявить тест пропускаемым, и Playwright не будет его запускать.
import { test, expect } from '@playwright/test';
test.skip('never run', async ({ page }) => {
// ...
}); Если тест нужно пропускать только в некоторых конфигурациях, вы можете пропустить его внутри тела теста, используя условие. В этом случае рекомендуем передать аргумент description. Playwright запустит тест, но немедленно прервёт его после вызова test.skip.
import { test, expect } from '@playwright/test';
test('Safari-only test', async ({ page, browserName }) => {
test.skip(browserName !== 'webkit', 'This feature is Safari-only');
// ...
}); Вы можете пропустить все тесты в файле или группе test.describe() при выполнении некоторого условия с помощью одного вызова test.skip(callback, description).
import { test, expect } from '@playwright/test';
test.skip(({ browserName }) => browserName !== 'webkit', 'Safari-only');
test('Safari-only test 1', async ({ page }) => {
// ...
});
test('Safari-only test 2', async ({ page }) => {
// ...
}); Также можно вызвать test.skip() без аргументов внутри тела теста, чтобы всегда пропускать тест. Однако рекомендуем вместо этого использовать test.skip(title, body).
import { test, expect } from '@playwright/test';
test('less readable', async ({ page }) => {
test.skip();
// ...
}); Аргументы
-
titlestring (необязательно)Название теста.
-
detailsObject (необязательно)См. test() для описания параметров теста.
-
bodyfunction(Fixtures, TestInfo) (необязательно)Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.
-
conditionboolean (необязательно)Тест помечается как «пропущенный», если условие равно
true. -
callbackfunction(Fixtures):boolean (необязательно)Функция, которая на основе фикстур теста возвращает значение, определяющее, нужно ли пропустить тест. Тест или тесты помечаются как «пропущенные», если возвращаемое значение равно
true. -
descriptionstring (необязательно)Необязательное описание, которое будет отображаться в отчёте о тестировании.
test.slow
Помечает тест как «медленный». Для медленного теста будет установлено тройное значение стандартного времени ожидания.
Обратите внимание: test.slow() нельзя использовать в хуке beforeAll или afterAll. Вместо этого используйте test.setTimeout().
test.slow()test.slow(condition, description)test.slow(callback, description)
Использование
Вы можете пометить тест как медленный, вызвав test.slow() внутри тела теста.
import { test, expect } from '@playwright/test';
test('slow test', async ({ page }) => {
test.slow();
// ...
}); Если тест медленный только в некоторых конфигурациях, вы можете пометить его как медленный при выполнении определённого условия. В этом случае рекомендуем передать аргумент description.
import { test, expect } from '@playwright/test';
test('slow in Safari', async ({ page, browserName }) => {
test.slow(browserName === 'webkit', 'This feature is slow in Safari');
// ...
}); Вы можете пометить все тесты в файле или группе test.describe() как «медленные» при выполнении некоторого условия, передав функцию обратного вызова.
import { test, expect } from '@playwright/test';
test.slow(({ browserName }) => browserName === 'webkit', 'all tests are slow in Safari');
test('slow in Safari 1', async ({ page }) => {
// ...
});
test('fail in Safari 2', async ({ page }) => {
// ...
}); Аргументы
-
conditionboolean (необязательно)Тест помечается как «медленный», если условие равно
true. -
callbackfunction(Fixtures):boolean (необязательно)Функция, которая на основе фикстур теста возвращает значение, определяющее, нужно ли пометить тест как «медленный». Тест или тесты помечаются как «медленные», если возвращаемое значение равно
true. -
descriptionstring (необязательно)Необязательное описание, которое будет отображаться в отчёте о тестировании.
test.step
Объявляет шаг теста, который отображается в отчёте.
Использование
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await test.step('Log in', async () => {
// ...
});
await test.step('Outer step', async () => {
// ...
// You can nest steps inside each other.
await test.step('Inner step', async () => {
// ...
});
});
}); Аргументы
-
titlestringНазвание шага.
-
bodyfunction(TestStepInfo):Promise<Object>Тело шага.
-
optionsObject (необязательно)-
boxboolean (необязательно)Нужно ли заключить шаг в рамку в отчёте. По умолчанию используется
false. Если шаг заключён в рамку, ошибки, выброшенные внутри шага, указывают на место вызова шага. Подробнее см. ниже. -
locationLocation (необязательно)Указывает пользовательское расположение шага, которое будет отображаться в отчётах о тестировании и средстве просмотра трассировок. По умолчанию отображается расположение вызова test.step().
-
paramsObject<string, Object> (необязательно)Произвольные сериализуемые параметры, описывающие шаг. Они передаются средствам формирования отчётов как
testStep.paramsи отображаются в средстве просмотра трассировок. -
timeoutnumber (необязательно)Максимальное время в миллисекундах, отведённое на выполнение шага. Если шаг не завершится в течение указанного времени, метод test.step() выбросит ошибку TimeoutError. По умолчанию используется
0(без ограничения по времени).
-
Возвращает
Подробности
Метод возвращает значение, возвращённое callback-функцией шага.
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
const user = await test.step('Log in', async () => {
// ...
return 'john';
});
expect(user).toBe('john');
}); Декоратор
Вы можете использовать декораторы методов TypeScript, чтобы превратить метод в шаг. Каждый вызов декорированного метода будет отображаться в отчёте как шаг.
function step(target: Function, context: ClassMethodDecoratorContext) {
return function replacementMethod(...args: any) {
const name = this.constructor.name + '.' + (context.name as string);
return test.step(name, async () => {
return await target.call(this, ...args);
}, { box: true });
};
}
class LoginPage {
constructor(readonly page: Page) {}
@step
async login() {
const account = { username: 'Alice', password: 's3cr3t' };
await this.page.getByLabel('Username or email address').fill(account.username);
await this.page.getByLabel('Password').fill(account.password);
await this.page.getByRole('button', { name: 'Sign in' }).click();
await expect(this.page.getByRole('button', { name: 'View profile and more' })).toBeVisible();
}
}
test('example', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.login();
}); Изоляция
Если что-то внутри шага завершается с ошибкой, обычно вы увидите её указание на конкретное действие, которое завершилось неудачно. Например, рассмотрим следующий шаг входа в систему:
async function login(page) {
await test.step('login', async () => {
const account = { username: 'Alice', password: 's3cr3t' };
await page.getByLabel('Username or email address').fill(account.username);
await page.getByLabel('Password').fill(account.password);
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.getByRole('button', { name: 'View profile and more' })).toBeVisible();
});
}
test('example', async ({ page }) => {
await page.goto('https://github.com/login');
await login(page);
}); Error: Timed out 5000ms waiting for expect(locator).toBeVisible()
... error details omitted ...
8 | await page.getByRole('button', { name: 'Sign in' }).click();
> 9 | await expect(page.getByRole('button', { name: 'View profile and more' })).toBeVisible();
| ^
10 | }); Как видно выше, тест может завершиться с ошибкой, указывающей на место внутри шага. Если вы хотите, чтобы ошибка указывала на шаг «login», а не на его внутренние детали, используйте параметр box. Ошибка внутри изолированного шага указывает на место вызова шага.
async function login(page) {
await test.step('login', async () => {
// ...
}, { box: true }); // Note the "box" option here.
} Error: Timed out 5000ms waiting for expect(locator).toBeVisible()
... error details omitted ...
14 | await page.goto('https://github.com/login');
> 15 | await login(page);
| ^
16 | }); Вы также можете создать декоратор TypeScript для изолированного шага, аналогичный обычному декоратору шага выше:
function boxedStep(target: Function, context: ClassMethodDecoratorContext) {
return function replacementMethod(...args: any) {
const name = this.constructor.name + '.' + (context.name as string);
return test.step(name, async () => {
return await target.call(this, ...args);
}, { box: true }); // Note the "box" option here.
};
}
class LoginPage {
constructor(readonly page: Page) {}
@boxedStep
async login() {
// ....
}
}
test('example', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.login(); // <-- Error will be reported on this line.
}); test.step.skip
Пометьте шаг теста как «пропущенный», чтобы временно отключить его выполнение. Это полезно для шагов, которые в настоящее время завершаются с ошибкой и которые планируется исправить в ближайшее время. Playwright не будет выполнять этот шаг. См. также testStepInfo.skip().
Рекомендуем вместо этого использовать testStepInfo.skip().
Использование
Вы можете объявить шаг пропущенным, и Playwright не будет его выполнять.
import { test, expect } from '@playwright/test';
test('my test', async ({ page }) => {
// ...
await test.step.skip('not yet ready', async () => {
// ...
});
}); Аргументы
-
titlestringНазвание шага.
-
bodyfunction():Promise<Object>Тело шага.
-
optionsObject (необязательно)-
boxboolean (необязательно)Нужно ли изолировать шаг в отчёте. По умолчанию —
false. Если шаг изолирован, ошибки, возникающие внутри него, указывают на место вызова шага. Подробнее см. ниже. -
locationLocation (необязательно)Указывает пользовательское местоположение, которое будет отображаться для шага в отчётах о тестах и средстве просмотра трассировок. По умолчанию отображается местоположение вызова test.step().
-
paramsObject<string, Object> (необязательно)Произвольные сериализуемые параметры, описывающие шаг. Они передаются репортерам как
testStep.paramsи отображаются в средстве просмотра трассировок. -
timeoutnumber (необязательно)Максимальное время в миллисекундах, отведённое на завершение шага. По умолчанию —
0(без тайм-аута).
-
Возвращает
test.use
Задаёт параметры или фикстуры, используемые в одном файле тестов или группе test.describe(). Чаще всего применяется для задания параметра, например, чтобы установить locale и настроить фикстуру context.
Использование
import { test, expect } from '@playwright/test';
test.use({ locale: 'en-US' });
test('test with locale', async ({ page }) => {
// Default context and page have locale as specified
}); Аргументы
-
optionsTestOptionsОбъект с локальными параметрами.
Подробности
test.use можно вызвать как в глобальной области видимости, так и внутри test.describe. Вызов внутри beforeEach или beforeAll приводит к ошибке.
Также можно переопределить фикстуру, передав функцию.
import { test, expect } from '@playwright/test';
test.use({
locale: async ({}, use) => {
// Read locale from some configuration file.
const locale = await fs.promises.readFile('test-locale', 'utf-8');
await use(locale);
},
});
test('test with locale', async ({ page }) => {
// Default context and page have locale as specified
}); Свойства
test.expect
Функцию expect можно использовать для создания проверок теста. Подробнее см. в разделе проверки тестов.
Использование
test('example', async ({ page }) => {
await test.expect(page).toHaveTitle('Title');
}); Тип
Устарело
test.describe.parallel
Не рекомендуетсяПредпочтительный способ настройки режима выполнения см. в разделе test.describe.configure().
Объявляет группу тестов, которые можно запускать параллельно. По умолчанию тесты в одном файле выполняются последовательно, но с помощью test.describe.parallel() их можно выполнять параллельно.
test.describe.parallel(title, callback)test.describe.parallel(callback)test.describe.parallel(title, details, callback)
Использование
test.describe.parallel('group', () => {
test('runs in parallel 1', async ({ page }) => {});
test('runs in parallel 2', async ({ page }) => {});
}); Обратите внимание: параллельные тесты выполняются в отдельных процессах и не могут совместно использовать состояние или глобальные переменные. Каждый параллельный тест выполняет все соответствующие хуки.
Заголовок можно не указывать.
test.describe.parallel(() => {
// ...
}); Аргументы
-
titlestring (необязательно)Заголовок группы.
-
detailsObject (необязательно)Подробное описание см. в разделе test.describe().
-
callbackfunctionCallback-функция, которая выполняется сразу при вызове test.describe.parallel(). Все тесты, добавленные в эту callback-функцию, будут принадлежать группе.
test.describe.parallel.only
Не рекомендуетсяПредпочтительный способ настройки режима выполнения см. в разделе test.describe.configure().
Объявляет выбранную группу тестов, которую можно запускать параллельно. Это похоже на test.describe.parallel(), но выделяет группу. Если есть выбранные тесты или наборы тестов, будут выполнены только они.
test.describe.parallel.only(title, callback)test.describe.parallel.only(callback)test.describe.parallel.only(title, details, callback)
Использование
test.describe.parallel.only('group', () => {
test('runs in parallel 1', async ({ page }) => {});
test('runs in parallel 2', async ({ page }) => {});
}); Заголовок можно не указывать.
test.describe.parallel.only(() => {
// ...
}); Аргументы
-
titlestring (необязательно)Заголовок группы.
-
detailsObject (необязательно)Подробное описание см. в разделе test.describe().
-
callbackfunctionCallback-функция, которая выполняется сразу при вызове test.describe.parallel.only(). Все тесты, добавленные в эту callback-функцию, будут принадлежать группе.
test.describe.serial
Не рекомендуетсяПредпочтительный способ настройки режима выполнения см. в разделе test.describe.configure().
Объявляет группу тестов, которые всегда должны выполняться последовательно. Если один из тестов завершается с ошибкой, все последующие тесты пропускаются. Все тесты в группе запускаются повторно вместе.
примечаниеИспользовать последовательное выполнение не рекомендуется. Обычно лучше сделать тесты изолированными, чтобы их можно было запускать независимо.
test.describe.serial(title, callback)test.describe.serial(title)test.describe.serial(title, details, callback)
Использование
test.describe.serial('group', () => {
test('runs first', async ({ page }) => {});
test('runs second', async ({ page }) => {});
}); Заголовок можно не указывать.
test.describe.serial(() => {
// ...
}); Аргументы
-
titlestring (необязательно)Заголовок группы.
-
detailsObject (необязательно)Подробное описание см. в разделе test.describe().
-
callbackfunctionCallback-функция, которая выполняется сразу при вызове test.describe.serial(). Все тесты, добавленные в эту callback-функцию, будут принадлежать группе.
test.describe.serial.only
Не рекомендуетсяПредпочтительный способ настройки режима выполнения см. в разделе test.describe.configure().
Объявляет выбранную группу тестов, которые всегда должны выполняться последовательно. Если один из тестов завершается с ошибкой, все последующие тесты пропускаются. Все тесты в группе запускаются повторно вместе. Если есть выбранные тесты или наборы тестов, будут выполнены только они.
примечаниеИспользовать последовательное выполнение не рекомендуется. Обычно лучше сделать тесты изолированными, чтобы их можно было запускать независимо.
test.describe.serial.only(title, callback)test.describe.serial.only(title)test.describe.serial.only(title, details, callback)
Использование
test.describe.serial.only('group', () => {
test('runs first', async ({ page }) => {
});
test('runs second', async ({ page }) => {
});
}); Заголовок можно не указывать.
test.describe.serial.only(() => {
// ...
}); Аргументы
-
titlestringЗаголовок группы.
-
detailsObject (необязательно)Подробное описание см. в разделе test.describe().
-
callbackfunctionCallback-функция, которая выполняется сразу при вызове test.describe.serial.only(). Все тесты, добавленные в эту callback-функцию, будут принадлежать группе.
© 2026 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/api/class-test