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.

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

Аргументы

  • title строка

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

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

      • description строка (необязательно)

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

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

  • body функция(Фикстуры, TestInfo)

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

test.afterAll​

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

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

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

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

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

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

Аргументы

  • title строка (необязательно)

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

  • hookFunction функция(Фикстуры, 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 строка (необязательно)

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

  • hookFunction функция(Фикстуры, 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 строка (необязательно)

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

  • hookFunction функция(Фикстуры, 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 строка (необязательно)

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

  • hookFunction функция(Фикстуры, 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 }) => {
    // ...
  });
});

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

Аргументы

  • title строка (необязательно)

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

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

  • callback функция

    Обратный вызов, который выполняется немедленно при вызове 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 }) => {});
  • Выполнение тестов последовательно, повторяя с начала.

    прим.

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

    // 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 объект (необязательно)
    • mode "default" | "parallel" | "serial" (необязательно)

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

    • retries число (необязательно)

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

    • timeout число (необязательно)

      Таймаут для каждого теста в миллисекундах. Переопределяет 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 строка (необязательно)

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

    Обратный вызов, который выполняется немедленно при вызове 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 строка (необязательно)

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

    Обратный вызов, который выполняется немедленно при вызове 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 строка

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

    Обратный вызов, который выполняется немедленно при вызове 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 Объект

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

Возвращаемое значение

  • Тест

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

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

      • description строка (необязательно)

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

  • body функция(Fixtures, TestInfo) (необязательно)

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

  • condition логическое (необязательно)

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

  • callback функция(Fixtures):логическое (необязательно)

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

  • description строка (необязательно)

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

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

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

      • description строка (необязательно)

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

  • body функция(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 строка (необязательно)

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

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

  • body функция(Fixtures, TestInfo) (необязательно)

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

  • condition логический (необязательно)

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

  • callback функция(Fixtures):логический (необязательно)

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

  • description строка (необязательно)

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

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 строка

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

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

  • body функция(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 число

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

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

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

      • description строка (необязательно)

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

  • body функция(Fixtures, TestInfo) (необязательно)

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

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

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

  • callback функция(Fixtures):булево (необязательно)

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

  • description строка (необязательно)

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

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

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

  • callback функция(Fixtures):булево (необязательно)

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

  • description строка (необязательно)

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

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 строка

    Имя шага.

  • body функция():Promise<Объект>

    Тело шага.

  • options Объект (необязательно)

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

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

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

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

Возвращает

  • Promise<Объект>

Подробности

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

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

test('test', async ({ page }) => {
  const user = await test.step('Log in', async () => {
    // ...
    return 'john';
  });
  expect(user).toBe('john');
});

Декоратор

Вы можете использовать декораторы методов TypeScript для преобразования метода в шаг. Каждый вызов декорированного метода будет отображаться как шаг в отчете.

function step(target: Function, context: ClassMethodDecoratorContext) {
  return function replacementMethod(...args: any) {
    const name = this.constructor.name + '.' + (context.name as string);
    return test.step(name, async () => {
      return await target.call(this, ...args);
    });
  };
}

class LoginPage {
  constructor(readonly page: Page) {}

  @step
  async login() {
    const account = { username: 'Alice', password: 's3cr3t' };
    await this.page.getByLabel('Username or email address').fill(account.username);
    await this.page.getByLabel('Password').fill(account.password);
    await this.page.getByRole('button', { name: 'Sign in' }).click();
    await expect(this.page.getByRole('button', { name: 'View profile and more' })).toBeVisible();
  }
}

test('example', async ({ page }) => {
  const loginPage = new LoginPage(page);
  await loginPage.login();
});

Оформление в рамки

Когда что-то внутри шага завершается ошибкой, обычно вы видите ошибку, указывающую на точное действие, которое вызвало ошибку. Например, рассмотрим следующий шаг входа в систему:

async function login(page) {
  await test.step('login', async () => {
    const account = { username: 'Alice', password: 's3cr3t' };
    await page.getByLabel('Username or email address').fill(account.username);
    await page.getByLabel('Password').fill(account.password);
    await page.getByRole('button', { name: 'Sign in' }).click();
    await expect(page.getByRole('button', { name: 'View profile and more' })).toBeVisible();
  });
}

test('example', async ({ page }) => {
  await page.goto('https://github.com/login');
  await login(page);
});
Error: Timed out 5000ms waiting for expect(locator).toBeVisible()
  ... error details omitted ...

   8 |     await page.getByRole('button', { name: 'Sign in' }).click();
>  9 |     await expect(page.getByRole('button', { name: 'View profile and more' })).toBeVisible();
     |                                                                               ^
  10 |   });

Как мы видим выше, тест может завершиться ошибкой, указывая на ошибку внутри шага. Если вы хотите, чтобы ошибка выделяла шаг «вход в систему» вместо его внутренней части, используйте параметр 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.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');
});

Тип

  • Объект

Устаревшее​

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

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

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

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

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

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

test.describe.serial​

Не рекомендуется

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

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

примечание

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

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

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

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

    • tag строка | массив<строка> (необязательно)

    • annotation объект | массив<объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

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

test.describe.serial.only​

Не рекомендуется

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

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

примечание

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

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

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

test.describe.serial.only('group', () => {
  test('runs first', async ({ page }) => {
  });
  test('runs second', async ({ page }) => {
  });
});

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

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

Аргументы

  • title строка

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

  • details Объект (необязательно)

    • tag строка | Массив<строка> (необязательно)

    • annotation Объект | Массив<Объект> (необязательно)

      • type строка

      • description строка (необязательно)

    См. test.describe() для подробного описания.

  • callback функция

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

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

Spec-Zone.ru

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