【问题标题】:pick image from photos/gallery using xctest使用 xctest 从照片/图库中选择图像
【发布时间】:2017-09-06 13:44:26
【问题描述】:

我正在为需要从照片/图库应用导入图像进行验证的 ios 应用编写测试框架。我正在使用 XCTest 框架进行测试。我在互联网上查看了一些资源,但找不到任何资源。谁能帮我解决这个问题。同样,我不是从应用程序内部而是从图像中选择图像,而是从照片库中选择图像。

【问题讨论】:

    标签: ios swift gallery xctest


    【解决方案1】:

    您无法使用 XCTest 与您自己的应用之外的应用进行交互。测试引用了您应用的包标识符,这是它们能够与之交互的唯一应用。

    XCTest 需要对您的应用程序的内部进行一定程度的访问,以便为您提供有关它的信息,以便您通过 XCTest 与它进行交互,而这在您没有访问的应用程序中是不可访问的做自己。

    【讨论】:

    • 有什么办法可以做到...有没有其他替代方法?
    • 你能帮帮我吗?
    • 我知道有像 EggPlant 这样的工具可以让你与整个设备进行交互,但老实说我不推荐使用它,因为它是一种非常不稳定的测试方式。我的建议是结合应用内场景的 XCTest 手动测试照片场景。
    • 所以我无法使用 XCTest 访问图库。我们可以使用 XCTest 访问设备上的任何文件夹,我可以在其中转储图像并用于测试吗?
    • 您可以访问的文件系统的唯一部分是您的应用程序内部的内容,因此您需要在应用程序处于测试状态时将所有测试图像包含在应用程序包中。
    【解决方案2】:

    是的

    您可以访问照片库,但它需要 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()
    【解决方案3】:

    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/

    【讨论】:

      【解决方案4】:
      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()
      

      【讨论】:

      • 你在哪里设置“PhotosGridView”?
      • 但是在里面呢?在 UIImagePickerController 上我找不到 accessibilityIdentifier 属性。
      • 我相信你想要实现的不是这个线程的范围。要测试从 Apple Photos 应用中挑选照片(这是这里的目标),您不需要使用任何 UIKit 对象。
      【解决方案5】:

      这是我的解决方案,它独立于添加到库中的照片

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

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 2012-03-06
        • 2020-10-02
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        • 2017-04-11
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多