web-dev-qa-db-ja.com

Xcode UITestsを使用して特定のポイントをタップする方法

高速レーンスナップショット でXcode UIテストを使用して、Cordovaアプリのスクリーンショットを作成します。基本的に、アプリ全体が単なるWebビューであるため、Xcode UIテストヘルパーメソッドはすべて無関係になり、特定のポイントをタップしたいだけです。 tap(x: 10, y: 10)は、ポイントでタップを生成する必要があります{10px; 10px}

これはおそらく非常に簡単ですが、その方法はわかりません。

ありがとう。

21

XCUICoordinate AP​​I を使用して特定のポイントをタップできます。残念ながら、ピクセル座標を参照して「タップ10,10」と言うことはできません。実際のビューに対する相対オフセットを使用して座標を作成する必要があります。

前述のWebビューを使用して、相対座標と対話できます。

_let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
_

補足説明ですが、Webビューを直接操作してみましたか? app.links["Link title"].tap()またはapp.staticTexts["A different link title"].tap()を使用して多くの成功を収めました。 これは、Webビューとの対話を示すデモアプリです


更新:Michal W.がコメントで指摘したように、座標を直接タップすることができます、オフセットの正規化を心配することなく。

_let normalized = webView.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
let coordinate = normalized.withOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
_

正規化されたベクトルに0,0を渡し、2番目の呼び出しに実際のポイント10,10を渡すことに注意してください。

32
Joe Masilotti

@joe Joe Masilottiのアプローチをもう少し進めるために、私はextensionに私のものを入れ、グローバルおよびローカルパラメータに前置詞句を付けました。

func tapCoordinate(at xCoordinate: Double, and yCoordinate: Double) {
    let normalized = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
    let coordinate = normalized.withOffset(CGVector(dx: xCoordinate, dy: yCoordinate))
    coordinate.tap()
}

グローバルに識別可能な名前を付けることで、たとえばインスタンスを簡単に理解できます。

tapCoordinate(at x: 100, and y: 200)
15
Laser Hawk
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()

.zeroを正規化されたベクトルに渡し、次に実際のポイント(10,60)を渡します

2
StackUnderflow