Appium 1.4.0から、iOSアプリのテストを行おうとした時にinstrumentsの起動、sessionの確立が成功した後に Error("App did not have elements")); とエラーが表示されてテストが中断することが見られるようになりました。
これは、例えばプライバシーダイアログを初回アプリインストール時に表示するような、システムダイアログが表示されるアプリで発生するようになってます。
これは、以下のコードに含まれる
if (appEls.length > 0 && !IOS.isSpringBoard(sourceObj.UIAApplication)) {
の !IOS.isSpringBoard(sourceObj.UIAApplication) がtrueになるため、はかれるエラーです。
これはアプリ起動直後にSpringBoardが表示されて偽陽性(false positive)を検出してしまうことを避けるために入れられました。ただ、意図してシステムダイアログが出るようなアプリだと、誤ってfalseと判断されるようになりました。
一方、アプリ起動を待つために waitForAppScript というcapabilityが用意されています。これは、独自で定義した条件にマッチするまでテストシナリオの実施を待つ、というものです。これを使うことで、先ほどの問題を回避することが可能です。
例えば、簡単な対応として
waitForAppScript:true;“
としておくことで、問題となる条件分岐を通らなくなります。ここら辺をもう少し調整しておくと、柔軟にテスト開始タイミングを調整することも可能ですね。
なお、すでにissueでも報告さえていました。その時の回避策が waitForAppScript の利用です。
https://github.com/appium/appium/issues/4971