我最近遇到了一种情况,我需要能够从现有的XCUITest桶中检查UISwitch的当前开/关状态(不论是否启用了用户交互),而不是XCTest,以及切换它到了预先确定的状态。我已经将应用程序状态恢复添加到旧的现有应用程序中,这现在干扰了预期UISwitch处于特定默认状态的运行之间的许多现有测试用例。
与XCTest不同,在XCUITest中,您无法直接访问UISwitch状态。
如何在Objective-C中为XCUITest确定此状态?
答案 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)