Appium + Android で ウェブサイトの自動実行を試してみた
いわさです。
前回はネイティブアプリをAppiumで自動実行してみました。
今回はネイティブアプリではなく、ブラウザを使ってウェブサイト、ウェブアプリ上での自動実行をやってみたいと思います。
どうやるのか
capabilities
の browserName
で Chrome
を指定することで、Appiumクライアント実行時にブラウザアプリケーションが立ち上がります。
アプリケーションやアクティビティは指定しません。
capabilities: { platformName: "Android", platformVersion: "9", deviceName: "Android Emulator", browserName: "Chrome", automationName: "UiAutomator2" }
また、要素の取得方法はWeb用の実装を行います。
具体的には、CSS Selectorで要素を取得し、操作を行います。
Styleで要素を検索するなら .
を使い、idなら #
が使えます。
以下の実装では、タグや属性で検索する方法も使っています。
やってみる
以下にコードを載せておきます。
ただ、スクロールの方法はちょっとイマイチな気がしています。
オフセットを数値で指定すると、動かない環境が出てきそうな気がする。
できれば取得した要素に対してそこまでスクロールさせるオプションがあると良いのですが、見当たりませんでした。
良い方法ご存知の方いらっしゃったらぜひ教えてください。
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機能を使うと要素の解析などを行うことが出来ます。
しかしコード生成機能は古いコードが出力され使えませんでした。
この機能が活用できるともう少し実装の敷居が低くなりそうです。