Execute actions in the browser
Interact with the browser by executing a sequence of specific actions.
200+ apps to connect·Tested & maintained tasks·Human support in English & Spanish
In detail
What it does and what it's for
How it works
How it fits in an automated task
A Botize task pairs a trigger with one or more actions. This piece is one of them.
Pick a trigger
The event that starts the task, from this app or any other.
This action runs
Botize performs it automatically using the data the trigger delivers.
Turn it on and forget it
The task runs on its own from then on. If something's off, tweak it or we'll help you.
Already using Botize?
Connect your Google Chrome
Add a profile to use it in your tasks. There's a step-by-step guide if you need it.
Add a new profile Step-by-step guideYour profiles
Your connected Google Chrome accounts
These are the accounts you already have linked to Botize, ready to use in your tasks. You can reconnect or remove any of them.
Setup
Customization options
Fields you can adjust when using it in your automation.
Control Google Chrome from Botize by sending a recipe: a JSON list of steps that the extension will play in order on the connected tab.
This page documents the full recipe format: how to build one, every action available, and how elements are matched on the page.
Recipe format
A recipe is a JSON object with a single steps array:
{
"steps": [
{ "action": "navigate", "url": "https://example.com" },
{ "action": "click", "role": "button", "name": "Accept" }
]
}
Steps run sequentially. If any step fails, the recipe stops and reports the error back to Botize.
observe — get the resulting page state back automatically
An optional top-level observe key (sibling of steps) makes the recipe return a compact snapshot of what's actionable now once every step has run and the page has settled — so a recipe that only acts (e.g. a lone click) comes back self-describing instead of blind, with no separate get_aria_tree step or follow-up call. Especially handy for recipes driven by an AI assistant.
{
"observe": "interactive",
"steps": [
{ "action": "click", "role": "button", "name": "Menu" }
]
}
| Value | Meaning |
|---|---|
"interactive" | Snapshot of interactive elements only (buttons, links, inputs…), each with role + name + backendDOMNodeId. Hard-capped, so it stays small. |
"all" | Same but keeps the full filtered tree, not just interactive roles. |
omitted / "off" | No snapshot — unchanged behaviour. |
The snapshot is returned in the same Data from Browser output as get_aria_tree. If the recipe already contains an explicit get_aria_tree step, that wins and observe is ignored. It's best-effort: if the snapshot can't be captured it's silently skipped and never fails the job.
Recording a recipe
The fastest way to build a recipe is to record it:
- Open the Botize extension popup on the tab you want to automate.
- Click ● REC and perform the actions (click, type, navigate…).
- Click â– STOP to finish.
- Click ↓ Export to download the recipe as JSON.
You can then tweak the JSON manually or import it again with ↑ Import.
How elements are matched
Actions that interact with the page (click, type, paste) locate elements using the ARIA accessibility tree, not CSS selectors. This makes recipes resilient to cosmetic HTML changes.
Each interactive step uses these fields to find its target:
| Field | Description |
|---|---|
role | The ARIA role of the element (button, link, textbox, checkbox…). |
name | The accessible name — usually the visible label or aria-label. |
nameStartsWith | (optional) Prefix match on the name. Useful when the name contains dynamic data (user names, counters, timestamps). When set, name is ignored. |
parentRole | (optional) Narrows the search to elements inside a specific parent role. |
parentName | (optional) Combined with parentRole, requires the parent to also match. |
nth | (optional) Zero-based index to pick the Nth match instead of the first. Use it when several elements share the same role and name — e.g. two unlabeled inputs in a login form: nth: 0 for the first, nth: 1 for the second. |
backendDOMNodeId | (optional) Skip ARIA matching entirely and act on this exact node id — the same id a query result or a get_aria_tree node reports. When set, role/name/etc. are ignored. |
When several elements match, the first one in document order wins — so on a list of followers, a click step with nameStartsWith: "Follow" will always target the first follower. Set nth to target a specific one.
backendDOMNodeId is only valid within the tab/session that produced it. It's a shortcut for reacting to a node you just saw in an earlier step of the same recipe (or the same live tab, for the extension backend) — not a stable identifier to store and reuse later. On the cloud/Lambda backend in particular, every recipe launches a brand-new headless browser: a backendDOMNodeId (or an assumption that the previous page is still loaded) from a prior call is meaningless in the next one. A recipe step with neither role nor backendDOMNodeId fails immediately with a clear error instead of hanging.
Navigation actions
navigate
Load a URL in the current tab and wait for it to finish loading.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | The URL to open. |
{ "action": "navigate", "url": "https://example.com" }
wait
Pause the recipe for a fixed amount of time.
| Parameter | Type | Required | Description |
|---|---|---|---|
ms | number | no | Milliseconds to wait. Default: 1000. |
{ "action": "wait", "ms": 2500 }
Interaction actions
click
Click on an element located via ARIA.
| Parameter | Type | Required | Description |
|---|---|---|---|
role | string | yes | ARIA role of the target. |
name | string | yes* | Accessible name. *Optional when using nameStartsWith. |
nameStartsWith | string | no | Prefix match for the name. |
parentRole | string | no | Restrict to a parent role. |
parentName | string | no | Restrict to a parent name. |
wait_for_navigation | boolean | no | If true, waits for the page to reload after the click. |
delay | number | no | Delay before executing the step, in ms. |
{ "action": "click", "role": "button", "name": "Add to cart" }
type
Type text into an input or textbox. The field must already have focus — usually preceded by a click step on the input.
| Parameter | Type | Required | Description |
|---|---|---|---|
role | string | yes | ARIA role of the input (textbox, searchbox, combobox…). |
name | string | yes | Accessible name of the input. |
text | string | yes | Text to type. |
parentRole, parentName, nameStartsWith | no | Same matching fields as click. |
{ "action": "type", "role": "searchbox", "name": "Search", "text": "botize" }
paste
Paste a file (image, document…) into a file-drop area or editor that accepts paste events.
| Parameter | Type | Required | Description |
|---|---|---|---|
role, name, … | Same matching fields as click. | ||
file_url | string | yes | Public URL of the file to paste. |
{
"action": "paste",
"role": "textbox",
"name": "Message",
"file_url": "https://cdn.example.com/photo.jpg"
}
Inspection actions
query
Inspect the ARIA tree to see what a matcher would select without performing any action. Useful when authoring a recipe to verify selectors before committing to a click/type/extract, or when debugging why an existing recipe stopped matching.
Read-only and side-effect-free: a query step never alters the page or the recipe state — it just reports what the matcher resolves to right now.
| Parameter | Type | Required | Description |
|---|---|---|---|
role | string | yes | ARIA role to look for. |
name | string | no | Accessible name. Empty/omitted means "match any name" — combined with role returns the first node of that role in document order. |
nameStartsWith | string | no | Prefix match for the name; takes precedence over name. |
parentRole, parentName | string | no | Same matching fields as click. |
limit | number | no | Max matches to return in matches array. Default 1 (only the first match in match). Set to e.g. 10 to inspect a list. |
label | string | no | Optional tag returned in the response, useful when a recipe contains several query steps. |
The response is appended to data.query (one entry per query step, in recipe order):
{
"label": null,
"match": {
"role": "gridcell",
"name": "Item label",
"backendDOMNodeId": 1234,
"children_count": 1,
"parent": { "role": "row", "name": "Item label" }
},
"total_matches": 3
}
When the matcher finds nothing, match is null, total_matches is 0, and a diagnostics payload is added with hints — count of nodes that have the role, count of nodes that match the name, and a sample of nodes with the role to help understand what is actually in the tree.
{
"match": null,
"total_matches": 0,
"diagnostics": {
"nodes_with_role": 8,
"nodes_with_matching_name": 0,
"sample_nodes_with_role": [
{ "role": "gridcell", "name": "First item..." },
{ "role": "gridcell", "name": "Second item..." }
]
}
}
{ "action": "query", "role": "gridcell", "name": "" }
Data extraction actions
Extraction actions populate the Data from Browser output returned to Botize. You can combine several in the same recipe.
get_aria_tree
Return the accessibility tree of the current page. Ideal for letting an AI understand the page structure.
| Parameter | Type | Default | Description |
|---|---|---|---|
filter | string | interactive | interactive keeps only actionable nodes (buttons, links, inputs…). all keeps everything. |
include_headings | boolean | false | Include heading nodes even in interactive mode. |
max_nodes | number | 500 | Hard cap to prevent huge payloads. |
{ "action": "get_aria_tree", "filter": "interactive", "include_headings": true }
get_landmark_text
Extract the visible text of the page grouped by ARIA landmark (main, navigation, banner, contentinfo, complementary, search, region). Best suited for product pages, articles and content-heavy pages.
| Parameter | Type | Default | Description |
|---|---|---|---|
sections | string[] | all | Limit the output to specific landmarks. |
include_links | boolean | false | Include the list of links inside each landmark. |
include_images | boolean | false | Include the list of images inside each landmark. |
{
"action": "get_landmark_text",
"sections": ["main"],
"include_links": true,
"include_images": true
}
extract_repeating_items
(Renamed from get_page_elements on 2026-07-07 — the old name read as "get all elements on the page", which repeatedly misled callers into expecting general page content instead of its actual, narrower job.)
Extract repeating items (search results, product cards, posts…) grouped by their semantic section and parent. It only picks up nodes whose ARIA role exactly matches item_role (default listitem, i.e. <li>) — it does not capture inputs, buttons, or standalone links that aren't part of a repeating list. If a page returns nothing, first run get_aria_tree to see what role its repeating content actually uses, then pass that as item_role (e.g. "article" for a blog, "row" for a table). For a single input/button/link, use get_aria_tree or get_landmark_text instead.
| Parameter | Type | Default | Description |
|---|---|---|---|
item_role | string | listitem | ARIA role of the items to extract. |
sections | string[] | all | Limit to specific landmarks. |
paths | string[] | — | Narrow the output to specific branches, e.g. "main > list_results". |
{ "action": "extract_repeating_items", "item_role": "listitem", "sections": ["main"] }
Each extracted item includes its text, outbound links and images.
screenshot
Capture a JPEG screenshot of the current tab.
| Parameter | Type | Default | Description |
|---|---|---|---|
full_page | boolean | false | If true, captures the full scrollable page instead of just the viewport. |
max_width | number | — | Downscale the capture so its width is at most this many pixels (keeps aspect ratio). Omit for original size. |
quality | number | 75 | JPEG quality, 10–100. Lower means a lighter file. |
{ "action": "screenshot", "max_width": 1024, "quality": 40 }
Lower resolution/quality makes captures lighter and faster — ideal when an AI assistant reads the screen rather than a person keeping the image. Both max_width and quality can also be set once on the step (the Screenshot resolution / Screenshot quality fields of this action's form) so they apply to every screenshot in the recipe; a value on the action itself overrides that default.
The screenshot is returned in the Screenshot URL output.
extract
Extract a single value (text or image) from the page. Typically generated by clicking Extract on the recorder; manual use is uncommon.
| Parameter | Type | Description |
|---|---|---|
name | string | Name of the variable to store the value under. |
xpaths | string[] | XPath candidates. The extension picks the value confirmed by most paths. |
isImage | boolean | If true, extracts src instead of text. |
{ "action": "extract", "name": "price", "xpaths": ["//span[@data-price]"] }
get_cookies
Return the cookies of the current tab. Read via the debugger protocol, so it also includes httpOnly cookies (session tokens) that document.cookie can't see. Mainly useful for capturing a login session to reuse in later HTTP calls.
| Parameter | Type | Default | Description |
|---|---|---|---|
names | string[] | all | Only return cookies whose name is in this list. Omit to return every cookie. |
The cookies are returned in the Data from Browser output under cookies, each as { name, value, domain, path, secure, httpOnly, expires }.
{ "action": "get_cookies", "names": ["JSESSIONID", "cd-token", "LB"] }
Example: capture a login session
{
"steps": [
{ "action": "navigate", "url": "https://example.com/login" },
{ "action": "type", "role": "textbox", "name": "User", "text": "me@example.com" },
{ "action": "type", "role": "textbox", "name": "Password", "text": "••••••" },
{ "action": "click", "role": "button", "name": "Sign in", "wait_for_navigation": true },
{ "action": "get_cookies" }
]
}
Example: product page scrape
{
"steps": [
{ "action": "navigate", "url": "https://example-shop.com/product/123" },
{
"action": "get_landmark_text",
"sections": ["main"],
"include_images": true
},
{ "action": "screenshot" }
]
}
Example: click the first follow-back button on X
{
"steps": [
{ "action": "navigate", "url": "https://x.com/your-handle/followers" },
{
"action": "click",
"role": "button",
"nameStartsWith": "Follow back",
"parentRole": "generic",
"parentName": "Follow back"
}
]
}
Output data
Information provided
When executed, this operation delivers the following data, which can be used in the same automatic task.
Tags
-
URL
{{url}}
URL
-
Data from Browser
{{browser_data}}
Data from Browser
-
Screenshot URL
{{screenshot_url}}
Public URL of the screenshot taken by the browser (if a screenshot action was included in the recipe)
-
Status Code
{{status_code}}
Status Code
Learn by watching
Video tutorials
Short videos where you watch a real task being built from start to finish.
Get inspired
Ready-to-use automations
Real tasks built with Google Chrome: switch them on in minutes and tweak them to your liking.
Need a hand?
Real people behind it
Email us
info@botize.com
Monday to Friday from 7 a.m. to 1 p.m. (Spain).
Message us on Telegram
t.me/botize
Monday to Friday from 7 a.m. to 1 p.m. (Spain).
Come with an idea.
Leave with an automation.
Create your first task in minutes. Do it once and forget about it forever.
Start automating