2015-10-01 6 views
8

Xcode 7でUIテストを使用してアプリケーションを自動化しています。私はXCUIElements(ボタンなどを含む)をスクロールビューに持っています。ときにはXCUIElementが表示されることがあります。スクロールビューのどこにあるかによって、スクロールビューの上下に表示されないことがあります。UITesting Xcode 7:XCUIElementが表示されているかどうかを確認するには?

アイテムをスクロールしたり、表示されているかどうかを確認する方法はありますか?

おかげ

答えて

5

:-(既知のバグであるように見えます。あなたは

XCUIApplication().swipeUp() 

それとも、またWhateverUIElement.swipUp()を行うことができ、それはその要素に関して/上下にスクロールします?これを試してみました。

うまくいけば、自動スクロールや自動検索機能を修正して、手動で行う必要はありません。

+0

こんにちはNarine。うん、私はswipeUp()とdownを実行しますが、要素が表示されていることを知る方法はありません。:-(あなたがうまくいけば、彼らはこれを将来的に丸めるための方法を考え出すでしょう。 –

12

残念なことに、AppleはscrollToメソッドまたは.visibleパラメータをXCUIElementに提供していません。つまり、この機能のいくつかを達成するために、いくつかのヘルパーメソッドを追加することができます。ここで私はそれをSwiftでやったのです。

要素が表示されているかどうかをチェックするための第一:残念ながら

func elementIsWithinWindow(element: XCUIElement) -> Bool { 
    guard element.exists && !CGRectIsEmpty(element.frame) && element.hittable else { return false } 
    return CGRectContainsRect(XCUIApplication().windows.elementBoundByIndex(0).frame, element.frame) 
} 

.existsは、要素がロードされている場合はtrueを返しますが、画面上ではありません。さらに、ターゲット要素が0より大きい(時には真である)フレームを持っていることを確認しなければなりません。そして、このフレームがメインウィンドウ内にあるかどうかを調べることができます。あなたに近づきすぎる場合には注意してください -

func scrollDown(times: Int = 1) { 
    let topScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.05)) 
    let bottomScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.90)) 
    for _ in 0..<times { 
     bottomScreenPoint.pressForDuration(0, thenDragToCoordinate: topScreenPoint) 
    } 
} 

func scrollUp(times: Int = 1) { 
    let topScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.05)) 
    let bottomScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.90)) 
    for _ in 0..<times { 
     topScreenPoint.pressForDuration(0, thenDragToCoordinate: bottomScreenPoint) 
    } 
} 

は、スクロールアクションのスケールを変更しますtopScreenPointとbottomScreenPointためCGVector値を変更する:

はその後、我々は、制御可能な量をアップまたはダウンスクロールするための方法を必要とします画面の端にはOSメニューの1つが表示されます。あなたは要素が見えるようになるまで、指定したしきい値に一方通行をスクロールループを書くことができる場所でこれらの2つの方法で

、それはその対象が見つからない場合、それは他の方法でスクロール:

func scrollUntilElementAppears(element: XCUIElement, threshold: Int = 10) { 
    var iteration = 0 

    while !elementIsWithinWindow(element) { 
     guard iteration < threshold else { break } 
     scrollDown() 
     iteration++ 
    } 

    if !elementIsWithinWindow(element) { scrollDown(threshold) } 

    while !elementIsWithinWindow(element) { 
     guard iteration > 0 else { break } 
     scrollUp() 
     iteration-- 
    } 
} 

この最後の方法は超効率的ではありませんが、少なくとも画面外の要素を見つけることができるはずです。もちろん、あなたのターゲット要素がいつも与えられたテストのあなたの出発点の上または下になることを知っているならば、しきい値ロジックなしでここにscrollDownUntilまたはscrollUpUntillメソッドを書くことができます。 これが役立つことを願っています!

+0

私は別のアプローチ使用してメインウィンドウを取得しなければならなかった: - {。 リターンXCUIApplication()windows.elementBoundByIndex(0) } FUNCのメインウィンドウ()> XCUIElementをまた 、あなたは 'scrollUp' という名前の何より伝統的に命名されるだろう'scrollDown' – isoiphone

+0

良い点isoiphone!そのXCUIApplication.mainWindow()はこのコードサンプルに追加するのを忘れてしまった拡張機能でした。私は解答を編集して、よりスムーズにスクロールしました。 –

2

isHittableプロパティをチェックする必要があります。

ビューが非表示の場合、対応するXCUIElementはヒット可能です。しかし、警告があります。 「View 1」は「View 2」で重ねることができますが、「View 1」に対応する要素はヒット可能です。

1

tableview(テーブルフッタビュー)の下部にXCUIElementsがいくつかあるため、テーブルビューに多くのデータがあると仮定して、UIテストの最下位にあるtableviewをスクロールする方法はtap()です。

.swipeUp()も問題はありますが、テストデータが巨大な場合は、.tap()に直接向かうように、スワイプするのが永久にかかります。これは直接tableViewの下部に飛びます。特別

より: XCUIElementsInTheBottomOrTableFooterView.tap() XCTAssert(XCUIElementsInTheBottomOrTableFooterView.idHittable, "message")

関連する問題