4

私はTodayウィジェット付きのAppを持っています。だから私はそれについていくつかのUIテストを実行したいと思います。XCUITestとTodayウィジェット

[今日/通知]パネルを開く方法が見つかりました。それは簡単だと思われます:

let statusBar = XCUIApplication().statusBars.elementBoundByIndex(0) 
statusBar.swipeDown() 

しかし、私は何か役に立つ方法を見つけることができません。 Today/NotificationsパネルにUIのやりとりを記録することは可能ですが、そのようなコードでは自分の行動を再現することはできません。

答えて

3

拡張機能のテストでも同様の問題があります。私はあなたがしなければならないことが、インタラクションを推進するために要素自体ではなく、画面上の要素をタップすることであることを発見しました。私はあなたのシナリオでこれをテストしていませんが、この方法ではまだタップできないものは見つかりませんでした。スーパーフレームとサブビューを取得することにより

let iconFrame = icon.frame // App icon on the springboard 
let springboardFrame = springboard.frame // The springboard (homescreen) 
icon.pressForDuration(1.3) // tap and hold 

// Tap the little "X" button at approximately where it is. The X is not exposed directly 
springboard.coordinateWithNormalizedOffset(CGVectorMake((iconFrame.minX + 3)/springboardFrame.maxX, (iconFrame.minY + 3)/springboardFrame.maxY)).tap() 

:ここ

は同様に、典型的な相互作用を介して取り出すことができないアプリのアイコンのためのスプリングの「X」ボタンをタップするスイフト例であります要素が画面上でどこにあるべきかを計算することができます。 coordinateWithNormalizedOffsetは、フレームまたはピクセルオフセットではなく、[0,1]の範囲のベクトルを取ります。要素自体を座標でタップしても機能しないので、superview/XCUIApplication()レイヤーでタップする必要があります。

より一般的な例:あなたはスプリング層にアクセスし、アプリケーションの外に行く必要がある場合は

let myElementFrame = myElement.frame 
let appFrame = XCUIApplication().frame 
let middleOfElementVector = CGVectorMake(iconFrame.midX/appFrame.maxX, iconFrame.midY/appFrame.maxY) 

// Tap element from the app-level at the given coordinate 
XCUIApplication().coordinateWithNormalizedOffset(middleOfElementVector).tap() 

、あなたがそうすることができます。

let springboard = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard") 
springboard.resolve() 

しかし、あなたは、いくつかを公開する必要がありますObjective-Cを使用したプライベートXCUITestメソッド:

@interface XCUIApplication (Private) { 
    - (id)initPrivateWithPath:(id)arg1 bundleID:(id)arg2; 
} 

@interface XCUIElement (Private) { 
    - (void) resolve; 
} 
関連する問題