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)