中年エンジニアの開発と生活の日々

中年エンジニアがソフトウェア開発や日々の生活で得た知見の備忘録

iOSとAndroidのAppiumスクリプトを共通化する

iOSAndroid のクロス開発を行っていますが、双方のプラットフォームで作成したアプリケーションを Appium を使用してシステム検証を行っています。

Appium はマルチプラットフォームのモバイルアプリケーションテストフレームワークなので、iOSAndroid も Appium で同じように動かすことができます。

ただ、実際にテストスクリプトを共通化しようとすると、いくつか気をつける箇所が出てきます。

具体的には2つのパターンがあります。 - iOSAndroid で Appium の API が異なる - API は同じだけれども、Appium の挙動が異なる

Swipe などの UI 操作

Swipe などの UI 操作は前者で iOSAndroidAPI が異なります。

iOSでは始点の座標と移動量をパラメータとして渡します

Appium::TouchAction.new.swipe(start_x: startX, start_y: startY, offset_x: offsetX, offset_y: offsetY,  duration: 1000).perform

Android では始点の座標と終点の座標を渡します。

Appium::TouchAction.new.swipe(start_x: startX, start_y: startY, end_x: endX, end_y: startY, duration: 1000).perform

なお、両方のパラメータを設定してもOKです。必要ないものは無視されます。両方とも設定することによって、どちらでも動くコードになります。

Appium::TouchAction.new.swipe(start_x: startX, start_y: startY, offset_x: offsetX, offset_y: offsetY, end_x: endX, end_y: startY, duration: 1000).perform

設定する座標系は iOSAndroid で異なりますので 操作の対象となる View などから取得するのが良いでしょう。

まとめ

Appium でも API レベルで AndroidiOS で異なるものがある

UI コントロールの取得

Appium では find_emenet() を使用して、UI パーツにアクセスします。このとき、ID で検索するか View の ツリー構造の xpath で検索することができます。

AndroidiOS ではどうしても View の構造などが合わないため、UIコントロールを find_element() で取得する際に xpath を使用すると、iOSAndroid で同じ値にはなりません。そのため、UI に ID を埋め込み、ID を使用して find_element() を実行して UI パーツにアクセスする必要があります。

iOS では Accessibility Identifier、 Android では View Tag などに埋め込むことができますが、Appium の制限事項で 2017年7月の時点では Android アプリの View Tag を使用して find_element() を使用することができません。そのため、現状の Android 版では Content Description に検証用の ID を埋め込んでいます。

まとめ

iOSAndroid で同じ UI パーツに対して同じ ID を割り当てる。そして Appium からアクセスする際は ID で検索する

表示文字列の値の取得方法

iOS では UI 上に表示している文字列を取得する際に、文字の配置されている View の text プロパティとして値が取得できるのに、Android では View の text プロパティとして取得することができません。

iOS でも Android でも表示文字のコントロールの text プロパティから取得することができます。一手間かかりますが、Android の流儀でテキストの表示文字の値を取得します。

まとめ

表示文字の値を取得する場合は表示文字列に ID を割り当てて、テキストコントロールから直に値をとる

最後に

いくつか AndroidiOS をクロス開発する際に Appium で効率的にテストスクリプトを書くためのトピックをまとめてみました。お役に立てればうれしいです。