Xcode(7.2および7.3)でUIテストを行うと、テストが失敗して一般的なエラーが発生することがあります:
アサーションの失敗:UIテストの失敗-要素の属性のフェッチの失敗
要素で_.hittable
_または.tap()
を呼び出すと、このエラーが発生する傾向がありますが、理由がわかりません。私が扱っているすべての要素のアクセシビリティ設定が正しく設定されていること、およびそれらが含まれているコンテナビューでアクセシビリティが有効になっていないことを確認しました。残念ながら、これでは問題が解決しないようです。
コンソールログは次のことを明らかにします:
_UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x7e68ae50> pid: 89032, context: 4D9272C7-3024-4062-B0FA-E16EF426F17A, payload: {
pid = 89032;
"uid.elementID" = 1432;
"uid.elementOrHash" = 2125772976;
}: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202}
_
検索してみたところ、すでにログに記録されていることがわかりましたが、Xcode 7.3でも現在の解決策はないようです( レーダーリンク )。
シミュレーター/デバイスを再起動してもこのエラーが発生しない場合がありますが、これは適切な解決策ではありません。
代わりに、一時的にXCUICoordinate.tap()
を使用できます。たとえば、button.tap()
をbutton.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap()
に置き換えます。
私は同じ問題に遭遇しました、そして回避策は私のために働きます。
私はこの問題を抱えています。 1回の修正後に表示されたので、私の場合は何が原因であるかを理解しました。
私のアプリには「メイン」画面があります。そのコンテンツはサーバーから返され、デバイスにキャッシュされます。この画面は、ユーザーをさまざまな「詳細」画面に導きます。ユーザーが詳細画面から戻るたびに、メイン画面でviewDidAppeare
メソッドが呼び出されます。この方法では、メイン画面がコンテンツを要求します。コンテンツを提供するには、「Data Manager」は、DBからフェッチするか、サーバーから2つの異なるエンティティを厳密な順序で要求して、dispatch_group
を使用する必要があります。メイン画面はdispatch_group_notify
呼び出しから新しいコンテンツに関する通知を受信するため、非同期です。やがて、dispatch_group_notify
が実行されると、viewDidAppeare
が終了し、私が理解しているように、アプリは少しの間アイドル状態になります。 UIテストエンジンは、アクセシビリティ要素ツリーをすでに作成している可能性があります。
この状況が発生し、ビューが表示された直後にテストコードがメイン画面の一部の要素でtap
を呼び出すと、古いアクセシビリティ要素は存在しなくなります(ビューの階層がその時点に変更されたため)が、tap
その時点では存在しない特定のelementID
などの要素に対してメソッドが呼び出されました。その結果、クラッシュが発生します。
自動化コードが速すぎる場合があり、アクセシビリティ階層のスナップショットに要素が含まれていても、クエリが次の命令に進むのが速すぎて、フレームワークがtap( )送信するメソッド。 Joe Masilottiの ヘルパー関数 を使用して要素が最初にヒット可能になるのを待ち、次に問題の要素をタップする前にsleep()を追加することで、このエラーを最小限に抑えることができました。お役に立てれば。
私もこれに遭遇しました。私の場合、サーバーは複数の先行入力検索クエリの結果をすばやく連続して返します。ターゲット要素はすぐにポップアップしますが、最後のクエリまで一貫してヒット可能ではありません。 XCTWaiterを介して、最初のクエリで要素が存在するのを待つことでこれを解決しました。次に、すべてのクエリ結果の時間を含むようにスリープを設定し、要素がヒット可能になるのを待ちます。 hittableは要素をタップできるかどうかもチェックするため、最初のクエリ結果にhittableを使用しないでください。ただし、UIの変更が速すぎて、要素をタップできません。
テスト目的またはコードベースを介して、最後のクエリのみをトリガーできるとよいでしょう。複数の先行入力クエリを回避するためにUIPasteboardを使用することも検討しましたが、私が知る限り、これはXCTestでは使用できません。
http://masilotti.com/xctest-helpers/ からwaitForHittable()を試しましたが、私の場合、タップする前にsleep(seconds)を使用する必要がありました。
さらに、JoeMasilottiの方法が役に立たないとは思わないでください。それらは素晴らしく、拡張機能XCTestと拡張機能XCUIElementに追加しました。アプリのメイン画面が読み込まれた後、最初のタップでwaitForHittable()が機能しなかっただけです。