Repository navigation
dashboard with no export button
Internal tools, admin panels and analytics screens routinely show you a number and give you no way to take it away. An agent driving the browser can get it out, and which route it should take depends on something you can check in ten seconds.
Four routes, cheapest first. Try them in order; most dashboards fall at the second.
If the numbers are laid out as a table or a list, they are in the HTML and you are done. Ask for the markup rather than the text, because the structure is the part you want: cells stay cells, and a row does not collapse into a sentence.
Reading a table with an AI agent is that route in detail, including spanning headers and the rows that are not rows.
browser_read_html is 1.3 times the cost of the plain text and about a
ninetieth of a screenshot, which is
measured on its own page. For tabular data it is
almost always the right ask.
The thing to check before you trust it: the displayed value is sometimes not
the full value. A cell showing 1.2M often carries the exact figure in a title
attribute or a data attribute, and a cell showing 12.3% may be a rounded render
of something longer. Reading the markup rather than the text is what gets you the
real one.
The table is there, and it holds twenty of four hundred rows. Two different problems wearing the same coat.
Paginated: there is a next control. The agent clicks through and accumulates, which works and costs about a second per page in click time. Give it a page ceiling so a broken pager does not become an endless run.
Virtualised: the list renders only what is on screen and destroys rows as you scroll past them. Scrolling and re-reading works, and the trap is that the agent must accumulate as it goes, because scrolling back does not recover what it saw. Deduplicate on a key rather than on position, since a virtualised list will hand you the same row twice.
This is where dashboards get genuinely hard, and where the obvious move is the wrong one.
The obvious move is a screenshot and ask the model to read the chart. It costs about ninety times the text of the page, and it gives you values read off pixels, which means a number that looks right and is not. For a series of forty points it is not a transcription, it is an estimate.
Look for the data first, because it is usually somewhere:
- A table behind a toggle. Many chart libraries ship an accessible table view, sometimes visually hidden, always in the HTML.
- The tooltip. Hovering a point reveals the exact value, and the agent can hover a point at a time. Slow but exact.
- The element's own attributes. Charts drawn as SVG carry their geometry, and charts fed from a data attribute carry their numbers.
Use the picture when the question is about the shape rather than the values: which line is higher, where the step is, whether there is a gap. That is a genuinely visual question and a screenshot answers it properly.
Some dashboards compute on demand: pick a date range, press apply, wait, read. There is no shortcut here, and the only thing to get right is the waiting. Wait for the state rather than for a duration, as in when the page changes under the AI agent: wait until the total has changed from the previous value, not two seconds.
The failure this avoids is reading the old numbers after pressing apply, which produces a perfectly formatted CSV of the previous query and nothing to indicate it.
Whichever route, accumulate to the file per page or per scroll rather than at the end. A forty-page pager that dies on page thirty-one should leave thirty pages of rows behind, and extracting data to a CSV with an AI agent is the output side of that.
Record the URL and the timestamp with the rows. A dashboard number without the filter state it came from is not reproducible, and you will not remember which date range you had selected.
Ask for the total the dashboard itself displays, and compare it with the sum of what you extracted. If the page says 412 rows and you have 380, you lost a page; if the page says a total of 91,204 and your column sums to 74,880, you lost rows or read a rounded column.
This is one extra read and it is the only thing standing between a partial extraction and a partial extraction you did not notice.
How do I export data from a dashboard with no export? Read the HTML if the data is a table, page or scroll through if it is paginated or virtualised, and go looking for the chart's underlying table before screenshotting the chart.
Should I screenshot the chart and have the model read it? Only if the question is about shape. For values it is expensive and approximate, and the exact numbers are usually in the markup or the tooltip.
Why did my extraction get 20 rows out of 400? Pagination or virtualisation. Both look identical on the first read; check for a next control before assuming.
Why do my numbers not match what the dashboard says? Either a rounded display value where the markup holds the exact one, or a page you lost. Compare against the total the dashboard prints.
The page recalculates when I change a filter. How do I not read the old numbers? Wait for a value to change rather than waiting a fixed time, and confirm the filter state is what you set before recording anything.
See also: getting website data into Google Sheets with an AI agent for where the rows go next, and text, HTML, snapshot or screenshot for why the markup is the cheap ask and the picture is not.
- The relative cost of the four reads (text 1x, HTML 1.3x, snapshot 2.1x, screenshot 89x) is measured and sourced on text, HTML, snapshot or screenshot.
- The routes and their failure modes are from driving real dashboards with this browser, and are offered as experience rather than as a study. No specific product is named.
Route 3 is the one worth remembering. Everybody reaches for the screenshot on a chart, and the numbers are nearly always sitting in the page in a form that does not need reading off pixels.
- OpenAI Operator alternatives
- Open-source Operator-style agents
- Is OpenAI Operator still available?
- OpenAI Operator vs Claude computer use
- browser-use alternatives
- Choosing an AI browser agent
- Open-source AI browser agents
- Open-source computer-use agents
- What is an AI web agent?
- AI browser agents vs traditional scraping
- Cloud browser infrastructure for AI agents, explained
- Browserbase alternatives
- Firecrawl vs an AI browser agent
- Skyvern alternatives
- Stagehand vs browser-use
- Project Mariner is gone: what replaced it
- Manus alternatives
- Gemini computer use vs Claude computer use
- A stealth browser MCP, reviewed honestly by its own wiki
- AI browser vs AI browser agent: which one do you want?
- AI browser agent vs RPA: which one fits the job
- AI browser agent vs n8n, Zapier and Make
- Vercel agent-browser alternatives, compared honestly
- What is an agentic browser? Definition and the two kinds
- Open-source agentic browsers: the three layers, compared
- Choosing an MCP server for browser automation: four axes
- Stealth MCP servers compared: Camoufox, nodriver, Patchright
- Playwright MCP alternatives, and the three you don't need
- Autonomous browser agents: the four rungs of autonomy
- What is actually free in the AI browser agent stack
- browser-use on GitHub: what the repo actually gives you
- Playwright MCP vs Chrome DevTools MCP: different jobs
- How to choose among MCP servers: a map by category
- Which MCP servers are worth adding to Claude Code
- MCP on GitHub: finding servers and judging them fast
- MCP vs an API: the decision, and what the wrapper costs
- MCP alternatives: when the protocol is the wrong shape
- Why does my AI agent get blocked?
- The timing signal AI agents give off
- Agent retry loops trip rate limits, not fingerprints
- Claude computer use detected as a bot
- browser-use getting blocked: what you can and cannot change
- Playwright MCP session blocked: four causes, four fixes
- Playwright MCP and captchas: what actually gets you past
- Cloudflare and a browser MCP server: what is being read
- Can an AI agent solve a captcha? The honest answer
- Getting an AI agent to fill out forms
- The best model for an MCP browser agent, and what it really costs
- Browser problem or model problem?
- How to use a Playwright MCP server with Claude Code
- Extracting data to a CSV with an AI agent
- Monitoring a page for changes with an AI agent
- How to let Claude Desktop control a browser
- How to add a browser to Cursor as an MCP server
- Using an AI agent to hunt for apartments
- Getting website data into Google Sheets with an AI agent
- Using an AI agent to download invoices from portals
- AI agents for web research
- Using an AI agent to test your own website
- How to add a browser to Cline as an MCP server
- Posting to social media with an AI agent
- Posting to Facebook with an AI agent
- Posting to Instagram with an AI agent
- Posting to X with an AI agent
- Automating LinkedIn posts: read this first
- Appointment bots: what they are and what an agent can legitimately do
- Track prices across sites with an AI agent
- Build a lead list with an AI browser agent
- Run an AI browser agent on a schedule
- AI browser agent with a local LLM: what changes
- Should you log your AI agent into your accounts?
- How to write a task an AI browser agent can follow
- Move data between two web apps with an AI agent
- The MCP server
- How the tools are shaped, and why
- Playwright MCP vs the Playwright CLI: which fits when
- Playwright MCP: browser is already in use, and the fix
- Playwright MCP best practices: four decisions that matter
- Playwright MCP with a proxy, and the three leaks it leaves
- A browser MCP server in GitHub Copilot: setup and limits
- Using a browser MCP server for web scraping: the pattern
- Which LLM for browser automation: the four properties
- How to build a browser agent, and what to take instead
- Getting an AI agent to log into a website: three routes
- MCP tools, resources and prompts: who controls each
- How many MCP tools is too many? The context arithmetic
- How to build an MCP server: the decisions, not the scaffold
- Local or remote MCP server: what changes, and what does not
- Writing an MCP client in Python: the thirty-line version
- Self-hosted AI agent: what one actually costs to run
- How long an AI browser agent takes per step, measured
- Text, HTML, snapshot or screenshot: what the agent should read
- Giving an AI browser agent a stopping condition
- Keeping an AI browser agent out of destructive actions
- Why did the AI agent click the wrong thing
- When the page changes under the AI agent
- Running one AI agent task across a list of sites
- Seeing a page as it appears in another country
- Getting data out of a dashboard with no export button
- Two browsers in one session: main and support
- Finding the dead links on a site with an AI agent
- Filling a CRM record from a company's website
- One form submission per spreadsheet row, with an AI agent
- Dated screenshots of a page as evidence
- Checking order and delivery status with an AI agent
- Reading a PDF that opens inside the browser
- Summarising a long page or thread with an AI agent
- Collecting every image on a page with its caption
- Collecting event and course listings with an AI agent
- Cancelling a subscription with an AI agent
- What an AI agent can and cannot do inside an iframe
- Shadow DOM and an AI agent: you can click it, you cannot read it
- How to add a browser to Codex as an MCP server
- What a page snapshot costs, per control
- How to let Gemini CLI use a browser
- Native selects and the ones that only look like selects
- Clicking by selector or by coordinates
- How long the agent waits before it gives up
- What a second browser costs
- Uploading a file with an AI agent, and why this one cannot
- Watching the agent work, and when it is worth it
- When not to use an AI browser agent
- Agent or script: deciding once instead of every time
- Using the keyboard instead of the mouse
- Secrets in an agent task: where they end up
- What an agent run should log
- Deduplicating what an AI agent collects
- Normalising values across sites
- Validating an AI agent's output
- Reading a table with an AI agent
- Driving a site's own search and filters
- The task works headed and fails headless
- How to let the AdaL CLI use a browser