ローソンデジタルイノベーション テックブログ

ローソンデジタルイノベーション(LDI)の技術ブログです

AppiumでAndroidアプリの画面を操作・検証する

ども。LDI品質管理部の仙波です。
スマホアプリの自動テストを担当しています。

前回は IntelliJ IDEA+Appiumでスマホアプリのテスト環境をつくりました。
今回はAndroidの設定画面を例にテストコードの作成方法を紹介したいと思います。

作成するテストのイメージ

Androidの設定アプリを起動し、ネットワークとインターネット画面でWi-FiのスイッチがONになっていることを確認するテストを作成します。

f:id:wave1008:20210127234624p:plain

f:id:wave1008:20210129113026g:plain

Appium Desktopのインスペクターで画面情報を調べる

Appiumでアプリの画面を操作するには、まず画面へアクセスする方法を調査して決定する必要があります。
インスペクターを使用すると画面をキャプチャして要素の情報を確認することができます。

  1. インスペクターを起動します。(前回の記事をご参照ください)
  2. 画面情報を調べたい画面(ここでは設定アプリのトップ画面)を表示し、インスペクターのRefresh Source & Screenshotをクリックします。
  3. キャプチャされた画面上でアクセスしたい要素をクリックします。


f:id:wave1008:20210129103921p:plain

クリックした要素のtext属性の値が"ネットワークとインターネット"であることがわかります。


次に、「ネットワークとインターネット」画面においてWi-Fiのスイッチを調べます。


f:id:wave1008:20210129104208p:plain

f:id:wave1008:20210113004017p:plain

  • Wi-Fiのスイッチをユニークに指定する方法はいくつかありますが、content-descが設定されているのでこれを利用します。※content-descはアクセシビリティのために用意されている属性です。
  • スイッチのトグルの状態は一般にはchecked属性に設定されるので、これを利用します。このアプリではtext属性にON/OFFが設定されるのでこれを利用することもできます。

画面操作を実行するテストコードを作成する

以下の手順を実行するテストコードを作成してみます。

  1. text属性が"ネットワークとインターネット"である要素を取得する
  2. 取得した要素をタップ(クリック)する
  3. 画面のスクリーンショットを取得する
  4. Wi-FiのスイッチがONであることを検証する


f:id:wave1008:20210127234624p:plain



  • 前回作成したHelloAppiumクラスに以下のコードを追加します。
    @Test
    fun clickAndScreenshot() {

        val d = getAppiumDriver()

        // ①「ネットワークとインターネット」を取得する
        val e = d.findElementByXPath("//*[@text='ネットワークとインターネット']")

        // ②取得した要素をクリックする
        e.click()

        // ③スクリーンショットを取得してダウンロードフォルダへ格納する
        Thread.sleep(500)
        val screenshot = d.getScreenshotAs(OutputType.FILE)
        val downloads = Path.of(System.getProperty("user.home")).resolve("Downloads")
        screenshot.copyTo(File("$downloads/screenshot1.png"), overwrite = true)

        // ④Wi-FiのスイッチがONであることを検証する
        val wifiSwitch = d.findElementByXPath("//*[@content-desc='Wi-Fi']")
        assertThat(wifiSwitch.getAttribute("checked")).isEqualTo("true")    // checked属性の値で検証
        assertThat(wifiSwitch.getAttribute("text")).isEqualTo("ON")         // text属性の値で検証
    }

解説

①ではAppiumDriverのfindElementByXPathメソッドを使用してtext属性が"ネットワークとインターネット"である要素を取得しています。
このメソッドを使用すればXPathによる柔軟な要素検索を実行できます。

②では取得した要素(MobileElement型)のclickメソッドを実行しています。
Appiumでタップを実行するにはこのメソッドを使用します。

③では以下を実行しています。

  • 画面遷移が完了するまで500ms待機する
  • AppiumDriverのgetScreenshotAsメソッドでスクリーンショットをファイルオブジェクトとして取得する
  • ユーザーのDownloadフォルダへスクリーンショットをコピーする

④ではfindElementByXPathメソッドを使用してcontent-desc属性が"Wi-Fi"である要素を取得しています。
さらにAssertJのassertThatメソッドを使用して、取得した要素のchekced属性が"true"であることを検証しています。


このようにAppiumのインスペクターを使用して操作対象の要素を取得するための属性を調べながらテストコードを作成していきます。

課題

ここで紹介した方法では1つの属性を指定して要素を検索して取得しています。目的の要素がピンポイントで取得できる場合は問題ありませんが、利用できる適切な属性がない場合はうまくいきません。

次回はそのような場合においても目的の要素を取得する方法を紹介します。