From an XCUITest how can I check the on/off state of a UISwitch?

Viewed 8702

I recently ran into a situation where I needed to be able to check the current on/off state (NOT whether it is enabled for user interaction) of a UISwitch from within an existing bucket of XCUITests, not an XCTest, and toggle it to a pre-determined state. I had added app state restoration to an old existing app and this is now interfering with a number of existing testcases between runs that expected the UISwitches in particular default states.

Unlike XCTest, within XCUITest you do not have access to the UISwitch state directly.

How is this state determined in Objective-C for an XCUITest?

5 Answers

Swift 5 version:

XCTAssert((activationSwitch.value as? String) == "1")

Alternatively you can have a XCUIElement extension

import XCTest

extension XCUIElement {
    var isOn: Bool? {
        return (self.value as? String).map { $0 == "1" }
    }
}

// ...

XCTAssert(activationSwitch.isOn == true)

Define

extension XCUIElement {
    var isOn: Bool {
        (value as? String) == "1"
    }
}

Then

XCAssertTrue(someSwitch.isOn)

For Swift

Add an extension to XCUIElement assert directly switch isOn status.

extension XCUIElement {
    
    func assert(isOn: Bool) {
        guard let intValue = value as? String else {
            return XCTAssert(false, "The value of element could not cast to String")
        }
        
        XCTAssertEqual(intValue, isOn ? "1" : "0")
    }
}

Usage

yourSwitch.assert(isOn: true)

Swift 5: Not sure if this will be of use to anyone, but I've just started using XCTest, and based on @drshock's reply to this question I created a simple function that I added to my XCTestCase that turns a switch only when it's off.

    let app = XCUIApplication()

    func turnSwitchOnIfOff(id: String) {

        let myControl : NSString = app.switches.element(matching: .switch, identifier: id).value as! NSString

        if myControl == "0" {

            app.switches.element(matching: .switch, identifier: id).tap()

        }

    }

Then in my test when I want to turn a switch on if it's off I use this, where the id is the Identifier string from the switches Accessibility section.

    turnSwitchOnIfOff(id: "accessibilityIdentifierString")
Related