するめごはんのIT日記

主にITネタを書いていくのさ

AppiumでAndroid driverを使うときに少しでもNoSuchElementExceptionを回避するための僕なりの方法3つ

ごきげんよう

showです。

AppiumでもSeleniumでも試験を自動化してると、でくわすやーつの代表格が
「NoSuchElementException」
だと僕は勝手に思ってます。
DOMの関係とかいろいろあって、見た目上では画面にテキストボックスがあるのに「そんなもんねーよ」とか言われるやつです。

そんなわけで、僕が最近AppiumでAndroid driverを使ってる時に少しでもNoSuchElementExceptionを回避するための僕なりの方法をとりあえず3つ書きます。
iOSはまた別の話があるので別で。

とはいっても、お仕事系は会社のブログがあるのでそっちに詳しいことは書くかもしれないので、とりあえずはざっくり。

そんなもん知ってるわ!
って人ももちろんたくさんいらっしゃると思いますが。

1.uiautomator2を使う

Android 7.0以上?ならuiautomator2が使いやすいです。
Android Studio 3.0.1で、それなりにSDKとか環境が整っていれば

capabilities.setCapability("automationName", "uiautomator2");

を宣言するだけで使えます。
これだけでだいぶ違う。

そもそもuiautomator2の前のuiautomatorが一部バグってるっぽくて、イマイチな動きをします。
ごにょごにょしたんですけど詳しく書いたらいろんな人に怒られるかもなんで詳細は今回は控えるとして
とりあえず回避できるなら「2」を使った方が良さげだと思ってます。

2.要素の取得をMobileBy.AndroidUIAutomatorで実施する

これは環境にもよりけりで、↑のuiautomator2を使うとぶっちゃけ必要度が下がるんですけども、要素を取得する際に、こいつで取得する方が成功率が高いです。※僕の環境だと。

使い方は申し訳ないですが、ご検索を。

3.ExpectedConditions.presenceOfElementLocatedを使う

ちらっとSleepとは書きましたが、何秒待てばいいかなんて、そもそもナンセンスで運要素強いと思ってます。
本来は0.1秒で読み込めるかもなのに、無駄に数秒待ったりとかは塵積って山となるで、結果的に非効率です。

性能系の試験をする場合はあえてSleepで待たせるのもアリな場合があるかもですが。

なので、非同期処理というか、
ExpectedConditions.presenceOfElementLocated
を使用してあげて、現実的なレベルだけ要素が特定できるまで待機をさせるのがいい気がします。

特に画面遷移する際に読み込むのが遅くなる画面だと効果があります。
画像が読み込みまくるとか、ネットワーク処理がたくさんある場合とかではかませます。

「いやいやvisibilityOfElementLocatedの方がちゃんと表示されるまで待つだろ。DOMの読み込みだけになるだろが」

ってのもその通りかもなので、テストケースとか仕様とか、そこらへんと調整してください。


はい。 今回はこんな感じで。

ソフトウェア品質とかテストとかの勉強会があったら、偉い人OKがでれば詳しく話せるかもなんだけども。
偉い人に聞いてみるか。。