Fix 23 failing UI tests: accessibility hierarchy, test mode, and interaction issues
App fixes: - Remove empty_state identifier from EmptyHomeView VStack (was overriding mood_header) - Fix resetAppState to set needsOnboarding=true (fresh state) instead of false - Set bypassSubscription explicitly based on launch arg presence (was defaulting to true in DEBUG) Test fixes: - TabBarScreen: use coordinate tap to avoid iOS 26 Liquid Glass hittability issues - SettingsScreen: use coordinate tap for segments, handle Settings label ambiguity with tab bar - EntryDetailScreen: use mood_button_ identifiers instead of label matching (was matching entry rows) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,6 @@ struct SettingsScreen {
|
||||
|
||||
var settingsHeader: XCUIElement { app.staticTexts["settings_header"] }
|
||||
var customizeSegment: XCUIElement { app.buttons["Customize"] }
|
||||
var settingsSegment: XCUIElement { app.buttons["Settings"] }
|
||||
var upgradeBanner: XCUIElement { app.otherElements["upgrade_banner"] }
|
||||
var subscribeButton: XCUIElement { app.buttons["subscribe_button"] }
|
||||
var whyUpgradeButton: XCUIElement { app.buttons["why_upgrade_button"] }
|
||||
@@ -26,24 +25,44 @@ struct SettingsScreen {
|
||||
// MARK: - Actions
|
||||
|
||||
func tapCustomizeTab() {
|
||||
customizeSegment.tapWhenReady()
|
||||
let segment = customizeSegment
|
||||
_ = segment.waitForExistence(timeout: 5)
|
||||
segment.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap()
|
||||
}
|
||||
|
||||
func tapSettingsTab() {
|
||||
settingsSegment.tapWhenReady()
|
||||
// Find the "Settings" segment in the segmented control (not the tab bar button).
|
||||
// Try segmentedControls first, then fall back to finding by exclusion.
|
||||
let segCtrl = app.segmentedControls.buttons["Settings"]
|
||||
if segCtrl.waitForExistence(timeout: 3) {
|
||||
segCtrl.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap()
|
||||
return
|
||||
}
|
||||
// Fallback: find a "Settings" button that is NOT the tab bar button
|
||||
let candidates = app.buttons.matching(NSPredicate(format: "label == 'Settings'")).allElementsBoundByIndex
|
||||
let tabBarBtn = app.tabBars.buttons["Settings"]
|
||||
for candidate in candidates where candidate.frame != tabBarBtn.frame {
|
||||
candidate.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func tapClearData() {
|
||||
clearDataButton.tapWhenReady()
|
||||
let button = clearDataButton
|
||||
if button.exists && !button.isHittable {
|
||||
app.swipeUp()
|
||||
}
|
||||
_ = button.waitForExistence(timeout: 5)
|
||||
button.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap()
|
||||
}
|
||||
|
||||
func tapAnalyticsToggle() {
|
||||
// Scroll down to find the toggle if needed
|
||||
let toggle = app.descendants(matching: .any).matching(identifier: "settings_analytics_toggle").firstMatch
|
||||
if !toggle.isHittable {
|
||||
let toggle = analyticsToggle
|
||||
if toggle.exists && !toggle.isHittable {
|
||||
app.swipeUp()
|
||||
}
|
||||
toggle.tapWhenReady()
|
||||
_ = toggle.waitForExistence(timeout: 5)
|
||||
toggle.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap()
|
||||
}
|
||||
|
||||
// MARK: - Assertions
|
||||
|
||||
Reference in New Issue
Block a user