Xcode UIテスト-UIテストの失敗-検索フィールドの[キャンセル]ボタンをタップすると、(AXアクションによって)表示までスクロールできませんでした


85

検索バーの「キャンセル」ボタンをタップして検索フィールドを閉じようとしています。

テストケースはキャンセルボタンを見つけることができません。Xcode7.0.1では正常に機能していました

ボタンが表示されるのを待つ述語を追加しました。「キャンセル」ボタンをタップすると、テストケースが失敗します

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

ログ

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@ジョーマシロッティ何かアイデアはありますか?
Vinpai 2015年

単なるサニティチェックですが、画面の[キャンセル]ボタンですか、それともスクロールする必要がありますか?要素へのスクロールが常に機能するとは限らないという問題がまだあることを私は知っています。
Joe Masilotti 2015年

@JoeMasilottiキャンセルボタンが画面に表示されます。キャンセルボタンは、UISearchbarの一部であるシステムのデフォルトボタンです。[self.buttons [@ "Cancel"] tap]を実行したとき、Xcode7.0.1では正常に機能していました。
Vinpai 2015年

1
@Vinpaiapp.tables.cells.allElementsBoundByAccessibilityElement.countボタンをタップする前にを追加するとどうなりますか?ただ好奇心が強いです-これは時々私のために画面を「リフレッシュ」するのに役立ちました。
cakes88

@Konnor、あなたが提案したAPIで試しましたが、[キャンセル]ボタンをタップすると失敗します。デバッガーでapplication.buttonsを照会すると、キャンセルボタンが表示されます
Vinpai 2015年

回答:


140

私はここにボタンが戻る「キャンセル」推測falseのためのhittableタップから、それを妨げているプロパティを、。

tap()ドキュメントに表示されている場合は、

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

XCode 7.1では問題が発生しているようです。これらの問題から自分自身(およびuも;))のブロックを解除するXCUIElementために、ヒットできない場合でも要素をタップできる拡張機能を作成しました。以下はあなたを助けることができます。

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

今、あなたはとして呼び出すことができます

button.forceTapElement()

更新-Swift3の場合は、次を使用します。

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

修正していただきありがとうございます。私はで同様の問題に遭遇していました、cell.tap()そしてこれはそれを修正しました。Xcode7.1で何かが変更されたため、一部の要素がヒットできなくなったようです
francisOpt 2015

Xcode7.1では「ヒット可能」ではないカスタムnavigationBarbackButtonItemがあり、このソリューションは私のために機能しますself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

ありがとう-私の同じ問題のために働いた。
2016年

7
私の場合、タップがビューの中央にあるときに機能しました。オフセットを(0.5、0.5)に変更します。let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks 2016年

1
すごい仕事。私はこれを見る前に私のmacbookを殺し始めていました。
ChaosSpeeder 2016

11

私にとって根本的な原因は、タップしたいオブジェクトでした

  • 非表示(および戻る)に設定されています
  • 削除され、再接続されました

どちらの場合も、isAccessibilityElementプロパティはfalseその後でした。それをtrue修正するために戻す。


3
これはまさに私の問題でした。奇妙なことに、それはiOS 11で起こり始めました(iOS 10では正常に機能していました)。
リカルドサンチェス-サエズ2017年

4

この質問は、「(AXアクションによって)表示されるボタンまでスクロールできませんでした」という用語に関するGoogleのクエリに適しています。質問の年齢を考えると、受け入れられた回答が示唆するように、これはXCUITestフレームワークの問題ではなくなったと思う傾向がありました。

この問題はXCElement既存のものが原因であることがわかりましたが、ソフトウェアキーボードの背後に隠れています。フレームワークは、存在するビューをスクロールしてタップ可能にすることができないため、エラーが発生します。私の場合、問題のボタンがソフトウェアキーボードの後ろにあることがありました

iOSシミュレータのソフトウェアキーボードがオフになっている場合(例:マシン上)とオンになっている場合(例:CI上)があることがわかりました。私の場合、あるマシンではソフトウェアキーボードをオフに切り替えていましたが、他のマシンではデフォルトでオンに切り替えていました。

解決策:キーボードの後ろにある可能性のあるボタンをタップする前に、キーボードを閉じてください。

ボタンをタップする前にキーボードを明示的に閉じた場所をタップすると、すべての環境で問題が解決することがわかりました。

現在のレスポンダーをresignFirstResponderにするためのアクションをいくつか追加しました。私のテキストビューの背後にあるビューは、最初の応答者を強制的に辞任させるので、最後のテキスト領域のすぐ下のどこかをタップします。

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

要素の特性を確認してください。TableViewSectionHeaderで同じ問題に直面していました。タップしようとしましたが、すべてのポイントで失敗していました。

ここに画像の説明を入力してください


1

Sandyの回避策はしばらくは役に立ったように見えましたが、それ以上はありませんでした。その後、次のように変更しました。

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

重要な点は、isHittableチェックが例外をスローすることであるため、このチェックはまったく行わず、要素が見つかった後、座標を直進します。


0

私の場合、ボタンをカバーするUI要素がプログラムで追加されていました。


0

AppCenterシミュレーターを使用してテストを実行している場合は、ローカルシミュレーターと同じデバイスバージョンでテストを実行していることを確認する必要があります。このため、3日間の仕事を失いました。


0

あなたの要素をカバーできるものの精神で、私はRNデバッガーを私のアイコンの上に部分的にオーバーレイしました:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.