feat(ios-qa): add XCUITest execution-plan module

Standalone planner that turns the IOSQAFlow JSON contract into an
xcodebuild XCUITest invocation for simulator or physical device, using
semantic selectors (identifier/role/label) and no coordinate taps.
Pure plan generation; covered by 7 unit tests.

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 a84a6e233d
commit 466b1ec744
6 changed files with 369 additions and 0 deletions
@@ -0,0 +1,49 @@
{
"version": 1,
"name": "swiftui-gallery-smoke",
"bundleIdentifier": "com.gstack.iosqa.adaptive.swiftui",
"steps": [
{ "id": "launch", "action": "launch" },
{
"id": "increment",
"action": "tap",
"selector": { "identifier": "swiftui.increment", "label": "Increment", "role": "button" },
"verify": {
"kind": "labelEquals",
"selector": { "identifier": "swiftui.count", "role": "staticText" },
"value": "Count: 1"
}
},
{
"id": "search",
"action": "typeText",
"selector": { "identifier": "swiftui.search", "label": "Search terms", "role": "textField" },
"text": "adaptive",
"verify": {
"kind": "labelEquals",
"selector": { "identifier": "swiftui.echo", "role": "staticText" },
"value": "Echo: adaptive"
}
},
{
"id": "open-sheet",
"action": "tap",
"selector": { "identifier": "swiftui.sheet.open", "role": "button" },
"verify": {
"kind": "exists",
"selector": { "identifier": "swiftui.sheet.content" },
"timeoutMs": 2000
}
},
{
"id": "close-sheet",
"action": "tap",
"selector": { "identifier": "swiftui.sheet.done", "role": "button" },
"verify": {
"kind": "notExists",
"selector": { "identifier": "swiftui.sheet.content" },
"timeoutMs": 2000
}
}
]
}