Skip to content
Vitest 2
Main Navigation РуководствоAPIКонфигурацияРежим браузераПродвинутый
3.2.0
2.1.9
1.6.1
0.34.6

Русский

English
简体中文
繁體中文
Español
Français
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Русский

English
简体中文
繁體中文
Español
Français
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Внешний вид

Sidebar Navigation

Why Browser Mode?

Getting Started

Context API

Interactivity API

Locators

Assertion API

Commands API

Содержание страницы

Команды ​

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

Встроенные команды ​

Работа с файлами ​

Для работы с файлами в браузерных тестах можно использовать API readFile, writeFile и removeFile. Все пути вычисляются относительно тестового файла, даже если вызов происходит из вспомогательной функции в другом файле.

По умолчанию Vitest использует кодировку utf-8, но ее можно изменить с помощью опций.

TIP

Этот API подчиняется ограничениям server.fs из соображений безопасности.

ts
import { server } from '@vitest/browser/context';

const { readFile, writeFile, removeFile } = server.commands;

it('handles files', async () => {
  const file = './test.txt';

  await writeFile(file, 'hello world');
  const content = await readFile(file);

  expect(content).toBe('hello world');

  await removeFile(file);
});

Сессия CDP ​

Vitest предоставляет прямой доступ к протоколу Chrome Devtools Protocol через метод cdp, экспортируемый из @vitest/browser/context. Это особенно полезно для разработчиков библиотек при создании инструментов.

ts
import { cdp } from '@vitest/browser/context';

const input = document.createElement('input');
document.body.appendChild(input);
input.focus();

await cdp().send('Input.dispatchKeyEvent', {
  type: 'keyDown',
  text: 'a',
});

expect(input).toHaveValue('a');

WARNING

Сессия CDP работает только с провайдером playwright и только при использовании браузера chromium. Подробнее об этом можно прочитать в документации CDPSession Playwright.

Пользовательские команды ​

Вы можете добавлять собственные команды через параметр конфигурации browser.commands. Если вы разрабатываете библиотеку, вы можете предоставить их через хук config в плагине:

ts
import type { Plugin } from 'vitest/config';
import type { BrowserCommand } from 'vitest/node';

const myCustomCommand: BrowserCommand<[arg1: string, arg2: string]> = (
  { testPath, provider },
  arg1,
  arg2
) => {
  if (provider.name === 'playwright') {
    console.log(testPath, arg1, arg2);
    return { someValue: true };
  }

  throw new Error(`provider ${provider.name} is not supported`);
};

export default function BrowserCommands(): Plugin {
  return {
    name: 'vitest:custom-commands',
    config() {
      return {
        test: {
          browser: {
            commands: {
              myCustomCommand,
            },
          },
        },
      };
    },
  };
}

Затем вы можете вызвать ее в своем тесте, импортировав из @vitest/browser/context:

ts
import { commands } from '@vitest/browser/context';
import { expect, test } from 'vitest';

test('custom command works correctly', async () => {
  const result = await commands.myCustomCommand('test1', 'test2');
  expect(result).toEqual({ someValue: true });
});

// if you are using TypeScript, you can augment the module
declare module '@vitest/browser/context' {
  interface BrowserCommands {
    myCustomCommand: (
      arg1: string,
      arg2: string
    ) => Promise<{
      someValue: true;
    }>;
  }
}

WARNING

Пользовательские функции переопределяют встроенные, если у них одинаковое имя.

Пользовательские команды playwright ​

Vitest предоставляет несколько специфичных для playwright свойств в контексте команды.

  • page ссылается на полную страницу, содержащую тестовый iframe. Это основная HTML-страница, и ее изменение может нарушить работу.
  • frame — это асинхронный метод, который вернет Frame тестовой среды. У него похожий API на page, но он не поддерживает некоторые методы. Для поиска элементов лучше использовать context.iframe, так как это более стабильно и быстро.
  • iframe — это FrameLocator, который следует использовать для запроса других элементов на странице.
  • context ссылается на уникальный BrowserContext.
ts
import { BrowserCommand } from 'vitest/node';

export const myCommand: BrowserCommand<[string, number]> = async (
  ctx,
  arg1: string,
  arg2: number
) => {
  if (ctx.provider.name === 'playwright') {
    const element = await ctx.iframe.findByRole('alert');
    const screenshot = await element.screenshot();
    // do something with the screenshot
    return difference;
  }
};

TIP

Если вы используете TypeScript, добавьте @vitest/browser/providers/playwright в поле "compilerOptions.types" вашего tsconfig, чтобы получить автодополнение в конфигурации и для опций userEvent и page:

json
{
  "compilerOptions": {
    "types": ["@vitest/browser/providers/playwright"]
  }
}

Пользовательские команды webdriverio ​

Vitest предоставляет некоторые специфичные для webdriverio свойства в объекте контекста.

  • browser — это API WebdriverIO.Browser.

Vitest автоматически переключает контекст webdriver на тестовый iframe, вызывая browser.switchToFrame перед выполнением команды. Поэтому методы $ и $$ ссылаются на элементы внутри iframe, а не на элементы в оркестраторе. Однако методы, не относящиеся к webdriver, по-прежнему будут ссылаться на контекст родительского фрейма.

TIP

Если вы используете TypeScript, добавьте @vitest/browser/providers/webdriverio в поле "compilerOptions.types" вашего tsconfig, чтобы получить автодополнение:

json
{
  "compilerOptions": {
    "types": ["@vitest/browser/providers/webdriverio"]
  }
}
Pager
Предыдущая страницаAssertion API

Выпущено на условиях лицензии MIT.

Авторские права (c) 2021-Present Vitest Team

https://v2.vitest.dev/guide/browser/commands

Выпущено на условиях лицензии MIT.

Авторские права (c) 2021-Present Vitest Team