feat(ios-qa): adaptive XCUITest runner that reaches nested controls and verifies taps

JSON-driven XCUITest runner plus SwiftUI/UIKit fixture apps that drive a
real app by bundle id. The runner resolves the actual switch inside a
SwiftUI Toggle wrapper, and when a center tap misses the full-width row it
retries on the control's trailing edge via an element-anchored normalized
offset (adaptive, not a raw screen coordinate), then verifies the switch
value actually changed. A tap that silently does nothing is now reported
as an interaction failure, not a false product defect. Validated on the
simulator and on a physical iPhone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sinabina
2026-07-21 14:19:14 -07:00
co-authored by Claude Opus 4.8
parent 466b1ec744
commit c2ac1f32c0
7 changed files with 613 additions and 0 deletions
+70
View File
@@ -47,3 +47,73 @@ targets:
SWIFT_VERSION: "5.9"
IPHONEOS_DEPLOYMENT_TARGET: "16.0"
ENABLE_PREVIEWS: YES
AdaptiveSwiftUIFixture:
type: application
platform: iOS
deploymentTarget: "16.0"
sources:
- path: Sources/AdaptiveSwiftUIFixture
info:
path: Sources/AdaptiveSwiftUIFixture/Info.plist
properties:
CFBundleDisplayName: SwiftUI QA Gallery
UILaunchScreen: {}
UISupportedInterfaceOrientations: [UIInterfaceOrientationPortrait]
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.gstack.iosqa.adaptive.swiftui
CODE_SIGNING_ALLOWED: NO
TARGETED_DEVICE_FAMILY: "1"
SWIFT_VERSION: "5.9"
AdaptiveUIKitFixture:
type: application
platform: iOS
deploymentTarget: "16.0"
sources:
- path: Sources/AdaptiveUIKitFixture
info:
path: Sources/AdaptiveUIKitFixture/Info.plist
properties:
CFBundleDisplayName: UIKit QA Gallery
UILaunchScreen: {}
UISupportedInterfaceOrientations: [UIInterfaceOrientationPortrait]
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.gstack.iosqa.adaptive.uikit
CODE_SIGNING_ALLOWED: NO
TARGETED_DEVICE_FAMILY: "1"
SWIFT_VERSION: "5.9"
AdaptiveFixtureUITests:
type: bundle.ui-testing
platform: iOS
deploymentTarget: "16.0"
sources:
- path: Tests/AdaptiveFixtureUITests
dependencies:
- target: AdaptiveSwiftUIFixture
- target: AdaptiveUIKitFixture
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.gstack.iosqa.adaptive.uitests
GENERATE_INFOPLIST_FILE: YES
CODE_SIGNING_ALLOWED: NO
SWIFT_VERSION: "5.9"
schemes:
AdaptiveFixtureUITests:
build:
targets:
AdaptiveSwiftUIFixture: all
AdaptiveUIKitFixture: all
AdaptiveFixtureUITests: [test]
test:
config: Debug
targets:
- AdaptiveFixtureUITests
environmentVariables:
GSTACK_IOS_QA_FLOW_PATH: $(GSTACK_IOS_QA_FLOW_PATH_VALUE)
GSTACK_IOS_QA_FLOW_JSON_BASE64: $(GSTACK_IOS_QA_FLOW_JSON_BASE64_VALUE)
GSTACK_IOS_QA_TARGET_KIND: $(GSTACK_IOS_QA_TARGET_KIND_VALUE)