从XCUITest我如何检查UISwitch的开/关状态?

时间:2017-05-28 01:19:53

标签: objective-c xcode-ui-testing uiswitch

我最近遇到了一种情况,我需要能够从现有的XCUITest桶中检查UISwitch的当前开/关状态(不论是否启用了用户交互),而不是XCTest,以及切换它到了预先确定的状态。我已经将应用程序状态恢复添加到旧的现有应用程序中,这现在干扰了预期UISwitch处于特定默认状态的运行之间的许多现有测试用例。

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

如何在Objective-C中为XCUITest确定此状态?

5 个答案:

答案 0 :(得分:8)

在这篇博文中没有找到任何显而易见的东西,我发现了类似Swift语言的情况。 Xcode UITests: How to check if a UISwitch is on

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

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),我能够在测试用例运行之间强制所有UISwitch的默认状态,并避免状态恢复干扰。

答案 1 :(得分:0)

Swift 5版本:

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

或者,您可以使用XCUIElement扩展名

import XCTest

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

// ...

XCTAssert(activationSwitch.isOn == true)

答案 2 :(得分:0)

对于 Swift

XCUIElement上添加扩展名,以断言直接切换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)

答案 3 :(得分:0)

斯威夫特 5: 不确定这是否对任何人有用,但我刚刚开始使用 XCTest,并且基于 @drshock 对这个问题的回复,我创建了一个简单的函数,我将其添加到我的 XCTestCase 中,该函数仅在关闭时才打开开关。< /p>

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

答案 4 :(得分:0)

定义

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

然后

XCAssertTrue(someSwitch.isOn)