9

Snapshotを使用してアプリケーションのスクリーンショットの作成を自動化しようとしていますが、UIImagePickerControllerに設定されているallowsEditingをナビゲートするまで、すべてうまくいきtrueます。

奇妙なことに、iPhone 4s5s、および6sシミュレーターでは問題なく動作しますが、iPhone 6(s) Plusでは、テストで「選択」(オランダ語で「Kies」) ボタンをタップできないようです。クロッパービュー。

私の最初の試みは、どのバージョンでも機能しませんでした:

app.buttons.elementBoundByIndex(2).tap()

そして、次のエラーが発生しました:

file:///%3Cunknown%3E: テストに失敗しました: -[MyAppSnapshots testExample()] に失敗しました: UI テストに失敗しました - スクロールして表示に失敗しました (AX アクションによる) ボタン 0x7f82d450ae30: 特性: 8589934593, {{327.0, 613.5}, {35.0, 34.0}}、ラベル: 'Kies'、エラー: エラー -25204 AXAction 2003 の実行中

次に、この回答から、 iPhone 6(s) PlusforceTapElement以外のすべてで機能する のソリューションを取得しました。

app.buttons.elementBoundByIndex(2).forceTapElement()

次に、座標をタップしてみました。

let window = app.windows.elementBoundByIndex(0)
let rightBottom = window.coordinateWithNormalizedOffset(CGVectorMake(
  CGRectGetWidth(window.frame) - 20,
  CGRectGetHeight(window.frame) - 20
))
rightBottom.tap()

しかし、それもどのデバイスでも機能しませんでした。

では、これらのネイティブ インターフェイスをテストするにはどうすればよいでしょうか。または、何らかのスイッチをコードに追加して、UIImagePickerControllerインタラクティブでないものに置き換える必要があります。

4

1 に答える 1

0

作業アプローチのように見えます:

func waitForElementToAppear(element: XCUIElement,
                            timeout seconds: TimeInterval = 5,
                            file: String = #file,
                            line: UInt = #line) {
    let existsPredicate = NSPredicate(format: "exists == true")
    let expectation = expectation(for: existsPredicate, evaluatedWith: element, handler: nil)
    XCTWaiter().wait(for: [expectation], timeout: seconds)
    XCTAssert(element.exists, "Element \(element.identifier) not found")
}

func tapAtPosition(position: CGPoint,
                   file: String = #file,
                   line: UInt = #line) {
    let cooridnate = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).withOffset(CGVector(dx: position.x, dy: position.y))
    cooridnate.tap()
}

func selectPhotoFromGalary(index: Int = 0) {
    waitForElementToAppear(element: app.buttons["Photos"], timeout: 10)
    let position = app.images.containing(NSPredicate(format: "label BEGINSWITH 'Photo'")).element(boundBy: index).frame.origin
    tapAtPosition(position: position)
    let chooseButton = app.buttons["Choose"]
    waitForElementToAppear(element: chooseButton, timeout: 5)
    chooseButton.tap()
}
于 2021-07-02T17:22:13.133 に答える