Why Spur takes a fundamentally different approach to iOS and Android automation — one that requires no code changes, no instrumentation, and no brittle selectors.
TL;DR: Traditional mobile automation breaks because it depends on hooks, instrumentation, and brittle selectors. Spur runs your real app and drives it visually with an AI agent — so tests survive UI changes and reflect what users actually experience.
Mobile is where most QA strategies quietly fall apart.
Teams that have solid, automated coverage on the web often have a spreadsheet, a contractor, and a prayer on mobile. The reasons are structural: mobile operating systems — iOS especially — are built around a curated, locked-down trust model. That model is great for users and terrible for testers. The same walls that keep attackers out keep your automation out.
The industry's usual answer has been to break into the app — inject a library, swizzle the runtime, re-sign the binary, and fork low-level agents to wrestle control from the OS. It works, but it comes with a cost that rarely makes it into the sales deck:
You're no longer testing the app you ship.
Spur takes a different path. Instead of modifying your app, Spur drives it like a person would — an AI agent that looks at the screen, understands it, and acts. Here's why that matters, and what it unlocks.
What this unlocks: faster test authoring, dramatically lower maintenance, and higher trust — because you're validating the same build your users run.
Why mobile testing is hard
There are three problems every mobile automation effort runs into:
- The OS won't cooperate. iOS provides no supported way for an external tool to reach into a running app. Android is a little friendlier, but real-device fragmentation and flaky tooling erode any head start.
- Selectors are a moving target. Traditional frameworks bind tests to element IDs, XPaths, and accessibility identifiers. The moment a designer renames a button or reflows a screen, your suite turns red — not because the app broke, but because the test did.
- Maintenance eats the ROI. Teams don't abandon mobile automation because they can't get it working once. They abandon it because keeping it green costs more than the bugs it catches.
Every approach to mobile testing is really an answer to problem #1 — how do you get control? The answer you choose determines whether you also inherit problems #2 and #3.
If this sounds familiar: "We tried mobile automation… it worked for a week… then the suite became a full-time job."
Two philosophies: instrument the app, or drive the app
Most tools get control by going inside the binary.
The instrumentation approach injects a dynamic library at install time, re-signs the app with custom certificates, and uses runtime hooks to expose test controls. It's clever engineering — but it means:
- You test a modified build, not your production binary.
- You inherit an integration burden (signing exceptions, CI/CD injection, managed devices, forked agents to maintain).
- Coverage becomes capability-by-capability (camera, mic, barcode, etc. each needs bespoke hooks).
Spur gets control the way a human tester does: by looking at the screen and interacting with it.
There's no library in your binary, no re-signing requirement, no swizzling. Spur runs your real app on real iOS simulators and Android emulators, and an AI agent perceives the UI visually and performs actions — taps, types, scrolls, swipes, gestures — based on plain-English instructions.
The difference in one line:
Instrumentation changes the app so the test can see it. Spur teaches the test to see the app.
How Spur tests mobile
1) You write tests in plain English
No selectors. No coordinates. No code.
"Open the app, continue as guest, search for 'white jackets', and confirm results appear."
That's a Spur test. You describe the goal the way you'd hand it to a teammate holding the phone, and the agent figures out the interactions. Anyone on the team — QA, PM, support — can author coverage, not just SDETs.
Example prompt: "Sign in, skip tracking permission, add any item to cart, and confirm checkout loads."
2) An AI agent sees the screen and acts
Under the hood, Spur's agent uses a vision-language model to understand what's actually on screen and decide the next action. Because it reasons about the UI the way a person does, it:
- Adapts to change. Renamed buttons and layout tweaks don't automatically break the test.
- Handles messy mobile reality. System permission dialogs, tracking prompts, onboarding screens, and interstitials get handled in-flow instead of derailing the run.
- Self-heals. No selector graveyard to maintain.
3) It runs unmodified — on real simulators and devices
Your app runs exactly as built. Spur orchestrates the device, launches the app, drives native gestures, and observes results. Native actions — relaunch, foreground, deep links, back navigation, device rotation, shake, keyboard input, toast assertions — are all first-class, expressed in the same natural-language flow.
4) Environments and builds are handled
Point a test at a build (iOS or Android) and an environment, and Spur manages install, configuration, credentials, and deep links per environment. Promote the same test across dev, staging, and production without rewriting a thing.
What you can automate first on mobile
If you're not sure where to start, the highest-leverage journeys are the ones that break most often — and hurt most when they do:
- Onboarding & auth — email/social sign-up, login, SSO, "continue as guest," plus the permission and ATT prompts that derail brittle scripts.
- Search & discovery — queries, filters, sorting, and empty/error states.
- Commerce — add-to-cart, checkout, payments, promo codes, order confirmation.
- Account & settings — profile edits, notification toggles, plan changes, logout.
- Deep links & navigation — universal/app links into a specific in-app screen, plus back-navigation and tab flows.
- Content & media — feeds, playback, pull-to-refresh, infinite scroll, uploads.
- Regression & smoke packs — a core suite that runs on every build, in every environment.
- Cross-platform parity — the same journeys on iOS and Android from one set of instructions.
Start with your highest-traffic, highest-revenue path, describe it in a sentence, and let the AI draft it. You'll have real coverage running in minutes, not sprints.
A quick mental checklist for "good" mobile tests
- User-language steps (not implementation details)
- Stable assertions (what the user sees + what the backend did)
- Permission/onboarding resilience (the stuff that flakes first)
- Evidence attached (video + network + logs for every failure)
Watch it happen: live streaming
Automation you can't see is automation you can't trust. Spur lets you stream a live, interactive session of the device right in your browser — tap through the app yourself, reproduce an issue, or watch a test drive the flow in real time.
Every run is recorded, with network and console logs captured, so a failure comes with the evidence attached instead of a stack trace and a shrug.
Beyond the screen: network + console observability
A passing tap isn't proof that everything worked. The most damaging mobile bugs are the ones the screen doesn't show — a checkout that looks successful but fires a 500 to the payments API, an analytics event that silently stops sending, a token that leaks in a request header, a retry storm quietly draining battery.
Spur runs two dedicated observability agents alongside every mobile test so those failures can't hide.
The network agent
The network agent captures the requests your app makes — to your own backend and to third-party SDKs — and turns invisible behavior into something you can assert on:
- Catch silent backend failures (UI says "Order placed," but POST /checkout returned 500).
- Verify integrations and analytics (Segment, attribution SDKs, internal APIs).
- Guard performance and cost (redundant calls, retry storms, oversized payloads, slow endpoints).
- Check privacy and security (see what data leaves the device, and where it goes).
The console log agent
The console log agent captures the app's own logs — warnings, errors, and stack traces that rarely surface in the UI. When a test fails, you don't get "element not found"; you get the underlying exception, correlated to the step that triggered it.
Together, these shift mobile QA from "did the screen look right?" to "did the app actually behave correctly end-to-end?"
Why this wins
- App under test — Instrumentation-based tools: a re-signed, dylib-injected build. Spur: your real app, unmodified.
- Authoring — Instrumentation-based tools: code + selectors. Spur: plain English, no code.
- Resilience to UI change — Instrumentation-based tools: break on selector changes. Spur: AI adapts — self-healing.
- Setup — Instrumentation-based tools: signing exceptions, CI/CD injection. Spur: point at a build + environment.
- Cross-platform — Instrumentation-based tools: per-platform tooling. Spur: one model for web, iOS, and Android.
- Maintenance — Instrumentation-based tools: grows with the suite. Spur: minimal selector upkeep.
Get started
If mobile has been the gap in your automated coverage — the platform where you're still paying for manual QA or skipping it entirely — Spur closes it without asking you to modify your app or hire a team to babysit selectors.
Write your first mobile test in plain English today. Start with one critical flow (signup, search, or checkout), describe it in a sentence, and let Spur draft the full test.
FAQ
Do I have to modify or re-sign my app?
No. Spur runs your real app on managed simulators/devices and drives it externally with an AI agent.
Do I need to write code or maintain selectors?
No. Tests are natural-language steps. The agent interprets the screen visually, so there are no element IDs or XPaths to keep in sync with your UI.
What happens when the UI changes?
The agent recognizes intent ("the primary button," "the search field"), so cosmetic and layout changes that shatter selector-based suites generally don't break Spur tests.
iOS and Android both?
Yes — and the same authoring model covers web too. One way to write tests across all three.
Can I see what the tests are doing?
Yes. Stream a live, interactive session in your browser, and every run is recorded with network and console logs.
Can I assert on network requests and console logs?
Yes — in the same natural language you use for on-screen checks (e.g., "expect a successful POST /checkout", "fail if there are any console errors").