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

このページの内容

インタラクティビティ API ​

Vitest は、イベントを偽装する代わりに Chrome DevTools Protocol または webdriver を使用して、@testing-library/user-event API のサブセットを実装しています。これにより、ブラウザの動作がより信頼性が高く、ユーザーのページ操作との一貫性があります。

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

await userEvent.click(document.querySelector('.button'));

ほとんどすべての userEvent メソッドは、プロバイダーのオプションを継承します。IDE で利用可能なすべてのオプションを確認するには、プロバイダーに応じて、tsconfig.json ファイルに webdriver または playwright の型定義を追加します。

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

userEvent.setup ​

ts
function setup(): UserEvent;

新しいユーザーイベントのインスタンスを作成します。これは、キーボードの押下状態を正しく維持する必要がある場合に便利です。

WARNING

@testing-library/user-event とは異なり、@vitest/browser/context のデフォルトの userEvent インスタンスは、メソッドが呼び出されるたびにではなく、一度だけ作成されます!このスニペットで動作の違いを確認できます。

ts
import { userEvent as vitestUserEvent } from '@vitest/browser/context';
import { userEvent as originalUserEvent } from '@testing-library/user-event';

await vitestUserEvent.keyboard('{Shift}'); // Shift キーを押したままにする
await vitestUserEvent.keyboard('{/Shift}'); // Shift キーを離す

await originalUserEvent.keyboard('{Shift}'); // Shift キーを押したままにする
await originalUserEvent.keyboard('{/Shift}'); // 状態が異なるため、Shift キーを離さない

この動作は、キーボードをエミュレートせず、実際に Shift キーを押すため、より便利になります。元の動作を維持すると、フィールドに入力する際に予期しない問題が発生する可能性があります。

userEvent.click ​

ts
function click(
  element: Element | Locator,
  options?: UserEventClickOptions
): Promise<void>;

要素をクリックします。このメソッドはプロバイダーのオプションを継承します。このメソッドの詳細は、プロバイダーのドキュメントを参照してください。

ts
import { page, userEvent } from '@vitest/browser/context';

test('clicks on an element', async () => {
  const logo = page.getByRole('img', { name: /logo/ });

  await userEvent.click(logo);
  // またはロケーターから直接アクセスすることもできます
  await logo.click();
});

参照:

  • Playwright locator.click API
  • WebdriverIO element.click API
  • testing-library click API

userEvent.dblClick ​

ts
function dblClick(
  element: Element | Locator,
  options?: UserEventDoubleClickOptions
): Promise<void>;

要素に対してダブルクリックイベントを発生させます。

このメソッドの詳細は、プロバイダーのドキュメントを参照してください。

ts
import { page, userEvent } from '@vitest/browser/context';

test('triggers a double click on an element', async () => {
  const logo = page.getByRole('img', { name: /logo/ });

  await userEvent.dblClick(logo);
  // またはロケーターから直接アクセスすることもできます
  await logo.dblClick();
});

参照:

  • Playwright locator.dblclick API
  • WebdriverIO element.doubleClick API
  • testing-library dblClick API

userEvent.tripleClick ​

ts
function tripleClick(
  element: Element | Locator,
  options?: UserEventTripleClickOptions
): Promise<void>;

要素に対してトリプルクリックイベントを発生させます。ブラウザ API には tripleclick がないため、このメソッドは連続して3回クリックイベントを発生させます。したがって、イベントをフィルタリングするには、クリックイベントの詳細を確認する必要があります(evt.detail === 3)。

このメソッドの詳細は、プロバイダーのドキュメントを参照してください。

ts
import { page, userEvent } from '@vitest/browser/context';

test('triggers a triple click on an element', async () => {
  const logo = page.getByRole('img', { name: /logo/ });
  let tripleClickFired = false;
  logo.addEventListener('click', evt => {
    if (evt.detail === 3) {
      tripleClickFired = true;
    }
  });

  await userEvent.tripleClick(logo);
  // またはロケーターから直接アクセスすることもできます
  await logo.tripleClick();

  expect(tripleClickFired).toBe(true);
});

参照:

  • Playwright locator.click API: clickCount: 3 を指定した click を介して実装されます。
  • WebdriverIO browser.action API: move とそれに続く 3 つの down + up + pause イベントを伴うアクション API を介して実装されます。
  • testing-library tripleClick API

userEvent.fill ​

ts
function fill(element: Element | Locator, text: string): Promise<void>;

input、textarea、または contenteditable フィールドに値を設定します。これにより、新しい値を設定する前に、入力内の既存のテキストはすべて削除されます。

ts
import { page, userEvent } from '@vitest/browser/context';

test('update input', async () => {
  const input = page.getByRole('input');

  await userEvent.fill(input, 'foo'); // input.value == foo
  await userEvent.fill(input, '{{a[['); // input.value == {{a[[
  await userEvent.fill(input, '{Shift}'); // input.value == {Shift}

  // またはロケーターから直接アクセスすることもできます
  await input.fill('foo'); // input.value == foo
});

このメソッドは要素にフォーカスし、値を設定し、その後 input イベントをトリガーします。空の文字列を使うことでフィールドをクリアできます。

TIP

この API は userEvent.type または userEvent.keyboard を使用するよりも高速ですが、user-event keyboard 構文(例: {Shift}{selectall})はサポートしていません。

特殊文字を入力する必要がない場合や、キー押下イベントを細かく制御する必要がない場合は、userEvent.type よりもこの API を使用することをお勧めします。

参照:

  • Playwright locator.fill API
  • WebdriverIO element.setValue API
  • testing-library type API

userEvent.keyboard ​

ts
function keyboard(text: string): Promise<void>;

userEvent.keyboard を使用すると、キーストロークをトリガーできます。入力にフォーカスがある場合、その入力に文字を入力します。それ以外の場合は、現在フォーカスされている要素(フォーカスされている要素がない場合は document.body)に対してキーボードイベントをトリガーします。

この API は user-event keyboard 構文をサポートしています。

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

test('trigger keystrokes', async () => {
  await userEvent.keyboard('foo'); // 以下に変換されます: f, o, o
  await userEvent.keyboard('{{a[['); // 以下に変換されます: {, a, [
  await userEvent.keyboard('{Shift}{f}{o}{o}'); // 以下に変換されます: Shift, f, o, o
  await userEvent.keyboard('{a>5}'); // a を離さずに押したまま、5 回 keydown をトリガー
  await userEvent.keyboard('{a>5/}'); // a を 5 回 keydown した後、離す
});

参照:

  • Playwright Keyboard API
  • WebdriverIO action('key') API
  • testing-library type API

userEvent.tab ​

ts
function tab(options?: UserEventTabOptions): Promise<void>;

Tab キーイベントを送信します。これは userEvent.keyboard('{tab}') の省略形です。

ts
import { page, userEvent } from '@vitest/browser/context';

test('tab works', async () => {
  const [input1, input2] = page.getByRole('input').elements();

  expect(input1).toHaveFocus();

  await userEvent.tab();

  expect(input2).toHaveFocus();

  await userEvent.tab({ shift: true });

  expect(input1).toHaveFocus();
});

参照:

  • Playwright Keyboard API
  • WebdriverIO action('key') API
  • testing-library tab API

userEvent.type ​

ts
function type(
  element: Element | Locator,
  text: string,
  options?: UserEventTypeOptions
): Promise<void>;

WARNING

特殊文字(例: {shift} または {selectall})を使用しない場合は、パフォーマンス向上のため、代わりに userEvent.fill を使用することをお勧めします。

type メソッドは、keyboard API を基盤として構築された @testing-library/user-event の type ユーティリティを実装しています。

この関数を使用すると、input、textarea、または contenteditable 要素に文字を入力できます。これは user-event keyboard 構文をサポートしています。

入力フィールド以外で文字を押す必要がある場合は、userEvent.keyboard API を使用してください。

ts
import { page, userEvent } from '@vitest/browser/context';

test('update input', async () => {
  const input = page.getByRole('input');

  await userEvent.type(input, 'foo'); // input.value == foo
  await userEvent.type(input, '{{a[['); // input.value == foo{a[
  await userEvent.type(input, '{Shift}'); // input.value == foo{a[
});

INFO

Vitest は、input.type のようなロケーターには .type メソッドを公開していません。これは userEvent ライブラリとの互換性のためだけに存在します。代わりに .fill を使用することを検討してください。.fill の方が高速です。

参照:

  • Playwright locator.press API
  • WebdriverIO action('key') API
  • testing-library type API

userEvent.clear ​

ts
function clear(element: Element | Locator): Promise<void>;

このメソッドは、入力要素の内容をクリアします。

ts
import { page, userEvent } from '@vitest/browser/context';

test('clears input', async () => {
  const input = page.getByRole('input');

  await userEvent.fill(input, 'foo');
  expect(input).toHaveValue('foo');

  await userEvent.clear(input);
  // またはロケーターから直接アクセスすることもできます
  await input.clear();

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

参照:

  • Playwright locator.clear API
  • WebdriverIO element.clearValue API
  • testing-library clear API

userEvent.selectOptions ​

ts
function selectOptions(
  element: Element | Locator,
  values: HTMLElement | HTMLElement[] | Locator | Locator[] | string | string[],
  options?: UserEventSelectOptions
): Promise<void>;

userEvent.selectOptions を使用すると、<select> 要素で値を選択できます。

WARNING

select 要素が multiple 属性がない場合、Vitest は配列の最初の値のみを選択します。

@testing-library とは異なり、Vitest は現時点では listbox をサポートしていませんが、将来的にサポートを追加する予定です。

ts
import { page, userEvent } from '@vitest/browser/context';

test('clears input', async () => {
  const select = page.getByRole('select');

  await userEvent.selectOptions(select, 'Option 1');
  // またはロケーターから直接アクセスすることもできます
  await select.selectOptions('Option 1');

  expect(select).toHaveValue('option-1');

  await userEvent.selectOptions(select, 'option-1');
  expect(select).toHaveValue('option-1');

  await userEvent.selectOptions(select, [
    page.getByRole('option', { name: 'Option 1' }),
    page.getByRole('option', { name: 'Option 2' }),
  ]);
  expect(select).toHaveValue(['option-1', 'option-2']);
});

WARNING

webdriverio プロバイダーは、複数の要素を選択するための API が提供されていないため、複数の要素の選択をサポートしていません。

参照:

  • Playwright locator.selectOption API
  • WebdriverIO element.selectByIndex API
  • testing-library selectOptions API

userEvent.hover ​

ts
function hover(
  element: Element | Locator,
  options?: UserEventHoverOptions
): Promise<void>;

このメソッドは、マウスカーソルを指定要素上に移動させます。このメソッドの詳細は、プロバイダーのドキュメントを参照してください。

WARNING

webdriverio プロバイダーを使用している場合、カーソルはデフォルトで要素の中心に移動します。

playwright プロバイダーを使用している場合、カーソルは要素の「ある」可視点に移動します。

ts
import { page, userEvent } from '@vitest/browser/context';

test('hovers logo element', async () => {
  const logo = page.getByRole('img', { name: /logo/ });

  await userEvent.hover(logo);
  // またはロケーターから直接アクセスすることもできます
  await logo.hover();
});

参照:

  • Playwright locator.hover API
  • WebdriverIO element.moveTo API
  • testing-library hover API

userEvent.unhover ​

ts
function unhover(
  element: Element | Locator,
  options?: UserEventHoverOptions
): Promise<void>;

これは userEvent.hover と同じように機能しますが、カーソルを代わりに document.body 要素に移動します。

WARNING

デフォルトでは、カーソル位置はボディ要素の「ある」可視点(playwright プロバイダーの場合)または中心(webdriverio プロバイダーの場合)にあるため、現在ホバー中の要素が既にその位置にある場合、このメソッドは効果がありません。

ts
import { page, userEvent } from '@vitest/browser/context';

test('unhover logo element', async () => {
  const logo = page.getByRole('img', { name: /logo/ });

  await userEvent.unhover(logo);
  // またはロケーターから直接アクセスすることもできます
  await logo.unhover();
});

参照:

  • Playwright locator.hover API
  • WebdriverIO element.moveTo API
  • testing-library hover API

userEvent.upload ​

ts
function upload(
  element: Element | Locator,
  files: string[] | string | File[] | File
): Promise<void>;

ファイル入力要素に指定されたファイルをセットします。

ts
import { page, userEvent } from '@vitest/browser/context';

test('can upload a file', async () => {
  const input = page.getByRole('button', { name: /Upload files/ });

  const file = new File(['file'], 'file.png', { type: 'image/png' });

  await userEvent.upload(input, file);
  // またはロケーターから直接アクセスすることもできます
  await input.upload(file);

  // テストファイルからの相対パスを使用することもできます
  await userEvent.upload(input, '../fixtures/file.png');
});

WARNING

webdriverio プロバイダーは、このコマンドを chrome および edge ブラウザでのみサポートしています。また、現時点では文字列型のみをサポートしています。

参照:

  • Playwright locator.setInputFiles API
  • WebdriverIO browser.uploadFile API
  • testing-library upload API

userEvent.dragAndDrop ​

ts
function dragAndDrop(
  source: Element | Locator,
  target: Element | Locator,
  options?: UserEventDragAndDropOptions
): Promise<void>;

ソース要素をターゲット要素までドラッグ&ドロップします。source 要素に draggable 属性が true に設定されている必要があることに注意してください。

ts
import { page, userEvent } from '@vitest/browser/context';

test('drag and drop works', async () => {
  const source = page.getByRole('img', { name: /logo/ });
  const target = page.getByTestId('logo-target');

  await userEvent.dragAndDrop(source, target);
  // またはロケーターから直接アクセスすることもできます
  await source.dropTo(target);

  await expect.element(target).toHaveTextContent('Logo is processed');
});

WARNING

この API は、デフォルトの preview プロバイダーでは利用できません。

参照:

  • Playwright frame.dragAndDrop API
  • WebdriverIO element.dragAndDrop API
Pager
前のページContext API
次のページLocators

MITライセンス の下で公開されています。

Copyright (c) 2021-Present Vitest Team

https://v2.vitest.dev/guide/browser/interactivity-api

MITライセンス の下で公開されています。

Copyright (c) 2021-Present Vitest Team