Build1 distinct publisher2 min readPublished
A ranked locator strategy for Appium reduces to one rule: trust what a developer typed, not what the render tree produced. Nearly every repair it implies lands in app code.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Every tier in that ranking is really an answer to an ownership question. Take the three ways the author says an accessibility id goes bad: a generated value like `button_3f9a`, one value reused down a list, or a TalkBack sentence sitting in `contentDescription` that changes with the locale [8]. All three are values chosen in application source, so the durable repair is a commit in the app rather than an edit to the suite [20]. His remedy for the third case, ask for a `resource-id` and leave `content-desc` to accessibility [8], is a ticket on somebody else's board.
The write-around, when you need one, has a shape. Where an ID lives inside a reused component and twenty rows share it [c11b], the advice is to add a second condition rather than drop to XPath by index [12]: the shared ID plus that row's label narrows to one element without touching the hierarchy [15]. Text is a poor primary anchor outside a single-language app with no near-duplicates on screen [13], and a decent qualifier, because both halves of that locator still point at something a person typed deliberately [4].
On iOS the same logic applies to the fast native options. Predicate strings and class chains are XCUITest queries, materially quicker than XPath on a deep tree, one filtering on attributes and one navigating the tree [16]. Their failure modes travel with the syntax. A predicate on `label` dies with localisation, which is why the author filters on `name`, the accessibility identifier [17]; the same release that turns "Continue" into "Nastavi" for Serbian takes out every text locator too [14], so one line in a changelog retires two strategies [21]. A class chain carrying an index breaks when a cell gains a child [17], the same trigger as the path an inspector hands you when you click copy XPath [18].
Which is why the author puts the long-term fix outside the test repo entirely: get IDs added where the feature is written [19]. An `android:id` costs a line in a layout file, is never shown to a user, and changes only when someone renames it on purpose [9]. Without it, the suite's break schedule is set by whoever next refactors a layout, swaps a design system component, or ships an OS that renders a control differently [5], and none of those people will open the test.
Ranked by verification strength, evidence, and original report placement.
A predicate on label breaks with localisation, so the author prefers name, which is the accessibility identifier; a class chain with an index breaks when a cell gains a child, the same as XPath, only cheaper.
In the author's example the test passed for three weeks, a developer wrapped a view in a FrameLayout, and an absolute XPath that encoded the entire hierarchy fell over; nobody touched the test and it still broke.
The stated rule behind the ranking: pick the attribute a developer set on purpose, avoid the one the render tree happened to produce.
An accessibilityIdentifier, an android:id, a testID and a Flutter Key are values someone typed, and they change when a human decides to change them.
Position in a hierarchy, sibling index and the class name of a wrapper change whenever the layout is refactored, a design system component is swapped, or an OS update renders a control differently.
Accessibility id is the top-ranked strategy: the same approach on both platforms, indexed by both drivers so lookups are fast, unique per screen by convention; content-desc on Android, accessibilityIdentifier on iOS, and Appium calls both "accessibility id".
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One practitioner account, concrete at mechanism level
The cluster rests on a single dev.to post by one author. Its strength is specificity: named attributes, runnable Appium calls in three client languages, exact failure triggers per tier, and correctly scoped framework caveats (React Native testID surfacing, Compose testTag plus testTagsAsResourceId). Its weakness is that nothing is independently corroborated, the prevalence framing is anecdotal, and the performance assertion carries no measurement.
No adoption signal in the cluster
The supplied source contains no release, deployment, benchmark, pricing, licensing or usage disclosure - no team counts, suite sizes, flake-rate before/after figures, or evidence that this ranking is used beyond the author's own practice. Nothing in the material supports an adoption measurement.
Mildly overstated on prevalence and speed
The prescriptive core is modest and mechanism-grounded, so the gap is small. It is positive rather than zero because two framings run ahead of the evidence offered: "a lot" of flaky mobile tests being locator debt is asserted from one anecdote, and native iOS queries being "materially faster" than XPath is asserted without any timing. The author also partly deflates his own pitch by conceding an indexed class chain fails on the same structural trigger as XPath, which keeps the overall overstatement limited.
Low commercial stake, no product being sold
The article promotes no paid product, service, vendor or employer; recommendations point at first-party platform attributes and built-in Appium/XCUITest/UiAutomator locator strategies, and the proposed fix (developers adding IDs) creates work rather than revenue for the author. The residual incentive is ordinary practitioner-blog reputation building on a developer publishing platform. No sponsorship or affiliation disclosure appears either way, which keeps this from scoring lower.
Moderate: durable mechanism, single unverified voice
Confidence is held mid-range: the technical substance is stable, low-volatility knowledge about platform attributes and locator resolution that is unlikely to be reversed, and it is internally consistent. But the cluster has one publisher, one author, zero corroboration, no adoption evidence, and two claims that the material cannot settle (flakiness prevalence and relative query speed).
build
Deltix's iOS agent only pays off if the successful run survives as a regression test1 distinct publisher
build
"Follow the same standard" is how mobile accessibility debt gets onto the books1 distinct publisher
build
FFmpegKit Extended's jump to FFmpeg 9.0.1 is an ABI break with features attached1 distinct publisher
build
A BLE reconnect callback is not readiness: model it as recovery or lose data quietly1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 26, 2026