Spec-Zone.ru › Playwright

Тестирование 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.
});

Подробнее о блокировках тестов.

Аргументы

  • title string

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

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

      • description string (необязательно)

        Необязательное описание аннотации, например URL-адрес задачи.

    • lock string | Array<string> (необязательно)

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

  • body function(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();
  });
  // ...
});

Аргументы

  • message string (необязательно)

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

test.afterAll​

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

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

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

test.afterAll(async () => {
  console.log('Done with tests');
  // ...
});

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

test.afterAll('Teardown', async () => {
  console.log('Done with tests');
  // ...
});

Аргументы

  • title string (необязательно)

    Название хука.

  • hookFunction function(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()}`);
});

Аргументы

  • title string (необязательно)

    Название хука.

  • hookFunction function(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');
});

Аргументы

  • title string (необязательно)

    Название хука.

  • hookFunction function(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/');
});

Аргументы

  • title string (необязательно)

    Название хука.

  • hookFunction function(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 }) => {
    // ...
  });
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    • lock string | Array<string> (необязательно)

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

  • callback function

    Функция обратного вызова, которая выполняется сразу при вызове 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 }) => {});
    });

Аргументы

  • options Object (необязательно)
    • mode "default" | "parallel" | "serial" (необязательно)

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

    • retries number (необязательно)

      Количество повторных запусков для каждого теста.

    • timeout number (необязательно)

      Время ожидания для каждого теста в миллисекундах. Переопределяет 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(() => {
  // ...
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в test.describe().

  • callback function

    Функция обратного вызова, которая выполняется сразу при вызове 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(() => {
  // ...
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в test.describe().

  • callback function

    Функция обратного вызова, которая выполняется сразу при вызове 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(() => {
  // ...
});

Аргументы

  • title string

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в test.describe().

  • callback function

    Функция обратного вызова, которая выполняется сразу при вызове 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!' },
    },
  ]
});

Подробнее о фикстурах и параметризации тестов.

Аргументы

  • fixtures Object

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

Возвращает

  • 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 (необязательно)

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

  • details Object (необязательно)

    • 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.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
});

Аргументы

  • 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​

Помечает тест как «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();
  // ...
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

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

  • body function(Fixtures, TestInfo) (необязательно)

    Тело теста, принимающее один или два аргумента: объект с фикстурами и необязательный TestInfo.

  • condition boolean (необязательно)

    Тест помечается как «fixme», если условие равно true.

  • callback function(Fixtures):boolean (необязательно)

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

  • description string (необязательно)

    Необязательное описание, которое будет отображаться в отчёте о тестировании.

test.info​

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

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

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

Возвращает

  • TestInfo

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.
});

Аргументы

  • title string

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

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

  • body function(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 () => { /* ... */ });
    });

Аргументы

  • timeout number

    Время ожидания в миллисекундах.

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

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • 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​

Помечает тест как «медленный». Для медленного теста будет установлено тройное значение стандартного времени ожидания.

Обратите внимание: 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 }) => {
  // ...
});

Аргументы

  • condition boolean (необязательно)

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

  • callback function(Fixtures):boolean (необязательно)

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

  • description string (необязательно)

    Необязательное описание, которое будет отображаться в отчёте о тестировании.

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 () => {
      // ...
    });
  });
});

Аргументы

  • title string

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

  • body function(TestStepInfo):Promise<Object>

    Тело шага.

  • options Object (необязательно)

    • box boolean (необязательно)

      Нужно ли заключить шаг в рамку в отчёте. По умолчанию используется false. Если шаг заключён в рамку, ошибки, выброшенные внутри шага, указывают на место вызова шага. Подробнее см. ниже.

    • location Location (необязательно)

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

    • params Object<string, Object> (необязательно)

      Произвольные сериализуемые параметры, описывающие шаг. Они передаются средствам формирования отчётов как testStep.params и отображаются в средстве просмотра трассировок.

    • timeout number (необязательно)

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

Возвращает

  • Promise<Object>

Подробности

Метод возвращает значение, возвращённое 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 () => {
    // ...
  });
});

Аргументы

  • title string

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

  • body function():Promise<Object>

    Тело шага.

  • options Object (необязательно)

    • box boolean (необязательно)

      Нужно ли изолировать шаг в отчёте. По умолчанию — false. Если шаг изолирован, ошибки, возникающие внутри него, указывают на место вызова шага. Подробнее см. ниже.

    • location Location (необязательно)

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

    • params Object<string, Object> (необязательно)

      Произвольные сериализуемые параметры, описывающие шаг. Они передаются репортерам как testStep.params и отображаются в средстве просмотра трассировок.

    • timeout number (необязательно)

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

Возвращает

  • Promise<void>

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

Аргументы

  • options TestOptions

    Объект с локальными параметрами.

Подробности

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');
});

Тип

  • Object

Устарело​

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(() => {
  // ...
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в разделе test.describe().

  • callback function

    Callback-функция, которая выполняется сразу при вызове 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(() => {
  // ...
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в разделе test.describe().

  • callback function

    Callback-функция, которая выполняется сразу при вызове 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(() => {
  // ...
});

Аргументы

  • title string (необязательно)

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в разделе test.describe().

  • callback function

    Callback-функция, которая выполняется сразу при вызове 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(() => {
  // ...
});

Аргументы

  • title string

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

  • details Object (необязательно)

    • tag string | Array<string> (необязательно)

    • annotation Object | Array<Object> (необязательно)

      • type string

      • description string (необязательно)

    Подробное описание см. в разделе test.describe().

  • callback function

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

© 2026 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/api/class-test

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API