Appium + Android で ウェブサイトの自動実行を試してみた

2021.07.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

前回はネイティブアプリをAppiumで自動実行してみました。
今回はネイティブアプリではなく、ブラウザを使ってウェブサイト、ウェブアプリ上での自動実行をやってみたいと思います。

どうやるのか

capabilitiesbrowserNameChrome を指定することで、Appiumクライアント実行時にブラウザアプリケーションが立ち上がります。
アプリケーションやアクティビティは指定しません。

  capabilities: {
    platformName: "Android",
    platformVersion: "9",
    deviceName: "Android Emulator",
    browserName: "Chrome",
    automationName: "UiAutomator2"
  }

また、要素の取得方法はWeb用の実装を行います。
具体的には、CSS Selectorで要素を取得し、操作を行います。
Styleで要素を検索するなら . を使い、idなら # が使えます。
以下の実装では、タグや属性で検索する方法も使っています。

やってみる

以下にコードを載せておきます。

ただ、スクロールの方法はちょっとイマイチな気がしています。
オフセットを数値で指定すると、動かない環境が出てきそうな気がする。
できれば取得した要素に対してそこまでスクロールさせるオプションがあると良いのですが、見当たりませんでした。
良い方法ご存知の方いらっしゃったらぜひ教えてください。

index.js

const wdio = require("webdriverio");
const assert = require("assert");

const opts = {
  path: '/wd/hub',
  port: 4723,
  capabilities: {
    platformName: "Android",
    platformVersion: "9",
    deviceName: "Android Emulator",
    browserName: "Chrome",
    automationName: "UiAutomator2"
  }
};

const DEFAULT_TIMEOUT = 15000;
const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));
async function main () {
  const client = await wdio.remote(opts);

  await client.url("https://classmethod.jp/");

  const menuButton = await client.$(".header__menu");
  await menuButton.waitForDisplayed({timeout: DEFAULT_TIMEOUT});
  await menuButton.click();

  await sleep(2000);
  await client.touchScroll(0, 500);
  await sleep(1000);

  const siryoButton = await client.$('a[href="/download/company-overview/"]');
  await siryoButton.waitForDisplayed({timeout: DEFAULT_TIMEOUT});
  await siryoButton.click();

  await client.deleteSession();
}

main();

まとめ

CSS Selector を使いこなす必要があります。
個人的にはネイティブアプリより少し実装が大変でした。
また、ライブラリや言語ごとにAppiumの実装方法がバラバラなため、参考情報が少ない印象がありました。

AppiumのInspector機能を使うと要素の解析などを行うことが出来ます。
しかしコード生成機能は古いコードが出力され使えませんでした。
この機能が活用できるともう少し実装の敷居が低くなりそうです。