xCode 7.1 中警报的 UITesting
UITesting of Alerts in xCode 7.1
我在 xCode 7.1 中编写 UITest,但在测试警报时遇到问题(在我的案例中允许通知)。
创建测试时 xCode 编写此代码:
app.alerts["\U201cAppName\U201d Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap()
这会立即导致错误:
Invalid escape sequence in literal
所以我将xCode的代码替换为:
app.alerts["\u{201c}AppName\u{201d} Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap()
但是当我 运行 UITest 失败并显示消息时:
UI Testing Failure - No matches found for Alert
代码相同
app.alerts["“AppName” Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap()
我也试过了
app.alerts.collectionViews.buttons["OK"].tap()
正如人们建议的那样 ,但同样的故事...
我相信很多人在 xCode 7.1
的 UITesting 中遇到过这样的问题
请分享您的经验或任何解决建议。
提前致谢!
见下面的例子
import XCTest
let systemAlertHandlerDescription = "systemAlertHandlerDescription"
class LoginPerformingTestCase: XCTestCase {
var systemAlertMonitorToken: NSObjectProtocol? = nil
override func setUp() {
continueAfterFailure = false
let app = XCUIApplication()
app.launchArguments = [TestingEnvironment.resetLaunchArgument, TestingEnvironment.testingEnvironmentArgument]
app.launch()
systemAlertMonitorToken = addUIInterruptionMonitorWithDescription(systemAlertHandlerDescription) { (alert) -> Bool in
if alert.buttons.matchingIdentifier("OK").count > 0 {
alert.buttons["OK"].tap()
return true
} else {
return false
}
}
}
override func tearDown() {
if let systemAlertMonitorToken = self.systemAlertMonitorToken {
removeUIInterruptionMonitor(systemAlertMonitorToken)
}
super.tearDown()
}
func loginWithApp(app: XCUIApplication) {
let signInButton = app.buttons["SIGN IN"]
signInButton.tap()
let emailAdressTextField = app.textFields.matchingIdentifier("EmailAddress").elementBoundByIndex(0)
emailAdressTextField.tap()
emailAdressTextField.typeText("trevistest@test.test")
let passwordSecureTextField = app.secureTextFields["Password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("1111")
signInButton.tap()
let exists = NSPredicate(format: "exists == 1")
let iconAlarmButton = app.buttons["icon alarm"]
let expectation = expectationForPredicate(exists, evaluatedWithObject: iconAlarmButton, handler: nil)
waitForExpectationsWithTimeout(60) { (error) -> Void in
if let _ = error {
expectation.fulfill()
}
}
app.tap()//workaround to hide system alert
let darkNavigaitonBar = app.otherElements.matchingIdentifier("darkNavigationView").elementBoundByIndex(0)
if darkNavigaitonBar.hittable == true {
app.tap()
}
}
}
下面是一个示例,说明如何使用请求本地通知权限访问的应用执行此操作:
addUIInterruptionMonitorWithDescription("Local Dialog") { (alert) -> Bool in
if alert.collectionViews.buttons["OK"].exists {
alert.collectionViews.buttons["OK"].tap()
return true
}
return false
}
我在 xCode 7.1 中编写 UITest,但在测试警报时遇到问题(在我的案例中允许通知)。 创建测试时 xCode 编写此代码:
app.alerts["\U201cAppName\U201d Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap()
这会立即导致错误:
Invalid escape sequence in literal
所以我将xCode的代码替换为:
app.alerts["\u{201c}AppName\u{201d} Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap()
但是当我 运行 UITest 失败并显示消息时:
UI Testing Failure - No matches found for Alert
代码相同
app.alerts["“AppName” Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap()
我也试过了
app.alerts.collectionViews.buttons["OK"].tap()
正如人们建议的那样
我相信很多人在 xCode 7.1
的 UITesting 中遇到过这样的问题请分享您的经验或任何解决建议。 提前致谢!
见下面的例子
import XCTest
let systemAlertHandlerDescription = "systemAlertHandlerDescription"
class LoginPerformingTestCase: XCTestCase {
var systemAlertMonitorToken: NSObjectProtocol? = nil
override func setUp() {
continueAfterFailure = false
let app = XCUIApplication()
app.launchArguments = [TestingEnvironment.resetLaunchArgument, TestingEnvironment.testingEnvironmentArgument]
app.launch()
systemAlertMonitorToken = addUIInterruptionMonitorWithDescription(systemAlertHandlerDescription) { (alert) -> Bool in
if alert.buttons.matchingIdentifier("OK").count > 0 {
alert.buttons["OK"].tap()
return true
} else {
return false
}
}
}
override func tearDown() {
if let systemAlertMonitorToken = self.systemAlertMonitorToken {
removeUIInterruptionMonitor(systemAlertMonitorToken)
}
super.tearDown()
}
func loginWithApp(app: XCUIApplication) {
let signInButton = app.buttons["SIGN IN"]
signInButton.tap()
let emailAdressTextField = app.textFields.matchingIdentifier("EmailAddress").elementBoundByIndex(0)
emailAdressTextField.tap()
emailAdressTextField.typeText("trevistest@test.test")
let passwordSecureTextField = app.secureTextFields["Password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("1111")
signInButton.tap()
let exists = NSPredicate(format: "exists == 1")
let iconAlarmButton = app.buttons["icon alarm"]
let expectation = expectationForPredicate(exists, evaluatedWithObject: iconAlarmButton, handler: nil)
waitForExpectationsWithTimeout(60) { (error) -> Void in
if let _ = error {
expectation.fulfill()
}
}
app.tap()//workaround to hide system alert
let darkNavigaitonBar = app.otherElements.matchingIdentifier("darkNavigationView").elementBoundByIndex(0)
if darkNavigaitonBar.hittable == true {
app.tap()
}
}
}
下面是一个示例,说明如何使用请求本地通知权限访问的应用执行此操作:
addUIInterruptionMonitorWithDescription("Local Dialog") { (alert) -> Bool in
if alert.collectionViews.buttons["OK"].exists {
alert.collectionViews.buttons["OK"].tap()
return true
}
return false
}