browser_tab_run
Run JavaScript code in an open browser tab to automate page interactions and data extraction. Requires tab to be opened first.
Instructions
Execute JavaScript code in the browser tab. The code runs as an async function body.
CRITICAL RULES:
MUST call browser_tab_open before browser_tab_run
ALWAYS await async tab methods
tab.observe() and tab.goto() invalidate previous element refs
Default to tab.observe() for page state; screenshot only when appearance matters
For reading static content (articles, docs, JSON, PDFs), prefer webfetch — browser is for JS execution, auth, interactive actions
Available variables in scope:
tab — TabApi object: tab.url(): string (sync) tab.title(): Promise tab.goto(url, { waitUntil? }) waitUntil: 'load' | 'domcontentloaded' | 'networkidle' tab.click(selector) CSS, "text/...", "xpath/...", "aria-ref=..." tab.type(selector, text) tab.fill(selector, value) clear + type into input tab.press(key, { selector? }) e.g. 'Enter', 'Escape' tab.hover(selector) tab.scroll(deltaX, deltaY) tab.scrollIntoView(selector) tab.screenshot({ fullPage?, selector? }) returns base64 PNG tab.evaluate(fn, ...args) raw JS in page context tab.observe() accessibility tree: { elements: [{ id, role, name, value, focused }] } tab.ariaSnapshot() Playwright-format YAML tree with [ref=eN] ids, [cursor=pointer] for clickables tab.id(n) ElementHandleActions from observe() id tab.ref("e5") ElementHandleActions from ariaSnapshot() ref tab.waitForSelector(selector, { timeout?, visible?, hidden? }) tab.waitForUrl(pattern, { timeout? }) string substring or RegExp tab.waitForResponse(pattern, { timeout? }) string, RegExp, or (res) => boolean tab.waitForNavigation({ waitUntil?, timeout? }) tab.select(selector, ...values) option(s) tab.drag(from, to) selector or { x, y } point tab.extract(format?) 'markdown' | 'text' | omitted (returns HTML) tab.uploadFile(selector, ...filePaths) file input
ElementHandleActions: { click, type, fill, hover, focus, screenshot, evaluate, scrollIntoView }
display(value) — emit structured output (NOT a tab.* method)
wait(ms) — delay (NOT a tab.* method; use bare wait(2000), not tab.wait(...))
assert(cond, msg?) — guard (NOT a tab.* method)
Selectors: CSS by default, "text/Sign in" for visible text, "xpath/...", "aria-ref=e5" from ariaSnapshot.
Single-expression code auto-returns its value (no explicit 'return' needed). Use display() for intermediate values.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | JavaScript code body to execute |