From ba41866602abfadf078dee60fcb44efe8a3523c0 Mon Sep 17 00:00:00 2001 From: treyt Date: Wed, 18 Feb 2026 21:44:08 -0600 Subject: [PATCH] Fix flaky UI tests: increase calendar wait timeouts and disable parallel UI testing Calendar navigation buttons used shortTimeout (5s) which was too tight under simulator load, causing cascading failures in wizard and trip saving tests. Bumped to defaultTimeout (15s) and disabled parallel execution for UI tests. Co-Authored-By: Claude Opus 4.6 --- .../xcshareddata/xcschemes/SportsTime.xcscheme | 2 +- SportsTimeUITests/Framework/Screens.swift | 18 +++++++++--------- .../Tests/TripWizardFlowTests.swift | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/SportsTime.xcodeproj/xcshareddata/xcschemes/SportsTime.xcscheme b/SportsTime.xcodeproj/xcshareddata/xcschemes/SportsTime.xcscheme index fe5e1eb..f670ef8 100644 --- a/SportsTime.xcodeproj/xcshareddata/xcschemes/SportsTime.xcscheme +++ b/SportsTime.xcodeproj/xcshareddata/xcschemes/SportsTime.xcscheme @@ -43,7 +43,7 @@ + parallelizable = "NO"> targetIdx { previousMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - previousMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + previousMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } else if currentIdx < targetIdx { nextMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } else { break } } else { nextMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } } else { nextMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } monthAttempts += 1 } @@ -280,27 +280,27 @@ struct TripWizardScreen { let startFallback = dayCells.element(boundBy: 0) let endFallback = dayCells.element(boundBy: min(4, max(1, dayCells.count - 1))) startFallback.scrollIntoView(in: app.scrollViews.firstMatch) - startFallback.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + startFallback.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() endFallback.scrollIntoView(in: app.scrollViews.firstMatch) - endFallback.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + endFallback.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() return } // Select start date — scroll calendar grid into view first startBtn.scrollIntoView(in: app.scrollViews.firstMatch) - startBtn.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + startBtn.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() // Select end date let endBtn = dayButton(endDay) if endBtn.exists { endBtn.scrollIntoView(in: app.scrollViews.firstMatch) - endBtn.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + endBtn.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } else { let dayCells = app.buttons.matching(NSPredicate(format: "identifier BEGINSWITH 'wizard.dates.day.'")) guard dayCells.count > 1 else { return } let fallback = dayCells.element(boundBy: min(4, max(1, dayCells.count - 1))) fallback.scrollIntoView(in: app.scrollViews.firstMatch) - fallback.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + fallback.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } } diff --git a/SportsTimeUITests/Tests/TripWizardFlowTests.swift b/SportsTimeUITests/Tests/TripWizardFlowTests.swift index c4132eb..9ff83b2 100644 --- a/SportsTimeUITests/Tests/TripWizardFlowTests.swift +++ b/SportsTimeUITests/Tests/TripWizardFlowTests.swift @@ -92,7 +92,7 @@ final class TripWizardFlowTests: BaseUITestCase { // Navigate forward 3 times for _ in 0..<3 { wizard.nextMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - wizard.nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + wizard.nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } // Month label should have changed @@ -113,14 +113,14 @@ final class TripWizardFlowTests: BaseUITestCase { // Go forward 3 months for _ in 0..<3 { wizard.nextMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - wizard.nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + wizard.nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() } let afterForward = wizard.monthLabel.label // Go back 1 month wizard.previousMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) - wizard.previousMonthButton.waitUntilHittable(timeout: BaseUITestCase.shortTimeout).tap() + wizard.previousMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() XCTAssertNotEqual(wizard.monthLabel.label, afterForward, "Month should change after navigating backward")