目次
ネイティブアプリの場合
以下のいずれかの方法で実現可能です。
1. 共通のaccessibility idを付与する
- iOSアプリのソースコード上で、自動化したい各画面要素に対し、accessibilityIdentifierが指定されていなければ指定します(非エンジニアの方は、エンジニアに依頼する必要があります)。
- 次にAndroidアプリのソースコード上で、自動化したい各画面要素に対し、contentDescriptionが指定されていなければ指定します(非エンジニアの方は、エンジニアに依頼する必要があります)。この時、contentDescriptionの値は対応するiOSの要素の「accessibilityIdentifier」と同じ値にする必要があります。
- 1. 2.を行ったアプリファイルを使いMagicPodでUIスキャンを行えば、iOS、Androidの対応する要素がどちらも同じ値の「accessibility id」ロケーターを持つはずです。この値をテストに使うことで、同じテストスクリプトでiOSとAndroid両方をカバーすることができ、テストの作成コスト・メンテナンスコストを下げられます。
- 「accessibilityIdentifier」や「contentDescription」は端末の言語によって異なる値が付与されることがあるため、変数つきのロケータと多言語データパターンを組み合わせることで、次のように単一のロケーターを使い回すことができます。
2. [上級者向け] XPathを改善する
XPathにはテスト実行速度の問題がありますが、XPathはテスト対象アプリのツリー構造に基づいた柔軟な指定が可能なため、共通のaccessibility id を付与できない場合の有効な代替手段の1つです。例として、以下の入力欄に対するXPathの改善を考えてみます。
この時、iOSとAndroidで次のようなXPathがMagicPodから提案されたとします
- iOS: //XCUIElementTypeTextField[@name='Name *']
- Android: //android.widget.EditText[@text='Name *']
iOSのXPathの意図としては、「name属性にName *という値を持つ、画面上の任意の位置にあるXCUIElementTypeTextField要素」を指し示しています。Androidの場合も同様です。このままではiOSとAndroidで要素の名前や属性の名前が異なるため、共通のロケーターを使うことができません。そこで、この2つの違いを吸収することで両方のOSで動くロケーターに書き換えてみましょう。iOSとAndroidのXPathには要素名や属性名の違いはあるものの、iOSもAndroidも同様の意味合いのXPathを使っているため、例えば
//*[@${textAttribute}='Name *']というロケータに書き換えることができます。
まず、//*はXPathの表記でアプリのページソース上の任意の要素を指します。次に「${textAttribute}」はMagicPodの変数つきのロケータを使うための書式であり、「textAttribute」という変数の値をその位置に入れることができます。そのため、例えば「textAttribute」変数がnameという値を持つ時、MagicPodはこの変数つきのロケータを //*[@name='Name *'] のように解釈します。
以上を踏まえると、//*[@name='Name *'] の意図は「name属性に"Name *"という値を持つ、画面上の任意の位置にある要素」となります。「name属性」の部分は実際には変数化しているため、より正確には「${textAttribute}属性に"Name *"という値を持つ、画面上の任意の位置にある要素」という意味になります。iOSとAndroid間の違いをtextAttribute変数で吸収しているため、共有変数等でtextAttribute=nameあるいはtextAttribute=textのように指定することで、この変数つきのロケータをiOSおよびAndroidで使用することができます。
以上となります。ロケータの作り方についてはこちらも参考にしてください。
3. 条件分岐を使用する
やむをえず共通のaccessibility idを指定できないところ、XPathによる改善が難しい場合、または、テストケースを共通化できないところについては、特別な変数の「OS」の値で条件分岐することで、その部分だけiOSとAndroidで処理を分けることができます。
ハイブリッドアプリの場合
「WebViewをスキャン」を使って、UIをキャプチャすることで実現可能です。WebView部分をHTMLページとして扱えるようになるため、iOSとAndroidのWebView部分を同じロケーターを使って操作できるようになります。詳細はこちらをご覧ください。
制限事項
1つのテストケースでiOSとAndroidの両方のアプリをテストする場合、自動修復機能は利用できません。
例えば、iOSでキャプチャしたUIを元にテストケースを作成し、それをAndroidで実行した際にそのUI要素が見つからない場合、以下のメッセージが表示され、自動修復は行われません。
This UI cannot be healed because it's scanned on a different OS