Skip to content

SwiftUI.Tab accessibilityIdentifier is not surfaced on native tab targets #442

@dpearson2699

Description

@dpearson2699

Summary

XcodeBuildMCP v2.6.1 fixed the important tab automation issue: native UITabBar items are now discoverable and tappable through snapshot-ui. I verified this with XcodeBuildMCP 2.6.2.

There may still be a smaller SwiftUI identifier propagation issue: an .accessibilityIdentifier(...) applied to a SwiftUI.Tab(...) does not appear on the native tab target emitted by snapshot-ui.

This is not blocking automation, because agents can target tabs by role=tab plus visible label. I am filing this as a maybe-bug / enhancement request to clarify whether the identifier can be surfaced or whether this is expected SwiftUI/UIKit behavior.

Example SwiftUI shape

TabView(selection: $selectedTab) {
    SwiftUI.Tab("Wheels", systemImage: "arrow.trianglehead.2.clockwise", value: Tab.wheels) {
        NavigationStack {
            WheelsView()
        }
        .accessibilityIdentifier("screen_wheels")
    }
    .accessibilityLabel("Wheels")
    .accessibilityIdentifier("tab_wheels")
}

Observed snapshot-ui behavior

The native tab item is discovered and tappable, but the identifier field is empty:

eNN|tap|tab|Dashboard|1|
eNN|tap|tab|Wheels|0|
eNN|tap|tab|Positions|0|
eNN|tap|tab|Spec Trades|0|
eNN|tap|tab|Trade Log|0|

Tapping the Wheels tab element reference works and changes to the Wheels screen.

Expected or requested behavior

If SwiftUI forwards the identifier in a way XcodeBuildMCP can observe, it would be useful for snapshot-ui to surface tab_wheels on the native tab target.

If SwiftUI does not forward that identifier to the underlying UITabBarItem, documentation confirming that tab automation should use role + label would also resolve the ambiguity.

Environment

  • XcodeBuildMCP: 2.6.2
  • Relevant fix already present: v2.6.1 tab bar item discovery fix
  • App UI: SwiftUI TabView using SwiftUI.Tab

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions