Skip to main content

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.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.

Вы также можете фильтровать тесты по их тегам во время выполнения теста:

Узнайте больше о тегировании.

Аннотации

Вы можете аннотировать тесты, предоставив дополнительные детали теста.

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.

Узнайте больше о аннотациях тестов.

Аргументы

  • title [string]#

Заголовок теста.

  • details [Object] (опционально) Добавлено в: v1.42#

  • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)
  • type [string]

Тип аннотации, например 'issue'.

  • description [string] (опционально)

Опциональное описание аннотации, например, URL проблемы.

Дополнительные детали теста.

  • body [function]([Fixtures], [TestInfo])#

Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].


test.afterAll

Добавлено в: v1.10 test.test.afterAll

Объявляет хук 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 test.test.afterEach

Объявляет хук afterEach, который выполняется после каждого теста.

Когда вызывается в области тестового файла, выполняется после каждого теста в файле. Когда вызывается внутри группы test.describe(), выполняется после каждого теста в группе.

Вы можете получить доступ ко всем тем же [Fixtures], что и само тело теста, а также к объекту [TestInfo], который предоставляет много полезной информации. Например, вы можете проверить, прошел ли тест или завершился сбоем.

  • test.afterEach(hookFunction)
  • test.afterEach(title, hookFunction)

Использование

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

В качестве альтернативы, вы можете объявить хук с заголовком.

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

Добавлено в: v1.10 test.test.beforeAll

Объявляет хук beforeAll, который выполняется один раз на каждый рабочий процесс перед всеми тестами.

Когда вызывается в области тестового файла, выполняется перед всеми тестами в файле. Когда вызывается внутри группы test.describe(), выполняется перед всеми тестами в группе.

Вы можете использовать test.afterAll() для завершения любых ресурсов, настроенных в beforeAll.

  • test.beforeAll(hookFunction)
  • test.beforeAll(title, hookFunction)

Использование

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

В качестве альтернативы, вы можете объявить хук с заголовком.

example.spec.ts
test.beforeAll('Setup', async () => {
console.log('Before tests');
});

Аргументы

  • title [string] (опционально) Добавлено в: v1.38#

Заголовок хука.

  • hookFunction [function]([Fixtures], [TestInfo])#

Функция хука, которая принимает один или два аргумента: объект с рабочими фикстурами и опциональный [TestInfo].

Детали

Когда добавляется несколько хуков beforeAll, они будут выполняться в порядке их регистрации.

Обратите внимание, что процесс рабочего процесса перезапускается при сбоях тестов, и хук beforeAll выполняется снова в новом рабочем процессе. Узнайте больше о рабочих процессах и сбоях.

Playwright продолжит выполнение всех применимых хуков, даже если некоторые из них завершились сбоем.


test.beforeEach

Добавлено в: v1.10 test.test.beforeEach

Объявляет хук beforeEach, который выполняется перед каждым тестом.

Когда вызывается в области тестового файла, выполняется перед каждым тестом в файле. Когда вызывается внутри группы test.describe(), выполняется перед каждым тестом в группе.

Вы можете получить доступ ко всем тем же [Fixtures], что и само тело теста, а также к объекту [TestInfo], который предоставляет много полезной информации. Например, вы можете навигировать по странице перед началом теста.

Вы можете использовать test.afterEach() для завершения любых ресурсов, настроенных в beforeEach.

  • test.beforeEach(hookFunction)
  • test.beforeEach(title, hookFunction)

Использование

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

В качестве альтернативы, вы можете объявить хук с заголовком.

example.spec.ts
test.beforeEach('Open start URL', async ({ page }) => {
console.log(`Running ${test.info().title}`);
await page.goto('https://my.start.url/');
});

Аргументы

  • title [string] (опционально) Добавлено в: v1.38#

Заголовок хука.

  • hookFunction [function]([Fixtures], [TestInfo])#

Функция хука, которая принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].

Детали

Когда добавляется несколько хуков beforeEach, они будут выполняться в порядке их регистрации.

Playwright продолжит выполнение всех применимых хуков, даже если некоторые из них завершились сбоем.


test.describe

Добавлено в: v1.10 test.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 }) => {
// ...
});
});

Узнайте больше о аннотациях тестов.

Аргументы

  • title [string] (опционально)#

Заголовок группы.

  • details [Object] (опционально) Добавлено в: v1.42#

  • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)
  • type [string]

    • description [string] (опционально)

Дополнительные детали для всех тестов в группе.

  • callback [function]#

Функция обратного вызова, которая выполняется сразу при вызове test.describe(). Любые тесты, объявленные в этой функции, будут принадлежать группе.


test.describe.configure

Добавлено в: v1.10 test.test.describe.configure

Конфигурирует окружающую область. Может быть выполнено как на верхнем уровне, так и внутри describe. Конфигурация применяется ко всей области, независимо от того, выполнена ли она до или после объявления теста.

Узнайте больше о режимах выполнения здесь.

Использование

  • Запуск тестов параллельно.
// Запустите все тесты в файле параллельно, используя параллельные рабочие процессы.
test.describe.configure({ mode: 'parallel' });
test('runs in parallel 1', async ({ page }) => {});
test('runs in parallel 2', async ({ page }) => {});
  • Запуск тестов последовательно, повторяя с начала.
note

Запуск последовательно не рекомендуется. Обычно лучше сделать ваши тесты изолированными, чтобы их можно было запускать независимо.

// Аннотируйте тесты как взаимозависимые.
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] (опционально)
  • mode "default" | "parallel" | "serial" (опционально)#

Режим выполнения. Узнайте больше о режимах выполнения здесь.

  • retries [number] (опционально) Добавлено в: v1.28#

Количество повторов для каждого теста.

  • timeout [number] (опционально) Добавлено в: v1.28#

Тайм-аут для каждого теста в миллисекундах. Переопределяет testProject.timeout и testConfig.timeout.


test.describe.fixme

Добавлено в: v1.25 test.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 }) => {
// Этот тест не будет выполнен
});
});

Вы также можете опустить заголовок.

test.describe.fixme(() => {
// ...
});

Аргументы

  • title [string] (опционально)#

Заголовок группы.

  • details [Object] (опционально) Добавлено в: v1.42#

  • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)
  • type [string]

    • description [string] (опционально)

См. test.describe() для описания деталей.

  • callback [function]#

Функция обратного вызова, которая выполняется сразу при вызове test.describe.fixme(). Любые тесты, добавленные в этой функции, будут принадлежать группе и не будут выполнены.


test.describe.only

Добавлено в: v1.10 test.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 }) => {
// Этот тест будет выполнен
});
});
test('not in the focused group', async ({ page }) => {
// Этот тест не будет выполнен
});

Вы также можете опустить заголовок.

test.describe.only(() => {
// ...
});

Аргументы

  • title [string] (опционально)#

Заголовок группы.

  • details [Object] (опционально) Добавлено в: v1.42#

  • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)
  • type [string]

    • description [string] (опционально)

См. test.describe() для описания деталей.

  • callback [function]#

Функция обратного вызова, которая выполняется сразу при вызове test.describe.only(). Любые тесты, добавленные в этой функции, будут принадлежать группе.


test.describe.skip

Добавлено в: v1.10 test.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 }) => {
// Этот тест не будет выполнен
});
});

Вы также можете опустить заголовок.

test.describe.skip(() => {
// ...
});

Аргументы

  • title [string]#

Заголовок группы.

  • details [Object] (опционально) Добавлено в: v1.42#

  • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)
  • type [string]

    • description [string] (опционально)

См. test.describe() для описания деталей.

  • callback [function]#

Функция обратного вызова, которая выполняется сразу при вызове test.describe.skip(). Любые тесты, добавленные в этой функции, будут принадлежать группе и не будут выполнены.


test.extend

Добавлено в: v1.10 test.test.extend

Расширяет объект test, определяя фикстуры и/или параметры, которые могут быть использованы в тестах.

Использование

Сначала определите фикстуру и/или параметр.

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();
},
});

Затем используйте фикстуру в тесте.

example.spec.ts
import { test } from './my-test';

test('test 1', async ({ todoPage }) => {
await todoPage.addToDo('my todo');
// ...
});

Настройте параметр в файле конфигурации.

playwright.config.ts
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!' },
},
]
});

Узнайте больше о фикстурах и параметризации тестов.

Аргументы

  • fixtures [Object]#

Объект, содержащий фикстуры и/или параметры. Узнайте больше о формате фикстур.

Возвращает

  • [Test]#

test.fail

Добавлено в: v1.10 test.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();
// ...
});

Аргументы

  • title [string] (опционально) Добавлено в: v1.42#

Заголовок теста.

  • details [Object] (опционально) Добавлено в: v1.42#

  • tag [string] | [Array]<[string]> (опционально)

  • annotation [Object] | [Array]<[Object]> (опционально)

  • type [string]

  • description [string] (опционально)

См. test() для описания деталей теста.

  • body [function]([Fixtures], [TestInfo]) (опционально) Добавлено в: v1.42#

Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].

  • condition [boolean] (опционально)#

Тест помечается как "должен завершиться сбоем", когда условие равно true.

  • callback [function]([Fixtures]):[boolean] (опционально)#

Функция, которая возвращает, следует ли пометить как "должен завершиться сбоем", на основе фикстур теста. Тест или тесты помечаются как "должны завершиться сбоем", когда возвращаемое значение равно true.

  • description [string] (опционально)#

Опциональное описание, которое будет отражено в отчете о тестировании.


test.fail.only

Добавлено в: v1.49 test.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 }) => {
// Этот тест ожидается, что он провалится
});
test('not in the focused group', async ({ page }) => {
// Этот тест не будет запущен
});

Аргументы

  • title [string] (опционально)#

    Название теста.

  • details [Object] (опционально)#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test.describe() для описания деталей теста.

  • body [function]([Fixtures], [TestInfo]) (опционально)#

    Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].


test.fixme

Добавлено в: v1.10 test.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', 'Эта функция ломается в Safari по какой-то причине');
// ...
});

Вы можете отметить все тесты в файле или группе test.describe() как "fixme" на основе некоторого условия с помощью одного вызова test.fixme(callback, description).

import { test, expect } from '@playwright/test';

test.fixme(({ browserName }) => browserName === 'webkit', 'Нужно разобраться с проблемой');

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('менее читаемый', async ({ page }) => {
test.fixme();
// ...
});

Аргументы

  • title [string] (опционально)#

    Название теста.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test() для описания деталей теста.

  • body [function]([Fixtures], [TestInfo]) (опционально)#

    Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].

  • condition [boolean] (опционально)#

    Тест помечается как "должен провалиться", когда условие true.

  • callback [function]([Fixtures]):[boolean] (опционально)#

    Функция, которая возвращает, следует ли пометить как "должен провалиться", на основе фикстур теста. Тест или тесты помечаются как "должен провалиться", когда возвращаемое значение true.

  • description [string] (опционально)#

    Опциональное описание, которое будет отражено в отчете о тестировании.


test.info

Добавлено в: v1.10 test.test.info

Возвращает информацию о текущем выполняемом тесте. Этот метод может быть вызван только во время выполнения теста, в противном случае он выбрасывает исключение.

Использование

test('example test', async ({ page }) => {
// ...
await test.info().attach('screenshot', {
body: await page.screenshot(),
contentType: 'image/png',
});
});

Возвращает

  • [TestInfo]#

test.only

Добавлено в: v1.10 test.test.only

Объявляет сфокусированный тест. Если есть несколько сфокусированных тестов или наборов, все они будут выполнены, но ничего больше.

  • test.only(title, body)
  • test.only(title, details, body)

Использование

test.only('focus this test', async ({ page }) => {
// Запустить только сфокусированные тесты во всем проекте.
});

Аргументы

  • title [string]#

    Название теста.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test() для описания деталей теста.

  • body [function]([Fixtures], [TestInfo])#

    Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].


test.setTimeout

Добавлено в: v1.10 test.test.setTimeout

Изменяет тайм-аут для теста. Ноль означает отсутствие тайм-аута. Узнайте больше о различных тайм-аутах.

Тайм-аут для текущего выполняемого теста доступен через 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 () => { /* ... */ });
    });

Аргументы

  • timeout [number]#

    Тайм-аут в миллисекундах.


test.skip

Добавлено в: v1.10 test.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('никогда не запускать', 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();
// ...
});

Аргументы

  • title [string] (опционально)#

    Название теста.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test() для описания деталей теста.

  • body [function]([Fixtures], [TestInfo]) (опционально)#

    Тело теста, которое принимает один или два аргумента: объект с фикстурами и опциональный [TestInfo].

  • condition [boolean] (опционально)#

    Тест помечается как "должен провалиться", когда условие true.

  • callback [function]([Fixtures]):[boolean] (опционально)#

    Функция, которая возвращает, следует ли пометить как "должен провалиться", на основе фикстур теста. Тест или тесты помечаются как "должен провалиться", когда возвращаемое значение true.

  • description [string] (опционально)#

    Опциональное описание, которое будет отражено в отчете о тестировании.


test.slow

Добавлено в: v1.10 test.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('медленный тест', 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 }) => {
// ...
});

Аргументы

  • condition [boolean] (опционально)#

    Тест помечается как "медленный", когда условие true.

  • callback [function]([Fixtures]):[boolean] (опционально)#

    Функция, которая возвращает, следует ли пометить как "медленный", на основе фикстур теста. Тест или тесты помечаются как "медленный", когда возвращаемое значение true.

  • description [string] (опционально)#

    Опциональное описание, которое будет отражено в отчете о тестировании.


test.step

Добавлено в: v1.10 test.test.step

Объявляет шаг теста, который отображается в отчете.

Использование

import { test, expect } from '@playwright/test';

test('тест', async ({ page }) => {
await test.step('Войти', async () => {
// ...
});

await test.step('Внешний шаг', async () => {
// ...
// Вы можете вкладывать шаги друг в друга.
await test.step('Внутренний шаг', async () => {
// ...
});
});
});

Аргументы

  • title [string]#

    Название шага.

  • body [function]([TestStepInfo]):[Promise]<[Object]>#

    Тело шага.

  • options [Object] (опционально)

    • box [boolean] (опционально) Добавлено в: v1.39#

      Указывает, следует ли обрамлять шаг в отчете. По умолчанию false. Когда шаг обрамлен, ошибки, выбрасываемые из внутренних частей шага, указывают на место вызова шага. См. ниже для более подробной информации.

    • location [Location] (опционально) Добавлено в: v1.48#

      Указывает пользовательское местоположение для отображения шага в отчетах о тестах и в просмотрщике трассировок. По умолчанию отображается местоположение вызова test.step().

    • timeout [number] (опционально) Добавлено в: v1.50#

      Максимальное время в миллисекундах, разрешенное для завершения шага. Если шаг не завершится в течение указанного времени, метод test.step() выбросит [TimeoutError]. По умолчанию 0 (без тайм-аута).

Возвращает

  • [Promise]<[Object]>#

Детали

Метод возвращает значение, возвращаемое обратным вызовом шага.

import { test, expect } from '@playwright/test';

test('тест', async ({ page }) => {
const user = await test.step('Войти', 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

Добавлено в: v1.50 test.test.step.skip

Отметьте шаг теста как "пропустить", чтобы временно отключить его выполнение, полезно для шагов, которые в настоящее время не удаются и планируются для исправления в ближайшее время. Playwright не будет выполнять шаг. См. также testStepInfo.skip().

Мы рекомендуем testStepInfo.skip() вместо этого.

Использование

Вы можете объявить пропущенный шаг, и Playwright не будет его выполнять.

import { test, expect } from '@playwright/test';

test('мой тест', async ({ page }) => {
// ...
await test.step.skip('еще не готово', async () => {
// ...
});
});

Аргументы

  • title [string]#

    Название шага.

  • body [function]():[Promise]<[Object]>#

    Тело шага.

  • options [Object] (опционально)

    • box [boolean] (опционально)#

      Указывает, следует ли обрамлять шаг в отчете. По умолчанию false. Когда шаг обрамлен, ошибки, выбрасываемые из внутренних частей шага, указывают на место вызова шага. См. ниже для более подробной информации.

    • location [Location] (опционально)#

      Указывает пользовательское местоположение для отображения шага в отчетах о тестах и в просмотрщике трассировок. По умолчанию отображается местоположение вызова test.step().

    • timeout [number] (опционально)#

      Максимальное время в миллисекундах для завершения шага. По умолчанию 0 (без тайм-аута).

Возвращает

  • [Promise]<[void]>#

test.use

Добавлено в: v1.10 test.test.use

Указывает параметры или фикстуры для использования в одном тестовом файле или группе test.describe(). Наиболее полезно для установки параметра, например, установки locale для настройки фикстуры context.

Использование

import { test, expect } from '@playwright/test';

test.use({ locale: 'en-US' });

test('тест с локалью', 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('тест с локалью', async ({ page }) => {
// Контекст и страница по умолчанию имеют указанную локаль
});

Свойства

test.expect

Добавлено в: v1.10 test.test.expect

Функция expect может быть использована для создания утверждений теста. Подробнее о утверждениях теста.

Использование

test('example', async ({ page }) => {
await test.expect(page).toHaveTitle('Title');
});

Тип

  • [Object]

Устаревшее

test.describe.parallel

Добавлено в: v1.10 test.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('группа', () => {
test('выполняется параллельно 1', async ({ page }) => {});
test('выполняется параллельно 2', async ({ page }) => {});
});

Обратите внимание, что параллельные тесты выполняются в отдельных процессах и не могут разделять состояние или глобальные переменные. Каждый из параллельных тестов выполняет все соответствующие хуки.

Вы также можете опустить название.

test.describe.parallel(() => {
// ...
});

Аргументы

  • title [string] (опционально)#

    Название группы.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test.describe() для описания деталей.

  • callback [function]#

    Обратный вызов, который выполняется сразу при вызове test.describe.parallel(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе.


test.describe.parallel.only

Добавлено в: v1.10 test.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('группа', () => {
test('выполняется параллельно 1', async ({ page }) => {});
test('выполняется параллельно 2', async ({ page }) => {});
});

Вы также можете опустить название.

test.describe.parallel.only(() => {
// ...
});

Аргументы

  • title [string] (опционально)#

    Название группы.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test.describe() для описания деталей.

  • callback [function]#

    Обратный вызов, который выполняется сразу при вызове test.describe.parallel.only(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе.


test.describe.serial

Добавлено в: v1.10 test.test.describe.serial
Не рекомендуется

См. test.describe.configure() для предпочтительного способа настройки режима выполнения.

Объявляет группу тестов, которые всегда должны выполняться последовательно. Если один из тестов не удается, все последующие тесты пропускаются. Все тесты в группе повторяются вместе.

note

Использование последовательного выполнения не рекомендуется. Обычно лучше сделать ваши тесты изолированными, чтобы они могли выполняться независимо.

  • test.describe.serial(title, callback)
  • test.describe.serial(title)
  • test.describe.serial(title, details, callback)

Использование

test.describe.serial('группа', () => {
test('выполняется первым', async ({ page }) => {});
test('выполняется вторым', async ({ page }) => {});
});

Вы также можете опустить название.

test.describe.serial(() => {
// ...
});

Аргументы

  • title [string] (опционально)#

    Название группы.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test.describe() для описания деталей.

  • callback [function]#

    Обратный вызов, который выполняется сразу при вызове test.describe.serial(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе.


test.describe.serial.only

Добавлено в: v1.10 test.test.describe.serial.only
Не рекомендуется

См. test.describe.configure() для предпочтительного способа настройки режима выполнения.

Объявляет сфокусированную группу тестов, которые всегда должны выполняться последовательно. Если один из тестов не удается, все последующие тесты пропускаются. Все тесты в группе повторяются вместе. Если есть несколько сфокусированных тестов или наборов, все они будут выполнены, но ничего больше.

note

Использование последовательного выполнения не рекомендуется. Обычно лучше сделать ваши тесты изолированными, чтобы они могли выполняться независимо.

  • test.describe.serial.only(title, callback)
  • test.describe.serial.only(title)
  • test.describe.serial.only(title, details, callback)

Использование

test.describe.serial.only('группа', () => {
test('выполняется первым', async ({ page }) => {
});
test('выполняется вторым', async ({ page }) => {
});
});

Вы также можете опустить название.

test.describe.serial.only(() => {
// ...
});

Аргументы

  • title [string]#

    Название группы.

  • details [Object] (опционально) Добавлено в: v1.42#

    • tag [string] | [Array]<[string]> (опционально)

    • annotation [Object] | [Array]<[Object]> (опционально)

      • type [string]

      • description [string] (опционально)

    См. test.describe() для описания деталей.

  • callback [function]#

    Обратный вызов, который выполняется сразу при вызове test.describe.serial.only(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе.