mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2026-04-28 19:50:42 +00:00
860 lines
30 KiB
Text
860 lines
30 KiB
Text
---
|
|
title: Actions Reference
|
|
subtitle: Every page action and agent method
|
|
description: Reference for all page actions (act, extract, validate, prompt, click, fill, select_option) and agent methods (login, run_task, download_files, run_workflow) with parameters and return types.
|
|
slug: developers/browser-automations/actions-reference
|
|
keywords:
|
|
- act
|
|
- extract
|
|
- validate
|
|
- prompt
|
|
- click
|
|
- fill
|
|
- select_option
|
|
- agent.login
|
|
- agent.run_task
|
|
- agent.download_files
|
|
- agent.run_workflow
|
|
- fill_form
|
|
- locator
|
|
- frame_switch
|
|
---
|
|
|
|
Browser automations are built in code using three layers: Page (AI-enhanced Playwright), Agent (multi-step AI goals), and Browser (cloud Chromium instance). This page lists every operation available on a Page or through an Agent. For the full SDK documentation with all parameter options, see the [SDK Reference](/sdk-reference/browser-automation/act).
|
|
|
|
If you're building automations visually instead, see [Block Types and Configuration](/cloud/building-workflows/configure-blocks) for the equivalent operations in the Cloud UI workflow editor.
|
|
|
|
---
|
|
|
|
## Quick reference
|
|
|
|
### Page actions
|
|
|
|
| Action | Purpose | Returns |
|
|
|--------|---------|---------|
|
|
| [`act`](#act) | Perform any action from a natural-language prompt | `None` |
|
|
| [`extract`](#extract) | Pull structured data from the page | `dict`, `list`, `str`, or `None` |
|
|
| [`validate`](#validate) | Assert a condition about the page | `bool` |
|
|
| [`prompt`](#prompt) | Ask the LLM a question about the page | `dict`, `list`, `str`, or `None` |
|
|
| [`click`](#click) | Click an element (selector, AI, or both) | `str \| None` |
|
|
| [`fill`](#fill) | Fill an input field (selector, AI, or both) | `str` |
|
|
| [`select_option`](#select_option) | Select a dropdown option (selector, AI, or both) | `str \| None` |
|
|
| [`type`](#type) | Type text character-by-character (Python only) | `str` |
|
|
| [`hover`](#hover) | Move mouse over an element (Python only) | `str` |
|
|
| [`scroll`](#scroll) | Scroll the page by pixel offset (Python only) | `None` |
|
|
| [`upload_file`](#upload_file) | Upload files to a file input (Python only) | `str` |
|
|
| [`locator`](#locator) | Locate an element with AI, returns a chainable Locator (Python only) | `Locator` |
|
|
|
|
### Agent methods
|
|
|
|
| Method | Purpose | Returns |
|
|
|--------|---------|---------|
|
|
| [`agent.login`](#agentlogin) | Authenticate with stored credentials | [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse) |
|
|
| [`agent.run_task`](#agentrun_task) | Run a multi-step AI task on the current page | [`TaskRunResponse`](/sdk-reference/tasks/run-task#returns-taskrunresponse) |
|
|
| [`agent.download_files`](#agentdownload_files) | Navigate and download files | [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse) |
|
|
| [`agent.run_workflow`](#agentrun_workflow) | Run a Cloud UI workflow on the current page | [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse) |
|
|
|
|
### Form automation (Python only)
|
|
|
|
| Method | Purpose | Returns |
|
|
|--------|---------|---------|
|
|
| [`fill_form`](#fill_form) | AI-powered single-page form fill | `None` |
|
|
| [`fill_multipage_form`](#fill_multipage_form) | Form fill across multiple pages | `int` (pages filled) |
|
|
| [`fill_from_mapping`](#fill_from_mapping) | Fill fields by index-to-value mapping | `None` |
|
|
| [`extract_form_fields`](#extract_form_fields) | Extract all form field metadata | `list[dict]` |
|
|
| [`validate_mapping`](#validate_mapping) | Check if a field mapping is valid | `bool` |
|
|
| [`fill_autocomplete`](#fill_autocomplete) | Fill input with typeahead handling | `str` |
|
|
|
|
### iframe management (Python only)
|
|
|
|
| Method | Purpose | Returns |
|
|
|--------|---------|---------|
|
|
| [`frame_switch`](#frame_switch) | Switch context to an iframe | `dict` |
|
|
| [`frame_main`](#frame_main) | Switch back to the main frame | `dict` |
|
|
| [`frame_list`](#frame_list) | List all frames on the page | `list[dict]` |
|
|
|
|
---
|
|
|
|
## Page actions
|
|
|
|
### act
|
|
|
|
Perform any action described in natural language.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
await page.act("Click the login button")
|
|
await page.act("Scroll down to the pricing section")
|
|
```
|
|
|
|
```typescript
|
|
await page.act("Click the login button")
|
|
await page.act("Scroll down to the pricing section")
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `prompt` | `str` | Yes | What action to perform |
|
|
| `skip_refresh` | `bool` | No | Skip page refresh before acting |
|
|
| `use_economy_tree` | `bool` | No | Use a smaller DOM tree for faster processing |
|
|
|
|
**Returns:** `None`
|
|
|
|
**SDK reference:** [act](/sdk-reference/browser-automation/act)
|
|
|
|
---
|
|
|
|
### extract
|
|
|
|
Pull structured data from the visible page.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
data = await page.extract(
|
|
"Extract all product names and prices",
|
|
schema={
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {"type": "string"},
|
|
"price": {"type": "number"},
|
|
},
|
|
},
|
|
},
|
|
)
|
|
```
|
|
|
|
```typescript
|
|
const data = await page.extract({
|
|
prompt: "Extract all product names and prices",
|
|
schema: {
|
|
type: "array",
|
|
items: {
|
|
type: "object",
|
|
properties: {
|
|
name: { type: "string" },
|
|
price: { type: "number" },
|
|
},
|
|
},
|
|
},
|
|
})
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `prompt` | `str` | Yes | What to extract |
|
|
| `schema` | `dict \| list \| str` | No | JSON Schema for typed output |
|
|
| `error_code_mapping` | `dict` | No | Map custom error codes |
|
|
|
|
**Returns:** `dict`, `list`, `str`, or `None`
|
|
|
|
**SDK reference:** [extract](/sdk-reference/browser-automation/extract)
|
|
|
|
---
|
|
|
|
### validate
|
|
|
|
Assert a condition about the current page state.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
is_logged_in = await page.validate("The user is logged in")
|
|
```
|
|
|
|
```typescript
|
|
const isLoggedIn = await page.validate("The user is logged in")
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `prompt` | `str` | Yes | Condition to check |
|
|
| `model` | `dict` | No | Override LLM model config |
|
|
|
|
**Returns:** `bool`
|
|
|
|
**SDK reference:** [validate](/sdk-reference/browser-automation/validate)
|
|
|
|
---
|
|
|
|
### prompt
|
|
|
|
Ask the LLM a question about the current page.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
result = await page.prompt(
|
|
"How many items are in the navigation menu?",
|
|
schema={"count": {"type": "integer"}}
|
|
)
|
|
```
|
|
|
|
```typescript
|
|
const result = await page.prompt(
|
|
"How many items are in the navigation menu?",
|
|
{ schema: { count: { type: "integer" } } }
|
|
)
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `prompt` | `str` | Yes | Question to ask |
|
|
| `schema` | `dict` | No | JSON Schema for structured response |
|
|
| `model` | `dict` | No | Override LLM model config |
|
|
|
|
**Returns:** `dict`, `list`, `str`, or `None`. Without a `schema`, returns a `dict` of the form `{"llm_response": "..."}` (TypeScript: `{ llmResponse: "..." }`). With a `schema`, returns data shaped to your schema.
|
|
|
|
**SDK reference:** [prompt](/sdk-reference/browser-automation/prompt)
|
|
|
|
---
|
|
|
|
### click
|
|
|
|
Click an element using a selector, AI prompt, or both.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
await page.click("#submit-button") # selector
|
|
await page.click(prompt="Click the 'Submit' button") # AI
|
|
await page.click("#submit-button", prompt="Click the 'Submit' button") # both
|
|
```
|
|
|
|
```typescript
|
|
await page.click("#submit-button") // selector
|
|
await page.click({ prompt: "Click the 'Submit' button" }) // AI
|
|
await page.click("#submit-button", { prompt: "Click the 'Submit' button" }) // both
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS selector |
|
|
| `prompt` | `str` | No | AI prompt (fallback or primary) |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) or `None` |
|
|
|
|
**Returns:** `str \| None` (resolved selector)
|
|
|
|
**SDK reference:** [click](/sdk-reference/browser-automation/click)
|
|
|
|
---
|
|
|
|
### fill
|
|
|
|
Fill an input field using a selector, AI prompt, or both.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
await page.fill("#email", value="user@example.com") # selector
|
|
await page.fill(prompt="Fill 'user@example.com' in the email field") # AI
|
|
await page.fill("#email", value="user@example.com", prompt="Fill email") # both
|
|
```
|
|
|
|
```typescript
|
|
await page.fill("#email", "user@example.com") // selector
|
|
await page.fill({ prompt: "Fill 'user@example.com' in the email field" }) // AI
|
|
await page.fill("#email", "user@example.com", { prompt: "Fill email" }) // both
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS selector |
|
|
| `value` | `str` | No | Value to fill |
|
|
| `prompt` | `str` | No | AI prompt (fallback or primary) |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) or `None` |
|
|
| `totp_identifier` | `str` | No | TOTP identifier for 2FA fields |
|
|
| `totp_url` | `str` | No | TOTP URL |
|
|
|
|
**Returns:** `str` (resolved selector)
|
|
|
|
**SDK reference:** [fill](/sdk-reference/browser-automation/fill)
|
|
|
|
---
|
|
|
|
### select_option
|
|
|
|
Select a dropdown option using a selector, AI prompt, or both.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
await page.select_option("#country", value="us") # selector
|
|
await page.select_option(prompt="Select 'United States' from the country dropdown") # AI
|
|
await page.select_option("#country", value="us", prompt="Select United States") # both
|
|
```
|
|
|
|
```typescript
|
|
await page.selectOption("#country", { value: "us" }) // selector
|
|
await page.selectOption({ prompt: "Select 'United States' from the country dropdown" }) // AI
|
|
await page.selectOption("#country", { value: "us", prompt: "Select United States" }) // both
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS selector |
|
|
| `value` | `str \| list[str]` | No | Option value(s) to select |
|
|
| `prompt` | `str` | No | AI prompt (fallback or primary) |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) or `None` |
|
|
|
|
**Returns:** `str | None` (resolved selector)
|
|
|
|
**SDK reference:** [select_option](/sdk-reference/browser-automation/select-option)
|
|
|
|
---
|
|
|
|
### type
|
|
|
|
Type text character-by-character. Unlike `fill`, this triggers keystroke events for each character, so use it for fields that react to individual key presses (search autocomplete, OTP inputs). Python only.
|
|
|
|
```python
|
|
# Character-by-character input via selector
|
|
await page.type("#search", value="wireless headphones")
|
|
|
|
# AI-powered type
|
|
await page.type(prompt="Type 'hello' into the search box")
|
|
|
|
# Selector with AI fallback
|
|
await page.type("#search", value="query text", prompt="Type into the search field")
|
|
|
|
# TOTP input from a stored secret
|
|
await page.type("#otp", totp_identifier="my-app")
|
|
|
|
# TOTP generated on the fly from an otpauth URI
|
|
await page.type("#otp", totp_url="otpauth://totp/Example:alice?secret=JBSWY3DPEHPK3PXP")
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS or XPath selector for the input field |
|
|
| `value` | `str` | No | Text to type character-by-character |
|
|
| `prompt` | `str` | No | Natural-language description of the target field |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) tries the selector first, then AI |
|
|
| `totp_identifier` | `str` | No | Identifier for a stored TOTP secret |
|
|
| `totp_url` | `str` | No | `otpauth://` URI to generate a one-time password on the fly |
|
|
|
|
**Returns:** `str` (resolved selector)
|
|
|
|
**SDK reference:** [type](/sdk-reference/browser-automation/type)
|
|
|
|
---
|
|
|
|
### hover
|
|
|
|
Move the mouse over an element. Python only.
|
|
|
|
```python
|
|
# Simple hover
|
|
await page.hover("#menu-item")
|
|
|
|
# Hover with a hold duration (useful for tooltip reveals)
|
|
await page.hover("#tooltip-trigger", hold_seconds=1.5)
|
|
|
|
# Hover with intention logging for debugging
|
|
await page.hover("#menu-item", intention="Reveal the main menu dropdown")
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | Yes | CSS or XPath selector for the target element |
|
|
| `timeout` | `float` | No | Max wait time in milliseconds for the element. Defaults to `BROWSER_ACTION_TIMEOUT_MS` |
|
|
| `hold_seconds` | `float` | No | How long to hold the hover, in seconds. Default `0.0` |
|
|
| `intention` | `str` | No | Description of the hover intent, used for logging |
|
|
|
|
**Returns:** `str` (resolved selector)
|
|
|
|
**SDK reference:** [hover](/sdk-reference/browser-automation/hover)
|
|
|
|
---
|
|
|
|
### scroll
|
|
|
|
Scroll the page by a pixel offset along the x and y axes. Python only.
|
|
|
|
```python
|
|
await page.scroll(0, 500) # Scroll down 500px
|
|
await page.scroll(0, -300) # Scroll up 300px
|
|
await page.scroll(200, 0) # Scroll right 200px
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `scroll_x` | `int` | Yes | Horizontal scroll offset in pixels. Positive values scroll right |
|
|
| `scroll_y` | `int` | Yes | Vertical scroll offset in pixels. Positive values scroll down |
|
|
|
|
**Returns:** `None`
|
|
|
|
**SDK reference:** [scroll](/sdk-reference/browser-automation/scroll)
|
|
|
|
---
|
|
|
|
### upload_file
|
|
|
|
Upload one or more files to a file input. Pass a selector for direct Playwright behavior, a prompt for AI-powered file input detection, or both. Python only.
|
|
|
|
```python
|
|
# Direct selector
|
|
await page.upload_file("#file-input", files="/path/to/file.pdf")
|
|
|
|
# Multiple files
|
|
await page.upload_file("#file-input", files=["/path/to/file1.pdf", "/path/to/file2.pdf"])
|
|
|
|
# AI-powered file input detection (no selector needed)
|
|
await page.upload_file(prompt="Upload the resume to the file input")
|
|
|
|
# Selector with AI fallback: try the selector first, use AI if it fails
|
|
await page.upload_file(
|
|
"#file-input",
|
|
files="/path/to/file.pdf",
|
|
prompt="Upload the resume to the file input",
|
|
)
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS or XPath selector for the file input |
|
|
| `files` | `str \| list[str]` | No | File path or list of file paths to upload |
|
|
| `prompt` | `str` | No | Natural-language description of the file input to target |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) tries the selector first, then AI |
|
|
|
|
**Returns:** `str` (resolved selector)
|
|
|
|
**SDK reference:** [upload_file](/sdk-reference/browser-automation/upload-file)
|
|
|
|
---
|
|
|
|
### locator
|
|
|
|
Locate an element using a CSS/XPath selector, an AI prompt, or both. When called with a `prompt`, returns an `AILocator`, a lazy Playwright `Locator` that resolves the element via AI on first use. Python only.
|
|
|
|
```python
|
|
# AI-powered: pass a natural-language prompt
|
|
locator = page.locator(prompt="the submit button")
|
|
await locator.click()
|
|
|
|
# Full Playwright chaining works
|
|
text = await page.locator(prompt="the error message").text_content()
|
|
|
|
# Standard Playwright selector (no AI, identical to vanilla Playwright)
|
|
locator = page.locator("#submit-btn")
|
|
await locator.click()
|
|
|
|
# Selector with AI fallback: try the selector first, use AI if it fails
|
|
locator = page.locator("#submit-btn", prompt="the submit button")
|
|
await locator.click()
|
|
```
|
|
|
|
<Note>
|
|
When called with only a `selector` (no `prompt`), `page.locator(selector)` behaves exactly like the standard Playwright `page.locator(selector)`. No AI is involved.
|
|
</Note>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS or XPath selector passed to Playwright's built-in `locator()` |
|
|
| `prompt` | `str` | No | Natural-language description of the element. When provided, returns an `AILocator` that resolves via AI |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) tries the selector first, then AI |
|
|
| `**kwargs` | | No | Additional keyword arguments forwarded to Playwright's `locator()` |
|
|
|
|
**Returns:** `Locator` (standard Playwright `Locator` when only a selector is given, or `AILocator` when a prompt is provided)
|
|
|
|
#### AILocator methods
|
|
|
|
When `prompt` is provided, the returned `AILocator` supports all standard Playwright `Locator` methods:
|
|
|
|
- **Actions:** `click()`, `fill()`, `type()`, `select_option()`, `check()`, `uncheck()`, `clear()`, `hover()`, `focus()`, `press()`
|
|
- **Queries:** `text_content()`, `inner_text()`, `inner_html()`, `get_attribute()`, `input_value()`, `count()`
|
|
- **State:** `is_visible()`, `is_hidden()`, `is_enabled()`, `is_disabled()`, `is_editable()`, `is_checked()`
|
|
- **Chaining:** `first()`, `last()`, `nth()`, `filter()`, `locator()`, `get_by_text()`, `get_by_role()`, `get_by_label()`, `get_by_placeholder()`
|
|
- **Utilities:** `wait_for()`, `screenshot()`, `playwright_locator` (access raw `Locator`)
|
|
|
|
**SDK reference:** [locator](/sdk-reference/browser-automation/locator)
|
|
|
|
---
|
|
|
|
## Agent methods
|
|
|
|
All agent methods return either a [`TaskRunResponse`](/sdk-reference/tasks/run-task#returns-taskrunresponse) (for `agent.run_task`) or a [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse) (for `agent.login`, `agent.download_files`, `agent.run_workflow`). Follow the links for the full field list.
|
|
|
|
### agent.login
|
|
|
|
Authenticate with stored credentials. Handles multi-page login flows, CAPTCHAs, and 2FA.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
await page.agent.login(
|
|
credential_type="skyvern",
|
|
credential_id="cred_123"
|
|
)
|
|
```
|
|
|
|
```typescript
|
|
await page.agent.login("skyvern", {
|
|
credentialId: "cred_123"
|
|
})
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `credential_type` | `CredentialType` | Yes | `skyvern`, `bitwarden`, `onepassword`, or `azure_vault` |
|
|
| `credential_id` | `str` | No | Credential ID (required for `skyvern` type) |
|
|
| `url` | `str` | No | Login page URL |
|
|
| `prompt` | `str` | No | Additional login instructions |
|
|
| `timeout` | `float` | No | Max wait time in seconds (default: 1800) |
|
|
|
|
**Returns:** [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse)
|
|
|
|
**SDK reference:** [agent.login](/sdk-reference/browser-automation/agent-login)
|
|
|
|
---
|
|
|
|
### agent.run_task
|
|
|
|
Run a multi-step AI task on the current page.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
result = await page.agent.run_task(
|
|
"Go to the billing page and download the latest invoice",
|
|
data_extraction_schema={
|
|
"type": "object",
|
|
"properties": {
|
|
"invoice_number": {"type": "string"},
|
|
"amount": {"type": "string"},
|
|
},
|
|
},
|
|
)
|
|
print(result.output)
|
|
```
|
|
|
|
```typescript
|
|
const result = await page.agent.runTask(
|
|
"Go to the billing page and download the latest invoice",
|
|
{
|
|
dataExtractionSchema: {
|
|
type: "object",
|
|
properties: {
|
|
invoice_number: { type: "string" },
|
|
amount: { type: "string" },
|
|
},
|
|
},
|
|
},
|
|
)
|
|
console.log(result.output)
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `prompt` | `str` | Yes | Multi-step goal description |
|
|
| `data_extraction_schema` | `dict \| str` | No | JSON Schema for structured output. See [Extract Structured Data](/developers/browser-automations/extract-structured-data). |
|
|
| `max_steps` | `int` | No | Cap AI steps. The run terminates with `timed_out` if hit. Controls cost; each step is one AI decision + action cycle. |
|
|
| `engine` | `RunEngine` | No | AI engine. Defaults to `skyvern-1.0` in the SDK for backward compatibility. Pass `skyvern-2.0` for the latest model (also the Cloud UI default). Other options: `openai-cua`, `anthropic-cua`, `ui-tars`. |
|
|
| `model` | `dict` / `Record<string, unknown>` | No | Override LLM model configuration |
|
|
| `url` | `str` / `string` | No | URL to navigate to (defaults to current page URL) |
|
|
| `webhook_url` | `str` / `string` | No | Callback URL. Skyvern POSTs the full run result on completion or failure. See [Webhooks](/developers/going-to-production/webhooks). |
|
|
| `totp_identifier` | `str` / `string` | No | Identifier for push-based TOTP. See [Handle 2FA](/developers/credentials/handle-2fa). |
|
|
| `totp_url` | `str` / `string` | No | Endpoint Skyvern calls to pull TOTP codes. See [Handle 2FA](/developers/credentials/handle-2fa). |
|
|
| `title` | `str` / `string` | No | Display name for this run |
|
|
| `error_code_mapping` | `dict` / `Record<string, string>` | No | Map custom error codes to conditions. Keys are your error codes, values describe when to trigger them. If matched, `output` contains `{"error": "your_code"}`. |
|
|
| `user_agent` | `str` / `string` | No | Custom User-Agent header for the browser |
|
|
| `timeout` | `float` | No | Max wait in seconds (default: 1800) |
|
|
|
|
**Returns:** [`TaskRunResponse`](/sdk-reference/tasks/run-task#returns-taskrunresponse)
|
|
|
|
**SDK reference:** [agent.run_task](/sdk-reference/browser-automation/agent-run-task)
|
|
|
|
---
|
|
|
|
### agent.download_files
|
|
|
|
Navigate and download files from the current page.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
result = await page.agent.download_files(
|
|
"Download the latest invoice PDF",
|
|
download_suffix=".pdf",
|
|
download_timeout=30,
|
|
)
|
|
```
|
|
|
|
```typescript
|
|
const result = await page.agent.downloadFiles(
|
|
"Download the latest invoice PDF",
|
|
{
|
|
downloadSuffix: ".pdf",
|
|
downloadTimeout: 30,
|
|
},
|
|
)
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `prompt` | `str` | Yes | What to download |
|
|
| `download_suffix` | `str` | No | Filename hint prepended to the saved file (e.g., `"invoice"` → `invoice.pdf`). Not a validator; mismatched extensions don't fail the run. |
|
|
| `download_timeout` | `float` | No | Soft hint (seconds) for how long to wait for a download. The overall `timeout` is what actually fails the run. |
|
|
| `max_steps_per_run` | `int` | No | Cap AI steps |
|
|
| `timeout` | `float` | No | Max wait in seconds (default: 1800) |
|
|
|
|
**Returns:** [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse)
|
|
|
|
**SDK reference:** [agent.download_files](/sdk-reference/browser-automation/agent-download-files)
|
|
|
|
---
|
|
|
|
### agent.run_workflow
|
|
|
|
Run a Cloud UI workflow on the current page.
|
|
|
|
<CodeGroup>
|
|
```python
|
|
result = await page.agent.run_workflow(
|
|
"wpid_monthly_report",
|
|
parameters={"month": "2025-03"}
|
|
)
|
|
```
|
|
|
|
```typescript
|
|
const result = await page.agent.runWorkflow(
|
|
"wpid_monthly_report",
|
|
{ parameters: { month: "2025-03" } }
|
|
)
|
|
```
|
|
</CodeGroup>
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `workflow_id` | `str` | Yes | Workflow permanent ID |
|
|
| `parameters` | `dict` | No | Workflow input parameters |
|
|
| `template` | `bool` | No | Run a template workflow |
|
|
| `title` | `str` / `string` | No | Display name for this run |
|
|
| `webhook_url` | `str` / `string` | No | Callback URL for run completion. See [Webhooks](/developers/going-to-production/webhooks). |
|
|
| `totp_url` | `str` / `string` | No | Endpoint for pulling TOTP codes |
|
|
| `totp_identifier` | `str` / `string` | No | Identifier for push-based TOTP |
|
|
| `timeout` | `float` | No | Max wait in seconds (default: 1800) |
|
|
|
|
**Returns:** [`WorkflowRunResponse`](/sdk-reference/workflows/run-workflow#returns-workflowrunresponse)
|
|
|
|
**SDK reference:** [agent.run_workflow](/sdk-reference/browser-automation/agent-run-workflow)
|
|
|
|
---
|
|
|
|
## Form automation (Python only)
|
|
|
|
### fill_form
|
|
|
|
Fill a single-page form using AI. Pass a `data` dict describing the values to fill.
|
|
|
|
```python
|
|
# Simple form fill
|
|
await page.fill_form(
|
|
data={"name": "John Doe", "email": "john@example.com", "role": "Engineer"},
|
|
)
|
|
|
|
# With a custom prompt to guide the AI
|
|
await page.fill_form(
|
|
data={"name": "John Doe", "email": "john@example.com"},
|
|
prompt="Fill out the registration form with the provided user details",
|
|
)
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `data` | `dict[str, Any]` | Yes | Key-value pairs of form data to fill |
|
|
| `prompt` | `str` | No | Instruction for the AI. Defaults to `"Fill out the form"` |
|
|
|
|
**Returns:** `None`
|
|
|
|
**SDK reference:** [fill_form](/sdk-reference/browser-automation/fill-form)
|
|
|
|
---
|
|
|
|
### fill_multipage_form
|
|
|
|
Fill a form that spans multiple pages, handling page transitions automatically.
|
|
|
|
```python
|
|
pages_filled = await page.fill_multipage_form(
|
|
data={"name": "John Doe", "email": "john@example.com", "address": "123 Main St"},
|
|
max_pages=5,
|
|
)
|
|
print(f"Filled {pages_filled} pages")
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `data` | `dict[str, Any]` | Yes | Key-value pairs of form data to fill across all pages |
|
|
| `prompt` | `str` | No | Instruction for the AI. Defaults to `"Fill out the form"` |
|
|
| `next_button` | `str` | No | Selector or description of the button to advance to the next page |
|
|
| `max_pages` | `int` | No | Maximum number of pages to fill. Defaults to `10` |
|
|
| `timeout_seconds` | `float` | No | Timeout in seconds for the entire operation. Defaults to `300` |
|
|
|
|
**Returns:** `int` (the number of pages filled)
|
|
|
|
**SDK reference:** [fill_multipage_form](/sdk-reference/browser-automation/fill-multipage-form)
|
|
|
|
---
|
|
|
|
### fill_from_mapping
|
|
|
|
Fill form fields using an explicit index-based mapping produced by `extract_form_fields`. Use this when you need precise control over which field gets which value.
|
|
|
|
```python
|
|
fields = await page.extract_form_fields()
|
|
await page.fill_from_mapping(
|
|
form_fields=fields,
|
|
mapping={0: "John", 1: "Doe", 2: "john@example.com"}, # keys are field indices
|
|
data={"name": "John Doe"}, # optional context
|
|
)
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `form_fields` | `list[dict[str, Any]]` | Yes | Field metadata returned by `extract_form_fields` |
|
|
| `mapping` | `dict[int, str \| list \| bool \| None]` | Yes | Map of field index to the value to fill |
|
|
| `data` | `dict[str, Any] \| None` | No | Optional source data for context. Defaults to `None` |
|
|
|
|
**Returns:** `None`
|
|
|
|
**SDK reference:** [fill_from_mapping](/sdk-reference/browser-automation/fill-from-mapping)
|
|
|
|
---
|
|
|
|
### extract_form_fields
|
|
|
|
Extract all form fields with metadata from the current page. Use the output to drive `fill_from_mapping` or `validate_mapping`.
|
|
|
|
```python
|
|
fields = await page.extract_form_fields()
|
|
# Returns a list of dicts with field name, type, options, and other metadata:
|
|
# [{"name": "First Name", "type": "text", "index": 0, ...}, ...]
|
|
```
|
|
|
|
**Returns:** `list[dict[str, Any]]` where each dict contains field name, type, options, and other metadata.
|
|
|
|
**SDK reference:** [extract_form_fields](/sdk-reference/browser-automation/extract-form-fields)
|
|
|
|
---
|
|
|
|
### validate_mapping
|
|
|
|
Check if a field mapping is correct for the current form.
|
|
|
|
```python
|
|
fields = await page.extract_form_fields()
|
|
is_valid = await page.validate_mapping(
|
|
form_fields=fields,
|
|
mapping={0: "John", 1: "Doe"},
|
|
prompt="Validate the name fields are filled correctly",
|
|
)
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `form_fields` | `list[dict[str, Any]]` | Yes | Field metadata returned by `extract_form_fields` |
|
|
| `mapping` | `dict[int, str \| list \| bool \| None]` | Yes | Map of field index to the value to validate |
|
|
| `prompt` | `str` | Yes | Instruction describing what to validate |
|
|
|
|
**Returns:** `bool` (`True` if the mapping is valid, `False` otherwise)
|
|
|
|
**SDK reference:** [validate_mapping](/sdk-reference/browser-automation/validate-mapping)
|
|
|
|
---
|
|
|
|
### fill_autocomplete
|
|
|
|
Fill an input that has autocomplete/typeahead behavior. Types the value, waits for suggestions, then clicks the matching option.
|
|
|
|
```python
|
|
# Direct selector
|
|
await page.fill_autocomplete(
|
|
selector="#city",
|
|
value="San Francisco",
|
|
option_selector=".autocomplete-option",
|
|
wait_seconds=1.5,
|
|
)
|
|
|
|
# AI-powered
|
|
await page.fill_autocomplete(prompt="Fill 'San Francisco' in the city autocomplete")
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS selector for the input field |
|
|
| `value` | `str` | No | The text value to type into the field |
|
|
| `prompt` | `str` | No | Natural-language description of the field and value |
|
|
| `ai` | `str` | No | AI mode: `"fallback"` (default) tries the selector first, then AI |
|
|
| `option_selector` | `str` | No | CSS selector for the autocomplete dropdown options |
|
|
| `wait_seconds` | `float` | No | Seconds to wait for the dropdown to appear. Default `1.5` |
|
|
| `**kwargs` | | No | Standard Playwright fill options (e.g., `timeout`, `force`) |
|
|
|
|
**Returns:** `str` (resolved selector)
|
|
|
|
**SDK reference:** [fill_autocomplete](/sdk-reference/browser-automation/fill-autocomplete)
|
|
|
|
---
|
|
|
|
## iframe management (Python only)
|
|
|
|
### frame_switch
|
|
|
|
Switch the working context to an iframe. Exactly one of `selector`, `name`, or `index` must be provided.
|
|
|
|
```python
|
|
# By CSS selector
|
|
await page.frame_switch(selector="#payment-iframe")
|
|
|
|
# By frame name
|
|
await page.frame_switch(name="checkout")
|
|
|
|
# By zero-based index
|
|
await page.frame_switch(index=0)
|
|
```
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|-----------|------|----------|-------------|
|
|
| `selector` | `str` | No | CSS selector for the iframe element |
|
|
| `name` | `str` | No | The `name` attribute of the iframe |
|
|
| `index` | `int` | No | Zero-based index of the iframe on the page |
|
|
|
|
<Note>
|
|
Exactly one of `selector`, `name`, or `index` must be provided.
|
|
</Note>
|
|
|
|
**Returns:** `dict[str, Any]` (frame metadata for the switched-to iframe)
|
|
|
|
**SDK reference:** [frame_switch](/sdk-reference/browser-automation/frame-switch)
|
|
|
|
---
|
|
|
|
### frame_main
|
|
|
|
Switch back to the main page frame after working inside an iframe.
|
|
|
|
```python
|
|
page.frame_main()
|
|
```
|
|
|
|
**Returns:** `dict[str, str]`
|
|
|
|
**SDK reference:** [frame_main](/sdk-reference/browser-automation/frame-main)
|
|
|
|
---
|
|
|
|
### frame_list
|
|
|
|
List all frames on the current page with metadata.
|
|
|
|
```python
|
|
frames = await page.frame_list()
|
|
# [{"name": "checkout", "url": "...", "index": 0}, ...]
|
|
```
|
|
|
|
**Returns:** `list[dict[str, Any]]` (metadata for each frame on the page)
|
|
|
|
**SDK reference:** [frame_list](/sdk-reference/browser-automation/frame-list)
|