Appium で要素検索、要素クリックに異常に時間がかかる問題
Appium を使って Android アプリのテスト自動化を行う際、特定の要素を検索してクリックしようとすると異常に時間がかかるという問題に直面しました。5秒とか10秒というレベルではなく、要素の検索に30秒、要素のクリックにまた30秒かかる、という現象です。
Appium Inspector で対象の要素を見てみると、要素自体はすぐに表示されていそうです。しかし実際に Appium Inspector で要素の検索をしてみると、やっぱり30秒くらいかかったりします。
本記事では、この問題の原因と、効果的な解決策である waitForIdleTimeout
の設定について解説します。
なぜ遅くなるのか?
Appium の Android テストフレームワークである UiAutomator2 は、UIスレッドがアイドル(=何も処理をしていない)状態になるのを待ってから、画面のUI階層情報を取得します。
複雑なアプリでは、バックグラウンドでのデータ通信や小さなアニメーションが常に動いているため、UIスレッドがなかなかアイドル状態になりません。このため、Appiumは「UIが安定するのを待つ」という処理をタイムアウトまで繰り返してしまい、結果的に要素の検索や操作に時間がかかってしまうのです。
この「アイドル状態」を待つ時間のデフォルト設定が waitForIdleTimeout
です。
解決策: waitForIdleTimeout
の調整
waitForIdleTimeout
のデフォルト値は 10000ms(10秒) です。この値を短くすることで、UIスレッドが完全にアイドルになるのを待たずに、次の処理に進むことができます。
例えば、自分のテストコードでは最初以下のようになっていました。
const profileName = await browser.$('id:com.example.android:id/profile_name')
await profileName.waitForDisplayed({ timeout: 5000 }) // ここで異常に時間がかかる
await profileName.click() // ここで異常に時間がかかる
これを以下のように修正します。
// 要素検索に異常に時間がかかる問題があり、UIのアイドルタイムアウトを一時的に短くする
await browser.updateSettings({ waitForIdleTimeout: 500 })
const profileName = await browser.$('id:com.example.android:id/profile_name')
await profileName.waitForDisplayed({ timeout: 5000 })
await profileName.click()
// 元のUIのアイドルタイムアウトに戻す
await browser.updateSettings({ waitForIdleTimeout: 10000 })
これをやったところ、元々30秒くらいかかっていた処理が一瞬で終わるようになりました。
その他の試み
今回の解決策にたどり着くまでに、いくつかの方法を試しました。
-
id
やXPath
以外のセレクタを試す:UiSelector
を使ったdescriptionContains
やtext
による検索を試しましたが、今回のケースでは効果はありませんでした。 -
'appium:pageLoadStrategy': 'none'
を設定する: Appium のcapabilities
に設定を追加する方法です。ページの読み込みを待たない設定ですが、これも今回のケースでは効果ありませんでした。 -
'appium:settings[ignoreUnimportantViews]': true
を設定する: Appium のcapabilities
に設定を追加する方法です。UI階層を簡略化する設定ですが、今回のケースでは効果ありませんでした。 -
'appium:disableWindowAnimation': true
を設定する: Appium のcapabilities
に設定を追加する方法です。UI の描画を早くするための設定ですが、これも今回のケースでは効果ありませんでした。
まとめ
Appium で Android アプリの要素検索が遅い場合、その原因は必ずしもセレクタの選び方だけではありません。特に、動的なUIを持つアプリでは、waitForIdleTimeout
がテスト実行のボトルネックになっている可能性があります。
この値を適切に調整することで、パフォーマンスを大幅に改善できる場合があります。同様の問題に直面している方の参考になれば幸いです。