この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
前回はネイティブアプリをAppiumで自動実行してみました。
今回はネイティブアプリではなく、ブラウザを使ってウェブサイト、ウェブアプリ上での自動実行をやってみたいと思います。
どうやるのか
capabilities
の browserName
で Chrome
を指定することで、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機能を使うと要素の解析などを行うことが出来ます。
しかしコード生成機能は古いコードが出力され使えませんでした。
この機能が活用できるともう少し実装の敷居が低くなりそうです。