From 12ee1e110501b2bf63c110e758a95a75cf533139 Mon Sep 17 00:00:00 2001 From: Stuart Minchington Date: Wed, 25 Mar 2026 17:35:09 -0700 Subject: [PATCH 1/2] First pass of the agent creating XCUITests using POM and it worked --- Features.xcodeproj/project.pbxproj | 48 +++++++++ .../UserInterfaceState.xcuserstate | Bin 52210 -> 57210 bytes Features/APICallsView.swift | 4 + Features/AlertView.swift | 1 + Features/TextFieldView.swift | 11 ++- FeaturesUITests/FeaturesUITests.swift | 57 +---------- FeaturesUITests/Screens/APICallsScreen.swift | 46 +++++++++ FeaturesUITests/Screens/AlertScreen.swift | 21 ++++ FeaturesUITests/Screens/HomeScreen.swift | 29 ++++++ FeaturesUITests/Screens/TextFieldScreen.swift | 21 ++++ .../Tests/APICallsScreenTests.swift | 27 ++++++ FeaturesUITests/Tests/AlertScreenTests.swift | 20 ++++ FeaturesUITests/Tests/BaseUITestCase.swift | 18 ++++ .../Tests/TextFieldScreenTests.swift | 20 ++++ SKILL.md | 91 ++++++++++++++++++ 15 files changed, 359 insertions(+), 55 deletions(-) create mode 100644 FeaturesUITests/Screens/APICallsScreen.swift create mode 100644 FeaturesUITests/Screens/AlertScreen.swift create mode 100644 FeaturesUITests/Screens/HomeScreen.swift create mode 100644 FeaturesUITests/Screens/TextFieldScreen.swift create mode 100644 FeaturesUITests/Tests/APICallsScreenTests.swift create mode 100644 FeaturesUITests/Tests/AlertScreenTests.swift create mode 100644 FeaturesUITests/Tests/BaseUITestCase.swift create mode 100644 FeaturesUITests/Tests/TextFieldScreenTests.swift create mode 100644 SKILL.md diff --git a/Features.xcodeproj/project.pbxproj b/Features.xcodeproj/project.pbxproj index 93c7b00..51d73e7 100644 --- a/Features.xcodeproj/project.pbxproj +++ b/Features.xcodeproj/project.pbxproj @@ -32,6 +32,14 @@ 64A6131A2CD56A5F00FC2BF2 /* APICallsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A613192CD56A5F00FC2BF2 /* APICallsView.swift */; }; 64DA2B6B2C741B820025D34B /* TextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DA2B6A2C741B820025D34B /* TextFieldView.swift */; }; 64F102DB2C98913D00EE2E47 /* ApplePayButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64F102DA2C98913D00EE2E47 /* ApplePayButtonView.swift */; }; + A1B2C3012F70000100AA0001 /* BaseUITestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0001 /* BaseUITestCase.swift */; }; + A1B2C3012F70000100AA0002 /* HomeScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0002 /* HomeScreen.swift */; }; + A1B2C3012F70000100AA0003 /* AlertScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0003 /* AlertScreen.swift */; }; + A1B2C3012F70000100AA0004 /* TextFieldScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0004 /* TextFieldScreen.swift */; }; + A1B2C3012F70000100AA0005 /* APICallsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0005 /* APICallsScreen.swift */; }; + A1B2C3012F70000100AA0006 /* AlertScreenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0006 /* AlertScreenTests.swift */; }; + A1B2C3012F70000100AA0007 /* TextFieldScreenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0007 /* TextFieldScreenTests.swift */; }; + A1B2C3012F70000100AA0008 /* APICallsScreenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3112F70000100AA0008 /* APICallsScreenTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -80,6 +88,14 @@ 64A613192CD56A5F00FC2BF2 /* APICallsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APICallsView.swift; sourceTree = ""; }; 64DA2B6A2C741B820025D34B /* TextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldView.swift; sourceTree = ""; }; 64F102DA2C98913D00EE2E47 /* ApplePayButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePayButtonView.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0001 /* BaseUITestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseUITestCase.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0002 /* HomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreen.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0003 /* AlertScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertScreen.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0004 /* TextFieldScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldScreen.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0005 /* APICallsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APICallsScreen.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0006 /* AlertScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertScreenTests.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0007 /* TextFieldScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldScreenTests.swift; sourceTree = ""; }; + A1B2C3112F70000100AA0008 /* APICallsScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APICallsScreenTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,12 +192,36 @@ children = ( 532E1C392F2B0F800074BEC8 /* Info.plist */, 647416CB2D0A1F7300D0E1A8 /* TestHelpers.swift */, + A1B2C3212F70000100AA0001 /* Screens */, + A1B2C3212F70000100AA0002 /* Tests */, 17E30DC92C03922500E60561 /* FeaturesUITests.swift */, 17E30DCB2C03922500E60561 /* FeaturesUITestsLaunchTests.swift */, ); path = FeaturesUITests; sourceTree = ""; }; + A1B2C3212F70000100AA0001 /* Screens */ = { + isa = PBXGroup; + children = ( + A1B2C3112F70000100AA0002 /* HomeScreen.swift */, + A1B2C3112F70000100AA0003 /* AlertScreen.swift */, + A1B2C3112F70000100AA0004 /* TextFieldScreen.swift */, + A1B2C3112F70000100AA0005 /* APICallsScreen.swift */, + ); + path = Screens; + sourceTree = ""; + }; + A1B2C3212F70000100AA0002 /* Tests */ = { + isa = PBXGroup; + children = ( + A1B2C3112F70000100AA0001 /* BaseUITestCase.swift */, + A1B2C3112F70000100AA0006 /* AlertScreenTests.swift */, + A1B2C3112F70000100AA0007 /* TextFieldScreenTests.swift */, + A1B2C3112F70000100AA0008 /* APICallsScreenTests.swift */, + ); + path = Tests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -348,6 +388,14 @@ buildActionMask = 2147483647; files = ( 175423962C03E52B00310374 /* WebView.swift in Sources */, + A1B2C3012F70000100AA0001 /* BaseUITestCase.swift in Sources */, + A1B2C3012F70000100AA0002 /* HomeScreen.swift in Sources */, + A1B2C3012F70000100AA0003 /* AlertScreen.swift in Sources */, + A1B2C3012F70000100AA0004 /* TextFieldScreen.swift in Sources */, + A1B2C3012F70000100AA0005 /* APICallsScreen.swift in Sources */, + A1B2C3012F70000100AA0006 /* AlertScreenTests.swift in Sources */, + A1B2C3012F70000100AA0007 /* TextFieldScreenTests.swift in Sources */, + A1B2C3012F70000100AA0008 /* APICallsScreenTests.swift in Sources */, 17E30DCC2C03922500E60561 /* FeaturesUITestsLaunchTests.swift in Sources */, 17E30DCA2C03922500E60561 /* FeaturesUITests.swift in Sources */, 647416CC2D0A1F7900D0E1A8 /* TestHelpers.swift in Sources */, diff --git a/Features.xcodeproj/project.xcworkspace/xcuserdata/stuart.minchington@saucelabs.com.xcuserdatad/UserInterfaceState.xcuserstate b/Features.xcodeproj/project.xcworkspace/xcuserdata/stuart.minchington@saucelabs.com.xcuserdatad/UserInterfaceState.xcuserstate index 1657031f5e450bfa7c2e873490372ed187939f9e..d02c2ed611bb9e78bdd55f9fac252c51e0b42e40 100644 GIT binary patch literal 57210 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 diff --git a/Features/APICallsView.swift b/Features/APICallsView.swift index 5e3c8d2..020629d 100644 --- a/Features/APICallsView.swift +++ b/Features/APICallsView.swift @@ -18,9 +18,12 @@ struct APICallsView: View { VStack(spacing: 20) { Text("Request Status") .font(.headline) + .accessibilityIdentifier("api.statusHeader") Text("Success: \(successCount) / 25") + .accessibilityIdentifier("api.successLabel") Text("Failures: \(failureCount) / 25") + .accessibilityIdentifier("api.failureLabel") Button(action: { sendRequests() @@ -31,6 +34,7 @@ struct APICallsView: View { .foregroundColor(.white) .cornerRadius(10) } + .accessibilityIdentifier("api.sendRequestsButton") .disabled(isRequesting) } .padding() diff --git a/Features/AlertView.swift b/Features/AlertView.swift index 137089f..199f207 100644 --- a/Features/AlertView.swift +++ b/Features/AlertView.swift @@ -15,6 +15,7 @@ struct AlertView: View { Button("Generate Alert") { showingAlert = true } + .accessibilityIdentifier("alerts.generateButton") .padding() .background(Color(red: 0, green: 0, blue: 0.5)) .foregroundStyle(.white) diff --git a/Features/TextFieldView.swift b/Features/TextFieldView.swift index eb195af..f013315 100644 --- a/Features/TextFieldView.swift +++ b/Features/TextFieldView.swift @@ -2,6 +2,7 @@ import SwiftUI struct TextFieldView: View { @State private var inputText = "" + @State private var submittedText = "" @State private var showBanner = false @Environment(\.presentationMode) var presentationMode @@ -11,19 +12,27 @@ struct TextFieldView: View { TextField("Enter your text here", text: $inputText) .textFieldStyle(.roundedBorder) .padding() + .accessibilityIdentifier("text.inputField") Button("Submit") { - // Handle the submitted text here + submittedText = inputText print("Submitted text: \(inputText)") } + .accessibilityIdentifier("text.submitButton") .padding() .background(Color(red: 0, green: 0, blue: 0.5)) .foregroundStyle(.white) .clipShape(Capsule()) + if !submittedText.isEmpty { + Text("Submitted: \(submittedText)") + .accessibilityIdentifier("text.submittedValueLabel") + } + Button("Back") { presentationMode.wrappedValue.dismiss() } + .accessibilityIdentifier("text.backButton") .padding() .background(Color(red: 0.5, green: 0, blue: 0)) .foregroundStyle(.white) diff --git a/FeaturesUITests/FeaturesUITests.swift b/FeaturesUITests/FeaturesUITests.swift index 2db3d44..036a8c2 100644 --- a/FeaturesUITests/FeaturesUITests.swift +++ b/FeaturesUITests/FeaturesUITests.swift @@ -8,59 +8,8 @@ import XCTest final class FeaturesUITests: XCTestCase { - var app: XCUIApplication! - - override func setUpWithError() throws { - try super.setUpWithError() - continueAfterFailure = false - - app = XCUIApplication() - app.launch() - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testGenerateAlert() throws { - let app = XCUIApplication() - app.collectionViews.staticTexts["Alerts"].tap() - app.buttons["Generate Alert"].tap() - app.buttons["OK"].tap() - } - - func testTypeText() throws { - let app = XCUIApplication() - app.collectionViews/*@START_MENU_TOKEN@*/.staticTexts["Text"]/*[[".cells",".buttons[\"Text\"].staticTexts[\"Text\"]",".staticTexts[\"Text\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.tap() - app.textFields["Enter your text here"].tap() - app.typeText("Using standard typeText") - app.buttons["Submit"].tap() - } - - - func testSetText() throws { - let app = XCUIApplication() - app.collectionViews/*@START_MENU_TOKEN@*/.staticTexts["Text"]/*[[".cells",".buttons[\"Text\"].staticTexts[\"Text\"]",".staticTexts[\"Text\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.tap() - //sleep(1) - app.textFields["Enter your text here"].setText("Using setText", doubleTap: false) - app.buttons["Submit"].tap() - } - - - - func testAPICalls() throws { - let app = XCUIApplication() - app.collectionViews.staticTexts["Network Capture"].tap() - app.buttons["Send 25 GET Requests"].tap() - - let successLabel = app.staticTexts["Success: 25 / 25"] - - // Wait for up to 30 seconds until the success label appears - let exists = NSPredicate(format: "exists == true") - expectation(for: exists, evaluatedWith: successLabel, handler: nil) - waitForExpectations(timeout: 30, handler: nil) - - // Verify the success label or other elements if necessary - XCTAssertTrue(successLabel.exists, "The success label did not appear within the timeout period.") + func testLegacySuiteMigrated() { + // Tests are now organized in FeaturesUITests/Screens and FeaturesUITests/Tests. + XCTAssertTrue(true) } } diff --git a/FeaturesUITests/Screens/APICallsScreen.swift b/FeaturesUITests/Screens/APICallsScreen.swift new file mode 100644 index 0000000..c2ac04b --- /dev/null +++ b/FeaturesUITests/Screens/APICallsScreen.swift @@ -0,0 +1,46 @@ +import XCTest + +final class APICallsScreen { + static let shared = APICallsScreen() + + private let app = XCUIApplication() + + private init() {} + + var sendRequestsButton: XCUIElement { app.buttons["api.sendRequestsButton"] } + var successLabel: XCUIElement { app.staticTexts["api.successLabel"] } + var failureLabel: XCUIElement { app.staticTexts["api.failureLabel"] } + + func startRequests() async { + sendRequestsButton.tap() + } + + func waitUntilRequestsComplete(timeout: TimeInterval) -> Bool { + let predicate = NSPredicate(format: "isEnabled == true") + let expectation = XCTNSPredicateExpectation(predicate: predicate, object: sendRequestsButton) + return XCTWaiter.wait(for: [expectation], timeout: timeout) == .completed + } + + func parsedRequestCounts() -> (success: Int, failure: Int)? { + guard + let successText = successLabel.label.split(separator: ":").dropFirst().first, + let failureText = failureLabel.label.split(separator: ":").dropFirst().first + else { + return nil + } + + let successValue = successText.trimmingCharacters(in: .whitespaces).split(separator: " ").first + let failureValue = failureText.trimmingCharacters(in: .whitespaces).split(separator: " ").first + + guard + let successString = successValue, + let failureString = failureValue, + let success = Int(successString), + let failure = Int(failureString) + else { + return nil + } + + return (success, failure) + } +} diff --git a/FeaturesUITests/Screens/AlertScreen.swift b/FeaturesUITests/Screens/AlertScreen.swift new file mode 100644 index 0000000..f163f4f --- /dev/null +++ b/FeaturesUITests/Screens/AlertScreen.swift @@ -0,0 +1,21 @@ +import XCTest + +final class AlertScreen { + static let shared = AlertScreen() + + private let app = XCUIApplication() + + private init() {} + + var generateAlertButton: XCUIElement { app.buttons["alerts.generateButton"] } + var alert: XCUIElement { app.alerts["Alert Title"] } + var alertOKButton: XCUIElement { app.alerts["Alert Title"].buttons["OK"] } + + func generateAlert() async { + generateAlertButton.tap() + } + + func dismissAlertWithOK() async { + alertOKButton.tap() + } +} diff --git a/FeaturesUITests/Screens/HomeScreen.swift b/FeaturesUITests/Screens/HomeScreen.swift new file mode 100644 index 0000000..733c6bf --- /dev/null +++ b/FeaturesUITests/Screens/HomeScreen.swift @@ -0,0 +1,29 @@ +import XCTest + +final class HomeScreen { + static let shared = HomeScreen() + + private let app = XCUIApplication() + + private init() {} + + func featureItem(_ identifier: String) -> XCUIElement { + app.descendants(matching: .any).matching(identifier: identifier).firstMatch + } + + var alertsItem: XCUIElement { featureItem("Alerts") } + var textItem: XCUIElement { featureItem("Text") } + var networkCaptureItem: XCUIElement { featureItem("Network Capture") } + + func openAlerts() async { + alertsItem.tap() + } + + func openText() async { + textItem.tap() + } + + func openNetworkCapture() async { + networkCaptureItem.tap() + } +} diff --git a/FeaturesUITests/Screens/TextFieldScreen.swift b/FeaturesUITests/Screens/TextFieldScreen.swift new file mode 100644 index 0000000..9dd70df --- /dev/null +++ b/FeaturesUITests/Screens/TextFieldScreen.swift @@ -0,0 +1,21 @@ +import XCTest + +final class TextFieldScreen { + static let shared = TextFieldScreen() + + private let app = XCUIApplication() + + private init() {} + + var inputField: XCUIElement { app.textFields["text.inputField"] } + var submitButton: XCUIElement { app.buttons["text.submitButton"] } + var submittedValueLabel: XCUIElement { app.staticTexts["text.submittedValueLabel"] } + + func enterText(_ text: String) async { + inputField.setText(text, doubleTap: false) + } + + func submit() async { + submitButton.tap() + } +} diff --git a/FeaturesUITests/Tests/APICallsScreenTests.swift b/FeaturesUITests/Tests/APICallsScreenTests.swift new file mode 100644 index 0000000..b70a150 --- /dev/null +++ b/FeaturesUITests/Tests/APICallsScreenTests.swift @@ -0,0 +1,27 @@ +import XCTest + +final class APICallsScreenTests: BaseUITestCase { + private let homeScreen = HomeScreen.shared + private let apiCallsScreen = APICallsScreen.shared + + func testRequestsCompleteWithExpectedTotal() async throws { + XCTAssertTrue(waitForExists(homeScreen.networkCaptureItem, message: "Network Capture feature is not visible on home screen.")) + await homeScreen.openNetworkCapture() + + XCTAssertTrue(waitForExists(apiCallsScreen.sendRequestsButton, message: "Send requests button is missing.")) + await apiCallsScreen.startRequests() + + let completed = apiCallsScreen.waitUntilRequestsComplete(timeout: 40) + XCTAssertTrue(completed, "Requests did not complete within timeout.") + + XCTAssertTrue(waitForExists(apiCallsScreen.successLabel, message: "Success label is missing.")) + XCTAssertTrue(waitForExists(apiCallsScreen.failureLabel, message: "Failure label is missing.")) + + guard let counts = apiCallsScreen.parsedRequestCounts() else { + XCTFail("Unable to parse success/failure counts from labels.") + return + } + + XCTAssertEqual(counts.success + counts.failure, 25, "Total completed requests should always be 25.") + } +} diff --git a/FeaturesUITests/Tests/AlertScreenTests.swift b/FeaturesUITests/Tests/AlertScreenTests.swift new file mode 100644 index 0000000..4745e7a --- /dev/null +++ b/FeaturesUITests/Tests/AlertScreenTests.swift @@ -0,0 +1,20 @@ +import XCTest + +final class AlertScreenTests: BaseUITestCase { + private let homeScreen = HomeScreen.shared + private let alertScreen = AlertScreen.shared + + func testGenerateAndDismissAlert() async throws { + XCTAssertTrue(waitForExists(homeScreen.alertsItem, message: "Alerts feature is not visible on home screen.")) + await homeScreen.openAlerts() + + XCTAssertTrue(waitForExists(alertScreen.generateAlertButton, message: "Generate Alert button was not found.")) + await alertScreen.generateAlert() + + XCTAssertTrue(waitForExists(alertScreen.alert, timeout: 3, message: "Alert did not appear.")) + XCTAssertTrue(waitForExists(alertScreen.alertOKButton, message: "OK button is missing from alert.")) + + await alertScreen.dismissAlertWithOK() + XCTAssertFalse(alertScreen.alert.exists, "Alert should be dismissed after tapping OK.") + } +} diff --git a/FeaturesUITests/Tests/BaseUITestCase.swift b/FeaturesUITests/Tests/BaseUITestCase.swift new file mode 100644 index 0000000..8267920 --- /dev/null +++ b/FeaturesUITests/Tests/BaseUITestCase.swift @@ -0,0 +1,18 @@ +import XCTest + +class BaseUITestCase: XCTestCase { + let app = XCUIApplication() + + override func setUpWithError() throws { + try super.setUpWithError() + continueAfterFailure = false + app.launch() + } + + @discardableResult + func waitForExists(_ element: XCUIElement, timeout: TimeInterval = 5, message: String) -> Bool { + let exists = element.waitForExistence(timeout: timeout) + XCTAssertTrue(exists, message) + return exists + } +} diff --git a/FeaturesUITests/Tests/TextFieldScreenTests.swift b/FeaturesUITests/Tests/TextFieldScreenTests.swift new file mode 100644 index 0000000..bc330ff --- /dev/null +++ b/FeaturesUITests/Tests/TextFieldScreenTests.swift @@ -0,0 +1,20 @@ +import XCTest + +final class TextFieldScreenTests: BaseUITestCase { + private let homeScreen = HomeScreen.shared + private let textFieldScreen = TextFieldScreen.shared + + func testSubmitTextShowsConfirmation() async throws { + let valueToSubmit = "Using page objects" + + XCTAssertTrue(waitForExists(homeScreen.textItem, message: "Text feature is not visible on home screen.")) + await homeScreen.openText() + + XCTAssertTrue(waitForExists(textFieldScreen.inputField, message: "Text input field was not found.")) + await textFieldScreen.enterText(valueToSubmit) + await textFieldScreen.submit() + + XCTAssertTrue(waitForExists(textFieldScreen.submittedValueLabel, timeout: 3, message: "Submitted value label did not appear.")) + XCTAssertEqual(textFieldScreen.submittedValueLabel.label, "Submitted: \(valueToSubmit)") + } +} diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..d3a296a --- /dev/null +++ b/SKILL.md @@ -0,0 +1,91 @@ +# Sauce Labs Skill with XCUITest + +Always create and execute tests using the XCUITest framework. + +## Page Object + +All generated tests must follow this folder layout: +Features/ + FeaturesUITests/ + Screens/ → Contains all Page Object classes + Tests/ → Contains all Test classes and scripts + +| Type | Naming Convention | +|------|-------------| +| Page Object file | SomethingScreen.swift | +| Class Name | SomethingScreen | +| Test file | SomethingTests.swift | + +### Screen Structure + +Each screen must: +- Be a class. +- Expose elements via getters. +- Expose actions as async methods. +- Be exported as a singleton. + +### Selectors + +Rules: +- Prefer accessibility IDs. +- Avoid XPath unless no alternative exists. +- If all else fails, use whatever selector is necessary to uniquely identify the element. + + +## Sauce Labs Reference +Refer to the following Sauce Labs documentation for guidance on creating the saucectl YAML configuration for XCUITest: https://docs.saucelabs.com/mobile-apps/automated-testing/espresso-xcuitest/xcuitest/#example-configuration +- Configuring the Sauce Labs Real Device Cloud (RDC) capabilities. +- Implementing the RDC advanced functionality. + + + +## Self‑Checklist for Test Generation + +Before outputting any test, the agent must verify all items below: + +Structure +[ ] Did I place Page Objects in test/screens? + +[ ] Did I place test specs in test/specs? + +[ ] Did I use correct naming conventions (SomethingScreen.js, something.spec.js)? + + +Page Objects +[ ] Did I create a class with getters for elements? + +[ ] Did I export a singleton (export default new XScreen();)? + +[ ] Did I avoid putting test logic inside Page Objects? + + +Selectors +[ ] Did I use accessibility IDs (~id)? + +[ ] Did I avoid XPath unless absolutely required? + + +Test Logic +[ ] Did I import the correct Page Objects? + +[ ] Did I use describe and it with Mocha? + +[ ] Did I use async/await for all WDIO commands? + +[ ] Did I include explicit waits (waitForDisplayed, waitUntil)? + + +Sauce Labs +[ ] Did I assume cloud execution? + +[ ] Did I avoid generating local Appium configs? + +[ ] Did I use iOS + XCUITest capabilities when needed? + + +Quality +[ ] Is the test deterministic (no race conditions)? + +[ ] Is the test readable and minimal? + +[ ] Does the test follow the same style as existing examples? From 361adcc537fff7f3e48ed571d591b2990d59b1f6 Mon Sep 17 00:00:00 2001 From: Stuart Minchington Date: Fri, 7 Aug 2026 16:37:50 -0700 Subject: [PATCH 2/2] Backtrace Update --- SKILL.md | 91 ------------------------------------------------ Secrets.xcconfig | 2 +- 2 files changed, 1 insertion(+), 92 deletions(-) delete mode 100644 SKILL.md diff --git a/SKILL.md b/SKILL.md deleted file mode 100644 index d3a296a..0000000 --- a/SKILL.md +++ /dev/null @@ -1,91 +0,0 @@ -# Sauce Labs Skill with XCUITest - -Always create and execute tests using the XCUITest framework. - -## Page Object - -All generated tests must follow this folder layout: -Features/ - FeaturesUITests/ - Screens/ → Contains all Page Object classes - Tests/ → Contains all Test classes and scripts - -| Type | Naming Convention | -|------|-------------| -| Page Object file | SomethingScreen.swift | -| Class Name | SomethingScreen | -| Test file | SomethingTests.swift | - -### Screen Structure - -Each screen must: -- Be a class. -- Expose elements via getters. -- Expose actions as async methods. -- Be exported as a singleton. - -### Selectors - -Rules: -- Prefer accessibility IDs. -- Avoid XPath unless no alternative exists. -- If all else fails, use whatever selector is necessary to uniquely identify the element. - - -## Sauce Labs Reference -Refer to the following Sauce Labs documentation for guidance on creating the saucectl YAML configuration for XCUITest: https://docs.saucelabs.com/mobile-apps/automated-testing/espresso-xcuitest/xcuitest/#example-configuration -- Configuring the Sauce Labs Real Device Cloud (RDC) capabilities. -- Implementing the RDC advanced functionality. - - - -## Self‑Checklist for Test Generation - -Before outputting any test, the agent must verify all items below: - -Structure -[ ] Did I place Page Objects in test/screens? - -[ ] Did I place test specs in test/specs? - -[ ] Did I use correct naming conventions (SomethingScreen.js, something.spec.js)? - - -Page Objects -[ ] Did I create a class with getters for elements? - -[ ] Did I export a singleton (export default new XScreen();)? - -[ ] Did I avoid putting test logic inside Page Objects? - - -Selectors -[ ] Did I use accessibility IDs (~id)? - -[ ] Did I avoid XPath unless absolutely required? - - -Test Logic -[ ] Did I import the correct Page Objects? - -[ ] Did I use describe and it with Mocha? - -[ ] Did I use async/await for all WDIO commands? - -[ ] Did I include explicit waits (waitForDisplayed, waitUntil)? - - -Sauce Labs -[ ] Did I assume cloud execution? - -[ ] Did I avoid generating local Appium configs? - -[ ] Did I use iOS + XCUITest capabilities when needed? - - -Quality -[ ] Is the test deterministic (no race conditions)? - -[ ] Is the test readable and minimal? - -[ ] Does the test follow the same style as existing examples? diff --git a/Secrets.xcconfig b/Secrets.xcconfig index 8b80259..9c348d4 100644 --- a/Secrets.xcconfig +++ b/Secrets.xcconfig @@ -9,4 +9,4 @@ // https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project // Make a copy named Secrets.xcconfig, add your Backtrace specific info, then add to your .gitignore file -BACKTRACE_SUBMISSION_URL = https://submit.backtrace.io/sl-7021d636ac504cc38fa89cdcdab5551e/b02797d62c48648433e8ccfcb1f1d06d24a592f2d1d9f227fc3015b38157d982/plcrash +BACKTRACE_SUBMISSION_URL = https://submit.backtrace.io/sl-f8eccdf81c62461c852e6c906f777124/7f9251d576fedc28db9bab682ae5b593b394e1526dcb8149ee16e7fcded67773/plcrash