いくつかの背景
現在、設定ペインの UI テストを作成しており、ボタンをクリックして、プッシュ通知や位置情報サービスなどの特定の権限を有効にしています。
ただし、パーミッションのアラートが以前に表示されていた場合 (ユーザーがパーミッションへのアクセスを許可または拒否したかどうかに関係なく)、アラートは再度表示されず、ユーザーは設定アプリに移動するだけです。残念ながら、これらの設定はリセットされません。つまり、UI テストを初めて実行すると、アラートが表示されます。その後のすべての UI テストの実行では、テストを開始する前にデバイスをリセットしない限り、ボタンを押すと設定アプリが表示されます。
私の問題
したがって、私のテストでは、アプリがバックグラウンドになったかどうかを知る必要があり、テストを続行するためにアプリをフォアグラウンドにしようとする必要があります。
if app.state == background {
foregroundApp()
}
// continue with other tests
アプリがバックグラウンドにあるかどうかを判断する方法はありますか?
私が試したこと
UI テストからアプリケーションの状態(実行中/バックグラウンド/など)を判断する方法を調査しましたが、あまり見つけることができませんでした。特定の要素が存在するかどうかを確認しようとしました:
if (app.navigationBars.element.exists) ...
しかし、テスト中のアプリがバックグラウンドにあり、テストがナビゲーションバー (または他の要素) を検索できないためにユーザーが設定ページに移動すると、実行時エラー[1]が発生します。
XCUIApplication()
との Facebook のプライベート ヘッダーのいくつかのメソッドを使用してみましたXCUIElement()
。
XCUIApplication().state
3
アプリが現在どのような状態にあるかに関係なく、常に戻りますXCUIApplication().resolve()
。アプリをフォアグラウンドで呼び出そうとすると、以前と同じエラーが発生します[1]
テストを再開する前にアプリをフォアグラウンドにするロジックを書き直そうとしましたが、XCUIApplication().launch()
再起動する前にアプリを強制終了するなどの方法はできません。siri サービスだけが機能しているように見えますが、企業プロキシ経由で siri サービスにアクセスできず、プロキシのアクセス許可を変更することもできません。
アプリの状態を確認する他の方法はありますか?
エラー
[1] このエラーは、状態に関係する何かをしようとするたびに表示されます。私はどこにも電話しないsnapshotView
ので、使用するという提案afterScreenUpdates
は役に立ちません。
Failure to get snapshot within 15.0s
Cannot snapshot view (<UIKeyboardImpl: 0x7febcc75d000; frame = (0 0;
414 226); layer = <CALayer: 0x608000625720>>) with
afterScreenUpdates:NO, because the view is not in a window. Use
afterScreenUpdates:YES.`
tl;dr
UI テストを行っているアプリがバックグラウンドに入った (つまり、ユーザーがホーム ボタンを押した) かどうかを確認する必要があります。ナビゲーション バーなどの特定の要素の存在のチェックは機能しません。また、XCUIApplication/XCUIElement の Facebook のプライベート ヘッダーのほとんどのメソッドも機能しません。アプリのフォアグラウンド化も問題を引き起こし、アプリの再起動はオプションではありません。siriサービスもありません。