Playwright Test
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
Добавлено в: v1.10Объявляет тест.
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.
Узнайте больше о аннотациях тестов.
Аргументы
-
Заголовок теста.
-
details
Object (опционально) Добавлено в: v1.42#Дополнительные детали теста.
-
body
function(Fixtures, TestInfo)#Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный TestInfo.
test.afterAll
Добавлено в: v1.10Объявляет хук afterAll
, который выполняется один раз на рабочий процесс после всех тестов.
Когда вызывается в области тестового файла, выполняется после всех тестов в файле. Когда вызывается внутри группы test.describe(), выполняется после всех тестов в группе.
Использование
test.afterAll(async () => {
console.log('Done with tests');
// ...
});
Кроме того, вы можете объявить хук с заголовком.
test.afterAll('Teardown', async () => {
console.log('Done with tests');
// ...
});
Аргументы
-
title
string (опционально) Добавлено в: v1.38#Заголовок хука.
-
hookFunction
function(Fixtures, TestInfo)#Функция хука, которая принимает один или два аргумента: объект с рабочими фикстурами и опциональный TestInfo.
Детали
Когда добавляется несколько хуков afterAll
, они будут выполняться в порядке их регистрации.
Обратите внимание, что процесс рабочего процесса перезапускается при сбоях теста, и хук afterAll
выполняется снова в новом рабочем процессе. Узнайте больше о рабочих процессах и сбоях.
Playwright продолжит выполнение всех применимых хуков, даже если некоторые из них завершились неудачей.
test.afterAll(hookFunction)
test.afterAll(title, hookFunction)
test.afterEach
Добавлено в: v1.10Объявляет хук afterEach
, который выполняется после каждого теста.
Когда вызывается в области тестового файла, выполняется после каждого теста в файле. Когда вызывается внутри группы test.describe(), выполняется после каждого теста в группе.
Вы можете получить доступ ко всем тем же Fixtures, что и само тело теста, а также к объекту 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()}`);
});
Аргументы
-
title
string (опционально) Добавлено в: v1.38#Заголовок хука.
-
hookFunction
function(Fixtures, TestInfo)#Функция хука, которая принимает один или два аргумента: объект с фикстурами и опциональный TestInfo.
Детали
Когда добавляется несколько хуков afterEach
, они будут выполняться в порядке их регистрации.
Playwright продолжит выполнение всех применимых хуков, даже если некоторые из них завершились неудачей.
test.beforeAll
Added in: v1.10Объявляет хук 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');
});
Аргументы
-
title
string (optional) Added in: v1.38#Заголовок хука.
-
hookFunction
function(Fixtures, TestInfo)#Функция хука, которая принимает один или два аргумента: объект с фикстурами рабочего процесса и необязательный TestInfo.
Детали
Когда добавляется несколько хуков beforeAll
, они будут выполняться в порядке их регистрации.
Обратите внимание, что рабочий процесс перезапускается при сбоях тестов, и хук beforeAll
выполняется снова в новом рабочем процессе. Узнайте больше о рабочих процессах и сбоях.
Playwright продолжит выполнение всех применимых хуков, даже если некоторые из них завершились с ошибкой.
test.beforeEach
Added in: v1.10Объявляет хук beforeEach
, который выполняется перед каждым тестом.
Когда вызывается в области тестового файла, выполняется перед каждым тестом в файле. Когда вызывается внутри группы test.describe(), выполняется перед каждым тестом в группе.
Вы можете получить доступ ко всем тем же Fixtures, что и в самом теле теста, а также к объекту 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/');
});
Аргументы
-
title
string (optional) Added in: v1.38#Заголовок хука.
-
hookFunction
function(Fixtures, TestInfo)#Функция хука, которая принимает один или два аргумента: объект с фикстурами и необязательный TestInfo.
Детали
Когда добавляется несколько хуков beforeEach
, они будут выполняться в порядке их регистрации.
Playwright продолжит выполнение всех применимых хуков, даже если некоторые из них завершились с ошибкой.
test.describe
Added in: v1.10Объявляет группу тестов.
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 }) => {
// ...
});
});
Узнайте больше о аннотациях тестов.
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#Дополнительные детали для всех тестов в группе.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe(). Любые тесты, объявленные в этой функции обратного вызова, будут принадлежать группе.
test.describe.configure
Added in: v1.10Настраивает окружающую область. Может быть выполнен как на верхнем уровне, так и внутри describe. Конфигурация применяется ко всей области, независимо от того, выполняется она до или после объявления теста.
Узнайте больше о режимах выполнения здесь.
Использование
-
Запуск тестов параллельно.
// Запустите все тесты в файле одновременно, используя параллельные рабочие процессы.
test.describe.configure({ mode: 'parallel' });
test('runs in parallel 1', async ({ page }) => {});
test('runs in parallel 2', async ({ page }) => {}); -
Запуск тестов последовательно, повторяя с начала.
примечаниеПоследовательный запуск не рекомендуется. Обычно лучше сделать ваши тесты изолированными, чтобы их можно было запускать независимо.
// Аннотируйте тесты как взаимозависимые.
test.describe.configure({ mode: 'serial' });
test('runs first', async ({ page }) => {});
test('runs second', async ({ page }) => {}); -
Настройка повторных попыток и тайм-аута для каждого теста.
// Каждый тест в файле будет повторен дважды и иметь тайм-аут 20 секунд.
test.describe.configure({ retries: 2, timeout: 20_000 });
test('runs first', async ({ page }) => {});
test('runs second', async ({ page }) => {}); -
Запуск нескольких описаний параллельно, но тесты внутри каждого описания по порядку.
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 }) => {});
});
Аргументы
options
Object (optional)-
mode
"default" | "parallel" | "serial" (optional)#Режим выполнения. Узнайте больше о режимах выполнения здесь.
-
retries
number (optional) Added in: v1.28#Количество повторных попыток для каждого теста.
-
timeout
number (optional) Added in: v1.28#Тайм-аут для каждого теста в миллисекундах. Переопределяет testProject.timeout и testConfig.timeout.
-
test.describe.fixme
Added in: v1.25Объявляет группу тестов аналогично 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 }) => {
// Этот тест не будет выполнен
});
});
Вы также можете опустить заголовок.
test.describe.fixme(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания деталей.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.fixme(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе и не будут выполнены.
test.describe.only
Added in: v1.10Объявляет сфокусированную группу тестов. Если есть некоторые сфокусированные тесты или наборы, все они будут выполнены, но ничего больше.
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 }) => {
// Этот тест будет выполнен
});
});
test('not in the focused group', async ({ page }) => {
// Этот тест не будет выполнен
});
Вы также можете опустить заголовок.
test.describe.only(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания деталей.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.only(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе.
test.describe.skip
Added in: v1.10Объявляет пропущенную группу тестов, аналогично 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 }) => {
// Этот тест не будет выполнен
});
});
Вы также можете опустить заголовок.
test.describe.skip(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания деталей.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.skip(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе и не будут выполнены.
test.extend
Добавлено в: v1.10Расширяет объект test
, определяя фикстуры и/или опции, которые могут быть использованы в тестах.
Использование
Сначала определите фикстуру и/или опцию.
- TypeScript
- JavaScript
import { test as base } from '@playwright/test';
import { TodoPage } from './todo-page';
export type Options = { defaultItem: string };
// Расширяем базовый тест, предоставляя опцию "defaultItem" и фикстуру "todoPage".
export const test = base.extend<Options & { todoPage: TodoPage }>({
// Определяем опцию и предоставляем значение по умолчанию.
// Позже мы можем переопределить его в конфигурации.
defaultItem: ['Do stuff', { option: true }],
// Определяем фикстуру. Обратите внимание, что она может использовать встроенную фикстуру "page"
// и новую опцию "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');
// Расширяем базовый тест, предоставляя опцию "defaultItem" и фикстуру "todoPage".
exports.test = base.test.extend({
// Определяем опцию и предоставляем значение по умолчанию.
// Позже мы можем переопределить его в конфигурации.
defaultItem: ['Do stuff', { option: true }],
// Определяем фикстуру. Обратите внимание, что она может использовать встроенную фикстуру "page"
// и новую опцию "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!' },
},
]
});
Узнайте больше о фикстурах и параметризации тестов.
Аргументы
-
Объект, содержащий фикстуры и/или опции. Узнайте больше о формате фикстур.
Возвращает
test.fail
Добавлено в: v1.10Помечает тест как "должен провалиться". 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();
// ...
});
Аргументы
-
title
string (опционально) Добавлено в: v1.42#Название теста.
-
details
Object (опционально) Добавлено в: v1.42#См. test() для описания деталей теста.
-
body
function(Fixtures, TestInfo) (опционально) Добавлено в: v1.42#Тело теста, которое принимает один или два аргумента: объект с фикстурами и необязательный TestInfo.
-
condition
boolean (опционально)#Тест помечается как "должен провалиться", когда условие
true
. -
callback
function(Fixtures):boolean (опционально)#Функция, которая возвращает, следует ли пометить как "должен провалиться", на основе фикстур теста. Тест или тесты помечаются как "должны провалиться", когда возвращаемое значение
true
. -
description
string (опционально)#Необязательное описание, которое будет отражено в отчете о тестировании.
test.fail.only
Добавлено в: v1.49Вы можете использовать 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 }) => {
// Ожидается, что этот тест провалится
});
test('not in the focused group', async ({ page }) => {
// Этот тест не будет запущен
});
Аргументы
-
Название теста.
-
См. test.describe() для описания деталей теста.
-
body
function(Fixtures, TestInfo) (опционально)#Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный TestInfo.
test.fixme
Добавлено в: v1.10Отметьте тест как "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();
// ...
});
Аргументы
-
Название теста.
-
details
Object (опционально) Добавлено в: v1.42#См. test() для описания деталей теста.
-
body
function(Fixtures, TestInfo) (опционально)#Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный TestInfo.
-
condition
boolean (опционально)#Тест помечается как "должен провалиться", когда условие
true
. -
callback
function(Fixtures):boolean (опционально)#Функция, которая возвращает, следует ли пометить как "должен провалиться", на основе фикстур теста. Тест или тесты помечаются как "должен провалиться", когда возвращаемое значение
true
. -
description
string (опционально)#Опциональное описание, которое будет отражено в отчете о тестировании.
test.info
Добавлено в: v1.10Возвращает информацию о текущем выполняемом тесте. Этот метод может быть вызван только во время выполнения теста, в противном случае он выбрасывает исключение.
Использование
test('example test', async ({ page }) => {
// ...
await test.info().attach('screenshot', {
body: await page.screenshot(),
contentType: 'image/png',
});
});
Возвращает
test.only
Добавлено в: v1.10Объявляет сфокусированный тест. Если есть несколько сфокусированных тестов или наборов, все они будут запущены, но ничего больше.
test.only(title, body)
test.only(title, details, body)
Использование
test.only('focus this test', async ({ page }) => {
// Запустить только сфокусированные тесты во всем проекте.
});
Аргументы
-
Название теста.
-
details
Object (опционально) Добавлено в: v1.42#См. test() для описания деталей теста.
-
body
function(Fixtures, TestInfo)#Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный TestInfo.
test.setTimeout
Added in: v1.10Изменяет тайм-аут для теста. Ноль означает отсутствие тайм-аута. Узнайте больше о различных тайм-аутах.
Тайм-аут для текущего выполняемого теста доступен через testInfo.timeout.
Использование
-
Изменение тайм-аута теста.
test('очень медленный тест', async ({ page }) => {
test.setTimeout(120000);
// ...
}); -
Изменение тайм-аута из медленного хука
beforeEach
. Обратите внимание, что это влияет на тайм-аут теста, который разделяется с хукамиbeforeEach
.test.beforeEach(async ({ page }, testInfo) => {
// Увеличьте тайм-аут для всех тестов, использующих этот хук, на 30 секунд.
test.setTimeout(testInfo.timeout + 30000);
}); -
Изменение тайм-аута для хука
beforeAll
илиafterAll
. Обратите внимание, что это влияет на тайм-аут хука, а не теста.test.beforeAll(async () => {
// Установите тайм-аут для этого хука.
test.setTimeout(60000);
}); -
Изменение тайм-аута для всех тестов в группе test.describe().
test.describe('группа', () => {
// Применяется ко всем тестам в этой группе.
test.describe.configure({ timeout: 60000 });
test('тест один', async () => { /* ... */ });
test('тест два', async () => { /* ... */ });
test('тест три', async () => { /* ... */ });
});
Аргументы
test.skip
Added in: v1.10Пропустить тест. 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('никогда не выполняется', async ({ page }) => {
// ...
});
Если ваш тест должен быть пропущен в некоторых конфигурациях, но не во всех, вы можете пропустить тест внутри тела теста на основе некоторого условия. Мы рекомендуем в этом случае передавать аргумент description
. Playwright выполнит тест, но прервет его сразу после вызова test.skip
.
import { test, expect } from '@playwright/test';
test('тест только для Safari', async ({ page, browserName }) => {
test.skip(browserName !== 'webkit', 'Эта функция только для Safari');
// ...
});
Вы можете пропустить все тесты в файле или группе test.describe() на основе некоторого условия с помощью одного вызова test.skip(callback, description)
.
import { test, expect } from '@playwright/test';
test.skip(({ browserName }) => browserName !== 'webkit', 'только для Safari');
test('тест только для Safari 1', async ({ page }) => {
// ...
});
test('тест только для Safari 2', async ({ page }) => {
// ...
});
Вы также можете вызвать test.skip()
без аргументов внутри тела теста, чтобы всегда помечать тест как неудачный. Мы рекомендуем использовать test.skip(title, body)
вместо этого.
import { test, expect } from '@playwright/test';
test('менее читаемый', async ({ page }) => {
test.skip();
// ...
});
Аргументы
-
Название теста.
-
details
Object (optional) Added in: v1.42#См. test() для описания деталей теста.
-
body
function(Fixtures, TestInfo) (optional)#Тело теста, которое принимает один или два аргумента: объект с фикстурами и необязательный TestInfo.
-
Тест помечается как "должен провалиться", когда условие
true
. -
callback
function(Fixtures):boolean (optional)#Функция, которая возвращает, следует ли пометить как "должен провалиться", на основе фикстур теста. Тест или тесты помечаются как "должен провалиться", когда возвращаемое значение
true
. -
description
string (optional)#Необязательное описание, которое будет отражено в отчете о тестировании.
test.slow
Added in: v1.10Помечает тест как "медленный". Медленному тесту будет предоставлено в три раза больше времени по умолчанию.
Обратите внимание, что 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('медленный тест', async ({ page }) => {
test.slow();
// ...
});
Если ваш тест медленный в некоторых конфигурациях, но не во всех, вы можете пометить его как медленный на основе условия. Мы рекомендуем в этом случае передавать аргумент description
.
import { test, expect } from '@playwright/test';
test('медленный в Safari', async ({ page, browserName }) => {
test.slow(browserName === 'webkit', 'Эта функция медленная в Safari');
// ...
});
Вы можете пометить все тесты в файле или группе test.describe() как "медленные" на основе некоторого условия, передав callback.
import { test, expect } from '@playwright/test';
test.slow(({ browserName }) => browserName === 'webkit', 'все тесты медленные в Safari');
test('медленный в Safari 1', async ({ page }) => {
// ...
});
test('провал в Safari 2', async ({ page }) => {
// ...
});
Аргументы
-
Тест помечается как "медленный", когда условие
true
. -
callback
function(Fixtures):boolean (optional)#Функция, которая возвращает, следует ли пометить как "медленный", на основе фикстур теста. Тест или тесты помечаются как "медленный", когда возвращаемое значение
true
. -
description
string (optional)#Необязательное описание, которое будет отражено в отчете о тестировании.
test.step
Added in: v1.10Объявляет шаг теста, который отображается в отчете.
Использование
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await test.step('Log in', async () => {
// ...
});
await test.step('Outer step', async () => {
// ...
// Вы можете вкладывать шаги друг в друга.
await test.step('Inner step', async () => {
// ...
});
});
});
Аргументы
-
Название шага.
-
body
function(TestStepInfo):Promise<Object>#Тело шага.
-
options
Object (опционально)-
box
boolean (опционально) Added in: v1.39#Указывает, следует ли обрамлять шаг в отчете. По умолчанию
false
. Когда шаг обрамлен, ошибки, возникающие внутри шага, указывают на место вызова шага. Подробнее см. ниже. -
location
Location (опционально) Added in: v1.48#Указывает пользовательское местоположение для отображения шага в отчетах тестов и просмотрщике трассировок. По умолчанию отображается местоположение вызова test.step().
-
timeout
number (опционально) Added in: v1.50#Максимальное время в миллисекундах, разрешенное для завершения шага. Если шаг не завершится в течение указанного времени, метод test.step() выбросит TimeoutError. По умолчанию
0
(без тайм-аута).
-
Возвращает
Детали
Метод возвращает значение, возвращаемое обратным вызовом шага.
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);
});
};
}
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 }); // Обратите внимание на опцию "box" здесь.
}
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 }); // Обратите внимание на опцию "box" здесь.
};
}
class LoginPage {
constructor(readonly page: Page) {}
@boxedStep
async login() {
// ....
}
}
test('example', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.login(); // <-- Ошибка будет сообщена на этой строке.
});
test.step.skip
Added in: v1.50Отметьте шаг теста как "пропущенный", чтобы временно отключить его выполнение, полезно для шагов, которые в настоящее время не работают и планируются к исправлению в ближайшее время. 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 () => {
// ...
});
});
Аргументы
-
Название шага.
-
body
function():Promise<Object>#Тело шага.
-
options
Object (опционально)-
Указывает, следует ли обрамлять шаг в отчете. По умолчанию
false
. Когда шаг обрамлен, ошибки, возникающие внутри шага, указывают на место вызова шага. Подробнее см. ниже. -
location
Location (опционально)#Указывает пользовательское местоположение для отображения шага в отчетах тестов и просмотрщике трассировок. По умолчанию отображается местоположение вызова test.step().
-
Максимальное время в миллисекундах для завершения шага. По умолчанию
0
(без тайм-аута).
-
Возвращает
test.use
Added in: v1.10Задает параметры или фикстуры для использования в одном тестовом файле или группе test.describe(). Наиболее полезно для установки параметра, например, установки locale
для настройки фикстуры context
.
Использование
import { test, expect } from '@playwright/test';
test.use({ locale: 'en-US' });
test('test with locale', async ({ page }) => {
// Контекст и страница по умолчанию имеют указанный язык
});
Аргументы
-
options
TestOptions#Объект с локальными параметрами.
Детали
test.use
может быть вызван как в глобальной области, так и внутри test.describe
. Ошибкой будет вызов его внутри beforeEach
или beforeAll
.
Также возможно переопределить фикстуру, предоставив функцию.
import { test, expect } from '@playwright/test';
test.use({
locale: async ({}, use) => {
// Чтение языка из некоторого конфигурационного файла.
const locale = await fs.promises.readFile('test-locale', 'utf-8');
await use(locale);
},
});
test('test with locale', async ({ page }) => {
// Контекст и страница по умолчанию имеют указанный язык
});
Свойства
test.expect
Added in: v1.10Функция expect
может быть использована для создания утверждений в тестах. Подробнее об утверждениях в тестах.
Использование
test('example', async ({ page }) => {
await test.expect(page).toHaveTitle('Title');
});
Тип
Устаревшие
test.describe.parallel
Added in: v1.10См. 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(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания деталей.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.parallel(). Любые тесты, добавленные в этой функции, будут принадлежать группе.
test.describe.parallel.only
Added in: v1.10См. 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(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания деталей.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.parallel.only(). Любые тесты, добавленные в этой функции, будут принадлежать группе.
test.describe.serial
Added in: v1.10См. 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(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания деталей.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.serial(). Любые тесты, добавленные в этой функции, будут принадлежать группе.
test.describe.serial.only
Added in: v1.10См. test.describe.configure() для предпочтительного способа настройки режима выполнения.
Объявляет фокусированную группу тестов, которые всегда должны выполняться последовательно. Если один из тестов не проходит, все последующие тесты пропускаются. Все тесты в группе повторяются вместе. Если есть какие-либо фокусированные тесты или наборы, все они будут выполнены, но ничего больше.
Использование serial не рекомендуется. Обычно лучше сделать ваши тесты изолированными, чтобы они могли выполняться независимо.
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(() => {
// ...
});
Аргументы
-
Заголовок группы.
-
details
Object (optional) Added in: v1.42#См. test.describe() для описания details.
-
Функция обратного вызова, которая выполняется сразу при вызове test.describe.serial.only(). Любые тесты, добавленные в эту функцию, будут принадлежать группе.