Objective c 如何从XCUITest检查UI开关的开/关状态?

Objective c 如何从XCUITest检查UI开关的开/关状态?,objective-c,xcode-ui-testing,uiswitch,Objective C,Xcode Ui Testing,Uiswitch,我最近遇到了这样一种情况:我需要能够从现有的XUITest(而不是XTest)bucket中检查UISwitch的当前开/关状态(而不是是否为用户交互启用),并将其切换到预先确定的状态。我已经将应用程序状态恢复添加到了一个旧的现有应用程序中,这现在干扰了一些在运行之间的现有测试用例,这些测试用例期望UI在特定的默认状态下切换 与XCTest不同,在XCUITest中,您不能直接访问UISwitch状态 在Objective-C中,XUITest的这种状态是如何确定的?在任何明显的地方都找不到这种

我最近遇到了这样一种情况:我需要能够从现有的XUITest(而不是XTest)bucket中检查UISwitch的当前开/关状态(而不是是否为用户交互启用),并将其切换到预先确定的状态。我已经将应用程序状态恢复添加到了一个旧的现有应用程序中,这现在干扰了一些在运行之间的现有测试用例,这些测试用例期望UI在特定的默认状态下切换

与XCTest不同,在XCUITest中,您不能直接访问UISwitch状态


在Objective-C中,XUITest的这种状态是如何确定的?

在任何明显的地方都找不到这种情况,我在这篇博客文章中遇到了类似Swift语言的情况

有了这些信息,我测试并验证了两种解决问题的方法

1) 断言状态是打开还是关闭

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) 要测试开关的状态是打开还是关闭,请切换其状态

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
使用方法(2),我能够在测试用例运行之间强制所有UI开关处于默认状态,并避免状态恢复干扰。

Swift 5版本:

xctasert((activationSwitch.value作为?字符串)=“1”)
或者,您可以使用
xguielement
扩展名

导入XCTest
扩展XUIElement{
瓦尔·伊森:布尔{
返回(self.value为?String).map{$0==“1”}
}
}
// ...
xctasert(activationSwitch.isOn==true)

用于Swift

xguielement
直接断言开关
isOn
状态添加扩展名

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")
    }
}
用法

yourSwitch.assert(isOn: true)
Swift 5: 不确定这是否对任何人有用,但我刚刚开始使用XTest,根据@drshock对这个问题的回答,我创建了一个简单的函数,我将它添加到我的XTestCase中,该函数仅在开关关闭时才关闭开关

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

        }

    }
然后在我的测试中,当我想打开一个开关时,如果它关闭了,我会使用它,其中id是来自开关可访问性部分的标识符字符串

    turnSwitchOnIfOff(id: "accessibilityIdentifierString")
定义

扩展XUIElement{
瓦里森:布尔{
(值为?字符串)=“1”
}
}
然后


@我没有使用任何第三方图书馆。这是所有开箱即用的Xcode内容。很长一段时间以来,我一直试图通过app.button访问交换机,但实际上是app.switches。你知道如何在ios 12上实现这一点吗?从我在模拟器上看到的情况来看,开关元件的值总是为零。我还没有找到解决方法,请参见
XCAssertTrue(someSwitch.isOn)