The CheckOps Engineer home

Essay

Browser Agents vs Test Automation: Operator and BDD

OpenAI Operator, vibe coding, SpecFlow's end and Cucumber's new home: where browser agents fit next to deterministic test automation and BDD in 2025.

15 February 2025 · 11 min · Irfan Ahmad

Every few years a technology appears that makes people ask whether test automation as we know it is finished. Record-and-playback did it. Codeless tools did it. In January 2025 it was browser agents. OpenAI launched Operator, an agent that uses a web browser on your behalf, and within days QA forums filled with variations on one question: if an AI can just use the app, why are we maintaining thousands of scripted tests?

This essay covers mid-January to mid-February 2025. It looks at what browser agents can and can’t do for testing, and why the answer isn’t “replace the suite”. It also looks at a quieter story from the same weeks: the shake-up in behaviour-driven development tooling, which says something about how much human-readable specification still matters.

Operator and the computer-using agent

On 23 January OpenAI released Operator as a research preview for Pro users in the US. It’s powered by a model OpenAI calls the Computer-Using Agent (CUA). Like Anthropic’s computer use, which we covered in November, CUA works from screenshots and issues mouse and keyboard actions. Unlike a raw API, Operator comes packaged as a product, with a hosted browser, task management and hand-off to the user for logins, payments and CAPTCHAs.

OpenAI published benchmark results that show how fast this category is moving:

Benchmark What it measures CUA result
OSWorld Full computer tasks across OS and apps 38.1%
WebArena Realistic self-hosted web tasks 58.1%
WebVoyager Tasks on live public websites 87.0%

Three months earlier, the best published OSWorld score was in the teens. A jump to 38% is remarkable. So is what the number leaves out: six out of ten general computer tasks still fail. On live websites with clear tasks, success is far higher, and that’s the setting most relevant to web testing.

For QA, the useful framing is to treat agents as a new kind of tester, not a new kind of test. They’re fast, tireless, cheap compared with humans, not very observant, and not reliable enough to sign off a release on their own.

How to read agent benchmarks as a tester

Benchmark numbers will be everywhere this year, so it’s worth knowing what they do and don’t tell you.

  • OSWorld tasks span whole operating systems and desktop apps. It’s the hardest and most general, which is why scores are lowest.
  • WebArena runs agents against self-hosted clones of realistic web apps, such as an e-commerce site, a forum and a code-hosting tool. It’s reproducible because the sites don’t change between runs.
  • WebVoyager uses live public websites with relatively well-defined tasks. Scores are high, but the sites change over time, so results are harder to reproduce exactly.

As a tester, ask three questions of any number. Is the task distribution like my app? Benchmarks favour public, consumer-style sites, while enterprise apps with dense forms and role-based permissions are often harder. How is success judged? Some benchmarks use automatic checks and others use model or human judgment, and the latter can be generous. How many attempts and steps were allowed? A higher step budget raises scores but also cost and time per run.

The most useful benchmark is the one you build yourself: ten goals from your own product, run repeatedly, with outcomes verified through your own APIs. That’s exactly the experiment described above, and it’s the only number that should influence your test strategy.

Where browser agents genuinely help testing

Exploratory smoke passes

Give an agent a goal, such as “sign up as a new user, create a project and invite a teammate”, and let it try. When it fails, the failure is often interesting: a confusing label, an unexpected modal, a dead end in the flow. Agents fail where real users get confused, which makes them an unusual but real usability signal.

Drafting scripted tests

An agent that completes a journey has effectively recorded it. Several tools in this space now convert agent traces into Playwright or Cypress code that a human reviews and commits. That’s often the highest-value use. The agent does the tedious exploration once, and a deterministic script does the regression checking thousands of times.

Testing hard-to-script surfaces

Legacy web apps with unstable markup, canvas-heavy UIs, third-party embedded widgets and apps whose DOM is generated unpredictably are expensive to automate with selectors. Pixel-based agents sidestep the selector problem entirely.

Checking agent-readiness

This one is new. If browser agents become a meaningful share of how users interact with web apps, your app needs to work for agents: clear labels, predictable flows, no unnecessary interaction traps. A periodic agent run against key flows is a cheap way to find out whether your UI is agent-friendly.

Where they don’t, yet

Regression gating. A release gate must be deterministic. The same build should produce the same verdict every time. An agent that succeeds 87% of the time on clear tasks is a noise generator in a merge pipeline.

Precise oracles. Agents report what they think happened. Checking that a tax calculation is correct to the cent, that an audit log entry was written, or that a webhook fired requires explicit assertions against data, not a model’s impression.

Speed and cost at scale. Each agent step is a multimodal model call. A suite of hundreds of journeys, run on every merge, would be slow and costly compared with a scripted suite that finishes in minutes.

Auditability. In regulated industries, test evidence has to be reproducible. “The agent clicked around and said it was fine” won’t satisfy an auditor.

A hybrid architecture that works

The pattern we expect to become standard in 2025 has agents at the edges and determinism in the middle:

           ┌──────────────────────────┐
 explore → │  Agent (goal-driven)      │ → findings, UX issues, draft scripts
           └──────────────┬───────────┘
                          │ human review
           ┌──────────────▼───────────┐
 gate    → │  Scripted suite           │ → deterministic pass/fail on every merge
           │  (Playwright / Cypress)   │
           └──────────────┬───────────┘
                          │ failure
           ┌──────────────▼───────────┐
 repair  → │  Agent-assisted triage    │ → suggested locator / flow fix, human approves
           └──────────────────────────┘

Agents explore and draft. Scripts gate. When scripts break, agents help diagnose and propose repairs, which a human approves. That keeps the release decision deterministic while getting value from agents where humans are slow.

Running your first agent experiment responsibly

If you want to try an agent against your own product this quarter, a small, structured experiment teaches more than weeks of reading benchmark charts. Here’s a protocol we’d use.

1. Choose the environment carefully. Use a staging or ephemeral environment seeded with synthetic data. Never point a general-purpose agent at production with a real account. It will eventually click something destructive, and you don’t want that to be a real refund or a real email to a customer.

2. Write goals, not scripts. Phrase each task as a user outcome with an observable end state:

- id: signup-and-invite
  goal: "Create a new account with the email provided, create a project called 'Agent Trial', and invite teammate@example.test as an editor."
  success_check: "API: GET /projects?name=Agent%20Trial returns 1 project with 1 pending invite"
- id: change-plan
  goal: "Upgrade the current workspace from Free to Team using the test card."
  success_check: "API: GET /billing/subscription returns plan=team"

The success_check is the important part. Don’t rely on the agent’s own summary. Verify the outcome through an API or database query, exactly as you would in a scripted test.

3. Run each goal several times. Five runs per goal is a reasonable minimum. Record success rate, steps taken, wall-clock time, and every point where the agent hesitated, backtracked or asked for help.

4. Classify the failures. Each failure falls into one of three buckets: an agent limitation (it misread the screen or lost track), a product issue (ambiguous label, unexpected modal, broken flow), or an environment issue (test data, timeouts). The second bucket is the gold. Those are findings you might never have got from a scripted suite.

5. Compare against your scripted suite. For the same journeys, how long do your Playwright or Cypress tests take, how often do they flake, and what do they cost to run? That comparison, not the benchmark leaderboard, tells you where agents fit in your process.

Agents as users: the other side of the coin

There’s one more implication of Operator that testers shouldn’t miss. If browser agents act for real users, they become part of your traffic. That brings new testing questions:

  • Bot defences. Do your CAPTCHA, rate limiting and fraud rules block legitimate agent use, allow abusive agent use, or both? This is now a product decision that needs test coverage.
  • Flow robustness. Agents are less forgiving than humans of interstitials, surprise pop-ups and multi-step modals. Flows that humans tolerate may be impossible for an agent.
  • Confirmation and consent. Operator hands control back to the user for payments and logins. Your app should make sensitive steps clearly identifiable, so agents and the humans supervising them know when they’re about to commit.
  • Analytics hygiene. Agent sessions can distort funnels and A/B test results. Can you identify and segment them?

None of these needs exotic tooling. They need someone to put them on the test plan, which is a classic QA contribution.

Playwright 1.50: polishing the deterministic core

While the agent news grabbed headlines, Playwright 1.50, released the same day as Operator, kept improving the boring, essential parts of scripted testing. It added timeouts and conditional skipping for individual test.step blocks, more granular snapshot update modes, and assertions for accessible error messages:

await test.step('apply coupon', async () => {
  await page.getByLabel('Coupon').fill('SPRING25');
  await page.getByRole('button', { name: 'Apply' }).click();
}, { timeout: 5_000 });

await expect(page.getByLabel('Coupon')).toHaveAccessibleErrorMessage('Coupon has expired');

Step-level timeouts are a small thing that makes failures far easier to localise. Accessible-error assertions test something both users and agents rely on: that error states are announced, not just painted red.

Vibe coding and the verification gap

On 2 February Andrej Karpathy coined “vibe coding” for a style of programming where you “fully give in to the vibes”, accept AI-generated changes without reading the diffs, and paste errors back until things work. He was explicit that it suited throwaway weekend projects. The term spread far beyond that context within days.

For testers, vibe coding sharpens a problem DORA flagged last autumn. If code is increasingly produced by people who don’t read it, then tests become the only specification anyone checks. In a vibe-coded codebase, the test suite isn’t a safety net under the specification. It is the specification. That raises the stakes on test quality, and on who writes the tests. We look at how this played out over the year in our August 2025 essay.

The BDD shake-up

Two developments around the turn of the year reshaped the behaviour-driven development landscape:

  • SpecFlow reached end of life. Tricentis ended SpecFlow on 31 December 2024. Its GitHub repositories were removed and support stopped. The community fork, Reqnroll, is the maintained successor, and migration is mostly a matter of package references and namespaces.
  • Cucumber returned to community ownership. On 19 December 2024 SmartBear transferred stewardship of Cucumber, including the domain and trademarks, to the Open Source Collective. The project can now operate independently of a single vendor’s commercial priorities.

Discussion in Software Testing Weekly and elsewhere asked whether BDD is dying. Our view is that BDD tooling has had a rough patch, while BDD as a practice may be about to become more valuable.

Here’s why. Gherkin scenarios are structured natural language describing behaviour:

Feature: Coupon codes
  Scenario: Expired coupon is rejected with a clear message
    Given a cart containing "Blue Mug" priced at 12.00
    When the shopper applies coupon "SPRING25"
    Then the coupon is rejected
    And the message "Coupon has expired" is announced

That’s almost exactly the kind of goal you’d hand to a browser agent, and almost exactly the kind of specification an AI coding assistant needs to generate a correct scripted test. Teams with a library of clear, reviewed behaviour specifications are in a strong position to use AI. Teams whose only specification is the code have nothing to give it except the code.

The lesson from SpecFlow’s end is about dependency risk, not BDD. If your test framework is a single vendor’s open-source project, have a plan for the day it isn’t.

Security tooling keeps raising money

On 5 February Semgrep announced a $100M Series D led by Menlo Ventures, bringing total funding to $204M. Semgrep’s pitch combines fast, rule-based static analysis with AI-assisted triage to cut false positives. As AI-generated code volume grows, cheap static checks on every commit become more important. We cover Semgrep and its peers in our security testing tools 2025 roundup.

What testers say about AI right now

PractiTest’s State of Testing 2025 report gives useful ground truth to set against the agent hype. Around 46% of respondents said they hadn’t yet adopted AI in their testing. Among those who had, the most common uses were test case creation, around 41%, and test data generation, around 35%. Data privacy was the top barrier, cited by 56%, followed by skills gaps at 33%.

That’s a very different picture from the demos. Most testing teams are early. Where they use AI, it’s for drafting artefacts, not running agents. Privacy, not capability, is the main brake. Any agent strategy that sends screenshots of production-like data to a third-party model has to answer the privacy question first.

Comparing approaches side by side

Approach Best for Weakness Cost profile
Scripted E2E (Playwright, Cypress) Regression gates, precise assertions Maintenance on UI change Low per run; engineer time to write
NL/codeless platforms (testRigor, mabl) Teams with few automation engineers Lock-in, per-run pricing Subscription
Browser agents (Operator, CUA, computer use) Exploration, drafting, awkward UIs Non-determinism, weak oracles High per run
BDD specs + generated scripts Shared understanding, AI-ready specs Discipline to keep specs current Engineer and analyst time
Manual exploratory testing Novel risks, UX judgment Doesn’t scale Human time

What this means for your team

Don’t replace your suite. Surround it. Keep deterministic scripted tests as the release gate. Pilot agents for exploration and for drafting new scripts.

Run an agent against your top three journeys. Use whichever agent you have access to, and record where it struggles. Treat every struggle as a potential usability or accessibility bug.

Invest in specifications. Whether or not you use Cucumber or Reqnroll, write behaviour down in clear, reviewable language. It’s the best input for both human testers and AI tools.

Check your BDD dependencies. If you’re on SpecFlow, plan the move to Reqnroll now. If you’re on Cucumber, its new governance is good news, but keep watching it.

Write accessible error states and test them. toHaveAccessibleErrorMessage and role-based locators serve users with assistive technology, browser agents and your own test stability at once.

Answer the privacy question first. Before any agent sees your app, decide which environments and data it may touch. The State of Testing data suggests that’s what your organisation will ask about first.

Browser agents are the most interesting testing technology of early 2025. They’re a new instrument in the toolbox, not a replacement for it. The teams that benefit most will use them where human attention is scarce and keep the final verdict where determinism lives.

Further reading on CheckOps