【发布时间】:2017-09-06 13:44:26
【问题描述】:
我正在为需要从照片/图库应用导入图像进行验证的 ios 应用编写测试框架。我正在使用 XCTest 框架进行测试。我在互联网上查看了一些资源,但找不到任何资源。谁能帮我解决这个问题。同样,我不是从应用程序内部而是从图像中选择图像,而是从照片库中选择图像。
【问题讨论】:
我正在为需要从照片/图库应用导入图像进行验证的 ios 应用编写测试框架。我正在使用 XCTest 框架进行测试。我在互联网上查看了一些资源,但找不到任何资源。谁能帮我解决这个问题。同样,我不是从应用程序内部而是从图像中选择图像,而是从照片库中选择图像。
【问题讨论】:
您无法使用 XCTest 与您自己的应用之外的应用进行交互。测试引用了您应用的包标识符,这是它们能够与之交互的唯一应用。
XCTest 需要对您的应用程序的内部进行一定程度的访问,以便为您提供有关它的信息,以便您通过 XCTest 与它进行交互,而这在您没有访问的应用程序中是不可访问的做自己。
【讨论】:
您可以访问照片库,但它需要 XCUITest 并且记录器在 Apple 的 UIRemoteView 中无法像照片选择器一样工作。您需要做的是进入 XCUITest 中的照片选择器,设置断点,然后检查视图层次结构以找到能够使用 XCUITest 导航的元素。下面的例子适用于模拟器自带的图片。
let app = XCUIApplication()
// get to the photo library
// set a breakpoint, po [[UIWindow keyWindow] recursiveDescription]
let tablesQuery = app.tables
app.sheets.buttons["Choose From Library"].tap()
app.cells["Camera Roll"].tap()
app.cells["Photo, Landscape, March 12, 2011, 7:17 PM"].tap()
【讨论】:
app.cells.containing(NSPredicate(format: "label BEGINSWITH 'Photo'")).element(boundBy: 0).tap()
XCTest 为这种情况提供了特殊的方法。
let galleryAccessMonitor = addUIInterruptionMonitor(withDescription: "Intercept Gallery Access") { alert -> Bool in
alert.buttons.element(boundBy: 1).tap() /// tap accept
return true /// mark as handled
}
见https://useyourloaf.com/blog/handling-system-alerts-in-ui-tests/
【讨论】:
let photosApp = XCUIApplication(bundleIdentifier: "com.apple.mobileslideshow")
photosApp.launch()
let continueButton = photosApp.buttons["Continue"]
if continueButton.waitForExistence(timeout: 2) {
continueButton.tap()
}
photosApp.collectionViews["PhotosGridView"].cells.firstMatch.tap()
【讨论】:
这是我的解决方案,它独立于添加到库中的照片:
let app = XCUIApplication()
app.launch()
app.buttons["add.photo.button"].tap()
let photosNavBar = app.navigationBars["Photos"]
if photosNavBar.waitForExistence(timeout: 2) {
XCTAssert(app.navigationBars["Photos"].exists)
} else {
XCTFail()
}
【讨论】: