0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Appium で要素検索、要素クリックに異常に時間がかかる問題

Posted at

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秒くらいかかっていた処理が一瞬で終わるようになりました。

その他の試み

今回の解決策にたどり着くまでに、いくつかの方法を試しました。

  • idXPath以外のセレクタを試す: UiSelectorを使ったdescriptionContainstextによる検索を試しましたが、今回のケースでは効果はありませんでした。
  • 'appium:pageLoadStrategy': 'none'を設定する: Appium の capabilities に設定を追加する方法です。ページの読み込みを待たない設定ですが、これも今回のケースでは効果ありませんでした。
  • 'appium:settings[ignoreUnimportantViews]': trueを設定する: Appium の capabilities に設定を追加する方法です。UI階層を簡略化する設定ですが、今回のケースでは効果ありませんでした。
  • 'appium:disableWindowAnimation': true を設定する: Appium の capabilities に設定を追加する方法です。UI の描画を早くするための設定ですが、これも今回のケースでは効果ありませんでした。

まとめ

Appium で Android アプリの要素検索が遅い場合、その原因は必ずしもセレクタの選び方だけではありません。特に、動的なUIを持つアプリでは、waitForIdleTimeout がテスト実行のボトルネックになっている可能性があります。

この値を適切に調整することで、パフォーマンスを大幅に改善できる場合があります。同様の問題に直面している方の参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?