Skip to content

axe drag fails on Xcode 26.5: FBSimulatorHIDEvent does not support touch move events #59

Open

Description

@dobby-d-elf

Summary

axe drag fails on this machine with:

Error: CLIError(errorDescription: "FBSimulatorHIDEvent does not support touch move events.")

This is with AXe 1.7.1, Xcode 26.5, and an iOS 26.5 simulator. axe swipe / XcodeBuildMCP swipe works, but axe drag fails before dispatch because FBSimulatorHIDEvent.touchMoveAtX:y: is not available at runtime.

Reproduction

Booted simulator:

iPhone 17, iOS 26.5, UDID D24248AD-73D5-43A8-8A8E-ED3F072D74C0

Command:

/Users/agent/.npm/_npx/99336612077b7094/node_modules/xcodebuildmcp/bundled/axe \
  drag \
  --start-x 201 \
  --start-y 477 \
  --end-x 201 \
  --end-y 529 \
  --duration 0.2 \
  --steps 10 \
  --udid D24248AD-73D5-43A8-8A8E-ED3F072D74C0

Observed:

Error: CLIError(errorDescription: "FBSimulatorHIDEvent does not support touch move events.")

Expected

axe drag should either perform a drag on supported simulator stacks or gracefully fall back / explain which Xcode or SimulatorKit versions support the required touch-move selector.

Environment

From xcodebuildmcp-doctor and local commands:

AXe: 1.7.1
XcodeBuildMCP: 2.6.2
Xcode: 26.5 (17F42)
macOS: 26.5 / Darwin 25.5.0
Architecture: arm64, Apple M1 Pro
Node: v26.3.0

Installed simulator runtimes:

iOS 26.4.1 (23E254a)
iOS 26.5 (23F77)

Notes

I traced the failure to Sources/AXe/Utilities/HIDInteractor.swift, where touchMoveEvent(x:y:) looks up the private class method:

NSSelectorFromString("touchMoveAtX:y:")

On this host, class_getClassMethod(FBSimulatorHIDEvent.self, selector) returns nil, causing the error above.

A possible workaround might be a fallback path using FBSimulatorHIDEvent.swipe(...) where appropriate, although that would not be equivalent to a true held touch-move drag for sliders or custom controls.

Activity

  1. coderabbitai commented on Jun 12, 2026

    @coderabbitai
    🔗 Related PRs

    #9 - Add tap by accessibility id/label [merged]
    #20 - fix(touch): make long press gestures reliable [merged]
    #39 - fix(describe-ui): Add point option support [merged]
    #44 - fix(commands): orientation-aware coords for both rotated devices and letterboxed landscape-only apps (#5) [merged]
    #49 - feat(drag): Add precision drag and slider commands [merged]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  2. the-simian commented on Jul 1, 2026

    @the-simian

    Reproducible with axe slider as well, and on an older Xcode than the report: Xcode 16.2 (16C5032a), macOS 14.6.1, AXe 1.7.1 via Homebrew, iPhone 16 Pro simulator on iOS 18.3. So this does not appear to be Xcode 26-specific.

    Repro with an open-source app

    The react-native-webrtc-kaleidoscope demo ships sliders that carry stable accessibility identifiers, which makes the failure easy to reproduce by id:

    git clone https://github.com/simiancraft/react-native-webrtc-kaleidoscope
    cd react-native-webrtc-kaleidoscope/demo
    npm install
    npm run ios          # expo run:ios against a booted simulator

    In the demo select Shaders > Sky > Dawn; the SKY panel exposes per-channel color sliders. Then:

    $ axe slider --id kld.clouds-dawn.sky.uSkyLowColor.r --value 10 --udid <udid>
    Error: CLIError(errorDescription: "FBSimulatorHIDEvent does not support touch move events.")

    Any slider reproduces it; this app just provides addressable ones.

    Where the error originates

    Sources/AXe/Utilities/HIDInteractor.swift: touchMoveEvent resolves touchMoveAtX:y: on FBSimulatorHIDEvent dynamically via NSSelectorFromString and throws this exact CLIError when the selector is missing. Both slider and drag route through performCompositeDrag (touch down, N touch moves, touch up), so both fail whenever the linked FBSimulatorControl build does not expose that method.

    A fix path that works today

    On the same machine the composite swipe event is fine: axe swipe along the slider's track (from the current thumb position, derived from the element's frame and AXValue, to the target fraction) moves the thumb reliably, and re-reading AXValue confirms it. Against the same slider:

    axe swipe --start-x 379 --start-y 484 --end-x 66 --end-y 484 --duration 0.5 --udid <udid>

    So one option is for performCompositeDrag to fall back to FBSimulatorHIDEvent.swipe(...) when touchMoveAtX:y: is unavailable; Slider.swift already polls AXValue after the drag, so the verification half of that path is in place.

    Happy to test a branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions