vitest/docs/guide/browser/context.md

194 lines
6.2 KiB
Markdown

---
title: Context API | Browser Mode
---
# Context API
Vitest exposes a context module via `vitest/browser` entry point. As of 2.0, it exposes a small set of utilities that might be useful to you in tests.
## `userEvent`
::: tip
The `userEvent` API is explained in detail at [Interactivity API](/guide/browser/interactivity-api).
:::
```ts
/**
* Handler for user interactions. The support is implemented by the browser provider (`playwright` or `webdriverio`).
* If used with `preview` provider, fallbacks to simulated events via `@testing-library/user-event`.
* @experimental
*/
export const userEvent: {
setup: () => UserEvent
cleanup: () => Promise<void>
click: (element: Element, options?: UserEventClickOptions) => Promise<void>
dblClick: (element: Element, options?: UserEventDoubleClickOptions) => Promise<void>
tripleClick: (element: Element, options?: UserEventTripleClickOptions) => Promise<void>
selectOptions: (
element: Element,
values: HTMLElement | HTMLElement[] | string | string[],
options?: UserEventSelectOptions,
) => Promise<void>
keyboard: (text: string) => Promise<void>
type: (element: Element, text: string, options?: UserEventTypeOptions) => Promise<void>
clear: (element: Element) => Promise<void>
tab: (options?: UserEventTabOptions) => Promise<void>
hover: (element: Element, options?: UserEventHoverOptions) => Promise<void>
unhover: (element: Element, options?: UserEventHoverOptions) => Promise<void>
fill: (element: Element, text: string, options?: UserEventFillOptions) => Promise<void>
dragAndDrop: (source: Element, target: Element, options?: UserEventDragAndDropOptions) => Promise<void>
}
```
## `commands`
::: tip
This API is explained in detail at [Commands API](/guide/browser/commands).
:::
```ts
/**
* Available commands for the browser.
* A shortcut to `server.commands`.
*/
export const commands: BrowserCommands
```
## `page`
The `page` export provides utilities to interact with the current `page`.
::: warning
While it exposes some utilities from Playwright's `page`, it is not the same object. Since the browser context is evaluated in the browser, your tests don't have access to Playwright's `page` because it runs on the server.
Use [Commands API](/guide/browser/commands) if you need to have access to Playwright's `page` object.
:::
```ts
export const page: {
/**
* Change the size of iframe's viewport.
*/
viewport(width: number, height: number): Promise<void>
/**
* Make a screenshot of the test iframe or a specific element.
* @returns Path to the screenshot file or path and base64.
*/
screenshot(options: Omit<ScreenshotOptions, 'base64'> & { base64: true }): Promise<{
path: string
base64: string
}>
screenshot(options?: ScreenshotOptions): Promise<string>
/**
* Extend default `page` object with custom methods.
*/
extend(methods: Partial<BrowserPage>): BrowserPage
/**
* Wrap an HTML element in a `Locator`. When querying for elements, the search will always return this element.
*/
elementLocator(element: Element): Locator
/**
* The iframe locator. This is a document locator that enters the iframe body
* and works similarly to the `page` object.
* **Warning:** At the moment, this is supported only by the `playwright` provider.
*/
frameLocator(iframeElement: Locator): FrameLocator
/**
* Locator APIs. See its documentation for more details.
*/
getByRole(role: ARIARole | string, options?: LocatorByRoleOptions): Locator
getByLabelText(text: string | RegExp, options?: LocatorOptions): Locator
getByTestId(text: string | RegExp): Locator
getByAltText(text: string | RegExp, options?: LocatorOptions): Locator
getByPlaceholder(text: string | RegExp, options?: LocatorOptions): Locator
getByText(text: string | RegExp, options?: LocatorOptions): Locator
getByTitle(text: string | RegExp, options?: LocatorOptions): Locator
}
```
::: tip
The `getBy*` API is explained at [Locators API](/guide/browser/locators).
:::
::: warning WARNING <Version>3.2.0</Version>
Note that `screenshot` will always return a base64 string if `save` is set to `false`.
The `path` is also ignored in that case.
:::
### frameLocator
```ts
function frameLocator(iframeElement: Locator): FrameLocator
```
The `frameLocator` method returns a `FrameLocator` instance that can be used to find elements inside the iframe.
The frame locator is similar to `page`. It does not refer to the Iframe HTML element, but to the iframe's document.
```ts
const frame = page.frameLocator(
page.getByTestId('iframe')
)
await frame.getByText('Hello World').click() // ✅
await frame.click() // ❌ Not available
```
::: danger IMPORTANT
At the moment, the `frameLocator` method is only supported by the `playwright` provider.
The interactive methods (like `click` or `fill`) are always available on elements within the iframe, but assertions with `expect.element` require the iframe to have the [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).
:::
## `cdp`
```ts
function cdp(): CDPSession
```
The `cdp` export returns the current Chrome DevTools Protocol session. It is mostly useful to library authors to build tools on top of it.
::: warning
CDP session works only with `playwright` provider and only when using `chromium` browser. You can read more about it in playwright's [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession) documentation.
:::
```ts
export const cdp: () => CDPSession
```
## `server`
The `server` export represents the Node.js environment where the Vitest server is running. It is mostly useful for debugging or limiting your tests based on the environment.
```ts
export const server: {
/**
* Platform the Vitest server is running on.
* The same as calling `process.platform` on the server.
*/
platform: Platform
/**
* Runtime version of the Vitest server.
* The same as calling `process.version` on the server.
*/
version: string
/**
* Name of the browser provider.
*/
provider: string
/**
* Name of the current browser.
*/
browser: string
/**
* Available commands for the browser.
*/
commands: BrowserCommands
/**
* Serialized test config.
*/
config: SerializedConfig
}
```