SeleniumのAndroidDriverでAndroid端末を操作する方法 (Java)
ここでは Java版の Selenium WebDriver に含まれる AndroidDriver を利用して、Android端末(実機)のブラウザを操作するまでの手順を説明します。
前提
手順を進めるにあたり以下の前提がありますので、前提をクリアしてから手順を開始してください。
- Java SE Development Kit (JDK) がインストールされていること
手順
作業を始める前に、ざっとどのような手順/工程があるのかを記します。
- Android SDK のインストール
- Android端末をデバッグ可能モードへ
- ABD用USBドライバのインストール
- Androidアプリ「WebDriver」をAndroid端末へインストール
- Androidアプリ「WebDriver」の起動と設定
- ポートフォワード設定
- Javaコードの実行
では、1つずつ手順を説明していきます。
1. Android SDK のインストール
Android Developers の Android SDK のページ から、Android SDK をダウンロードしてインストールします。 本記事の執筆時では r18 が最新でしたが、インストーラーを起動して [NEXT] ボタンを押していくだけで問題なくインストールが完了しました。
尚、Windows Vista 以降の Windows を利用している場合、Android SDKをインストールしたフォルダ (C:\Program Files\Android\android-sdk) に変更権限がない場合があります。 その場合、インストールしたフォルダに変更権限を付与して以下の作業を継続するようにしてください。
2. Android端末をデバッグ可能モードへ
パソコンとAndroid端末接続する前に、Android端末を「デバッグ可能モード」へ変更する必要があります。 Androidのアプリ一覧から、以下のメニューを辿ってください。
設定 > アプリケーション > 開発 > USBデバッグ をONにする。
3. ABD用USBドライバのインストール
パソコンに接続するAndroid端末用のUSBドライバをインストールします。 利用している端末のメーカーサイトからダウンロードすることができます。 今回は docomo F-03D を利用するため、富士通の以下のページより ABD用USBドライバをダウンロードしました。 主なキャリアのダウンロードページを下記に記します。
- Sharp – SH Developers Square
- https://sh-dev.sharp.co.jp/android/modules/driver/
- NEC mobile – ソフトウェアダウンロード
- http://www.n-keitai.com/guide/download/
- 富士通 – 携帯電話(Android携帯端末ソフトウェア開発者向けサポート情報)
- http://spf.fmworld.net/fujitsu/c/develop/sp/android/
- 京セラ – ダウンロード
- http://www.kyocera.co.jp/prdct/telecom/consumer/support.html
- Panasonic – お客様サポート
- http://panasonic.jp/mobile/support/
- Sony Mobile Communications – サポート
- http://www.sonymobile.co.jp/support/
- Samsung – ダウンロード
- http://www.samsung.com/jp/support/download/supportDownloadMain.do
それぞれのAndroid端末のドライバーをダウンロードして、USBケーブルでパソコンとAndroid端末を接続し、ダウンロードしたドライバを利用して端末を認識させます。 認識すると、デバイスマネージャーで「Android Phone」というカテゴリに接続した端末が紐付いていることが確認できます。
※但し、私の場合、ここでかなりハマりました。 最初は intel のチップセット関連のドライバがパソコンにインストールされていなかったので intel のホームページからダウンロードしてチップセットドライバを最新化し、もう一度試したら今度は、一度USBストレージとしてスマフォ本体を認識してしまうといくら差し替えてもUSBデバイスとして認識されてしまうような問題が発生しました。以下のホームページを参考にさせてもらい解決しました。
http://blog.collab-it.net/2011/08/androidusbusb.html
…無事、ABD用USBドライバをインストールできましたでしょうか?
4. Androidアプリ「WebDriver」をAndroid端末へインストール
Google Code の selenium のダウンロードページから、Androidアプリ「WebDriver」をダウンロードします。 執筆時のアプリのバージョンは 2.21.0 でした。
http://code.google.com/p/selenium/downloads/list
ダウンロードが完了したら、先に以下のコマンドでパソコンに接続されたAndroid端末のシリアルIDを確認します。 ここでは、Android SDK は「c:\Program Files\Android\android-sdk」にインストールされたものとします。
C:\Users\>cd "c:\Program Files\Android\android-sdk\platform-tools"
c:\Program Files\Android\android-sdk\platform-tools>adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
F03D152099 device
上記のようにデバイスのリストが表示されて、今回接続した端末のIDは「F03D152099」だということがわかりました。
Android端末にダウンロードしたapkファイル(Androidアプリ)をインストールします。 下記の例では、デスクトップに保存したapkファイルをインストールします。
c:\Program Files\Android\android-sdk\platform-tools>adb -s F03D152099 -e install -r c:\Users\myname\Desktop\android-server-2.21.0.apk
3942 KB/s (1881490 bytes in 0.466s)
pkg: /data/local/tmp/android-server-2.21.0.apk
Success
Successと表示されればインストール完了です。
5. Androidアプリ「WebDriver」の起動
引き続き、コマンドプロンプトからインストールした Android WebDriver アプリを起動します。
c:\Program Files\Android\android-sdk\platform-tools>adb -s F03D152099 shell am start -a android.intent.action.MAIN -n org.openqa.selenium.android.app/.MainActivity
Starting: Intent { act=android.intent.action.MAIN
cmp=org.openqa.selenium.android.app/.MainActivity }
Android端末の画面が変化し、WebDriverというタイトルの画面は真っ暗なアプリが起動されたことを確認します。
6. ポートフォワード設定
以下のコマンドで、パソコンからAndroid端末へのポートフォーワード設定を行います。 どうやら AndroidDriver クラスのデフォルトの接続先が 8080 ポートっぽいです。
c:\Program Files\Android\android-sdk\platform-tools>adb -s F03D152099 forward tcp:8080 tcp:8080
ここまでで Selenium WebDriver でAndroid端末を操作する順位が整いました。
7. Javaプログラム
では実際にJavaのコードからAndroid端末を操作してみます。 Android端末のブラウザでGoogleにアクセスし「selenium」という検索キーワードを入力して検索するソースコードを書いてテストをしました。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.android.AndroidDriver;
public class Main {
public static void main(String[] args) {
WebDriver driver = new AndroidDriver();
driver.get("http://www.google.co.jp");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys("selenium");
element.submit();
driver.quit();
}
}
うまくできましたか?
一度、ここまでの手順が済んでしまえば、次からは上記の手順5からを行えばSeleniumで操作を行うことができます。
トラブルシューティング
私がこの記事を執筆する際に陥ったトラブルについて記述します。
SDカードがささっていない場合に例外が発生する
Android端末にSDカードがささっていない場合に、以下のような例外が発生する場合があります。 SDカードに一時ファイルを作成しようとして失敗しているようです。 解決方法としては単純にSDカードを挿せば良いです。 (一時ファイルの作成場所を変更する方法もあるかもしれませんが、そのような方法は調べていないのでわかりません。)
Exception in thread "main" org.openqa.selenium.WebDriverException: Cannot create temp directory: /sdcard/1343233441787
フリーWi-Fiスポットで接続エラーが発生する
とある町中にあるフリースポットを利用した時に、通信クラスで例外が発生したことがありました。 たぶん通信確立までのハンドシェークやネゴシエーションが普通のWi-Fiとかと違うのかな? とりあえず、そのフリースポット以外では通信エラーが起きていません。