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

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")

Failing to find this anywhere obvious I happened upon this blog post for a similar situation for the Swift language. Xcode UITests: How to check if a UISwitch is on

With this information I tested and verified two approaches to solve my problem.

1) To assert if the state is on or off

XCUIElement *mySwitch = app.switches[@"My Switch Storyboard Accessibility Label"];
// cast .value to (NSString *) and test for @"0" if off state 
XCTAssertEqualObjects((NSString *)mySwitch.value, @"0", @"Switch should be off by default.");  // use @"1" to test for on state

2) To test if the state of the switch is on or off then toggle its state

XCUIElement *mySwitch = app.switches[@"My Switch Storyboard Accessibility Label"];
// cast .value to (NSString *) and test for @"0" if off state 
if (![(NSString *)mySwitch.value isEqualToString:@"0"])
        [mySwitch tap];  // tap if off if it is on

Using approach (2), I was able to force a default state for all UISwitches in between testcase runs and avoid the state restoration interference.


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)