Тестирование 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Объект (необязательно)Дополнительные детали теста.
-
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объект (необязательно)Дополнительные сведения для всех тестов в группе.
-
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объект (необязательно)См. 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Объект (необязательно)См. 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Объект (необязательно)См. 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Объект (необязательно)См. 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Объект (необязательно)См. 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объект (необязательно)См. 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',
});
}); Возвращаемое значение
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объект (необязательно)См. 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Объект (необязательно)См. 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. Если шаг в рамках, ошибки, возникшие внутри шага, указывают на место вызова шага. Дополнительные сведения см. ниже. -
locationLocation (необязательно)Указывает пользовательское местоположение для отображения шага в отчетах о тесте и просмотре трассировки. По умолчанию отображается местоположение вызова test.step().
-
Возвращает
Подробности
Метод возвращает значение, возвращенное обратным вызовом шага.
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
}); Аргументы
-
optionsTestOptionsОбъект с локальными параметрами.
Подробности
test.use можно вызывать либо в глобальной области видимости, либо внутри test.describe. Вызывать его внутри beforeEach или beforeAll — ошибка.
Также можно переопределить фикстуру, передав функцию.
import { test, expect } from '@playwright/test';
test.use({
locale: async ({}, use) => {
// Read locale from some configuration file.
const locale = await fs.promises.readFile('test-locale', 'utf-8');
await use(locale);
},
});
test('test with locale', async ({ page }) => {
// Default context and page have locale as specified
}); Свойства
test.expect
expect функция может использоваться для создания утверждений теста. Подробнее об утверждениях тестов.
Использование
test('example', async ({ page }) => {
await test.expect(page).toHaveTitle('Title');
}); Тип
Устаревшее
test.describe.parallel
Не рекомендуетсяСм. test.describe.configure() для предпочтительного способа настройки режима выполнения.
Объявляет группу тестов, которые могут выполняться параллельно. По умолчанию тесты в одном файле выполняются последовательно, но с помощью test.describe.parallel() они могут выполняться параллельно.
test.describe.parallel(title, callback)test.describe.parallel(callback)test.describe.parallel(title, details, callback)
Использование
test.describe.parallel('group', () => {
test('runs in parallel 1', async ({ page }) => {});
test('runs in parallel 2', async ({ page }) => {});
}); Обратите внимание, что параллельные тесты выполняются в отдельных процессах и не могут совместно использовать состояние или глобальные переменные. Каждый из параллельных тестов выполняет все соответствующие хуки.
Вы также можете опустить заголовок.
test.describe.parallel(() => {
// ...
}); Аргументы
-
titleстрока (необязательно)Заголовок группы.
-
detailsобъект (необязательно)См. 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объект (необязательно)См. 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объект (необязательно)См. 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Объект (необязательно)См. test.describe() для подробного описания.
-
callbackфункцияОбратный вызов, который выполняется немедленно при вызове test.describe.serial.only(). Любые тесты, добавленные в этот обратный вызов, будут принадлежать группе.
© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/api/class-test