Crosswalk Web Driverの導入方法

Crosswalk Web Driver導入の備忘録

日本語資料がなくて困ったので、これから先同じような人がイージーゲームになるようにここへ記しておきます。

Androidアプリケーションにcrosswalkを導入している場合、UIテストにAppiumが使えないらしいですね。ググってみると非対応だとか、今後検討するといった内容がヒットしますが、成功したという話は今のところ目にしていません。
そこでCrosswalk Web Driverを用いて、selenium webdriverを利用したUIテストを試すことにしました。
が、これがなかなか曲者だったというのが今回のお話です。

なお、今回は実機テストを前提としています。
エミュレーターを用いたテストについては試していませんが、adb devices一覧に出てくるようになれば同じように動作すると思われます。

※今回はあくまでUIテスト用の環境構築です。セキュリティ関係には触れませんので、ファイアウォール等の設定に関してはしっかりと行っておいてください!

必要な環境

  • インターネットに接続されたLinux PC (今回はVirtualBox上のDebian 8.2 x86_64で試しました)
  • USBデバッグ可能なAndroid端末

導入方法

まず、Linuxな環境を用意します。バイナリであるxwalkdriverは32bit/64bit両対応しているようですし、有名どころであれば恐らく問題ないと思います。
※途中、あらかじめインストールされていないパッケージやライブラリがあれば適宜インストールすること。

最初にLinuxの端末へログイン。必要なバイナリをそろえましょう。
githubからCrosswalk Web Driverのプロジェクトをクローン。
git clone https://github.com/crosswalk-project/crosswalk-web-driver.git

ファイル構成や権限等を確認した後、https://github.com/crosswalk-project/crosswalk-web-driver/blob/master/xwalkdriver/README.txtを確認しつつ、テスト用のpythonコードを書いて保存。これは最後に使います。

from selenium import webdriver

capabilities = {
        'xwalkOptions': {
                'androidPackage': 'パッケージ名',
                'androidActivity': 'アクティビティ名',
                'adb-port': 5037,
        }
}

driver = webdriver.Remote('http://127.0.0.1:9515', capabilities)
driver.save_screenshot("screenshot.png")
driver.quit()

https://github.com/crosswalk-project/crosswalk-web-driver/blob/master/xwalkdriver/README.txt より一部引用

次に、selenium用の環境を整えます。
今回はDebian 8.2の環境なので、以下のようにしました。
sudo apt-get install python-pip & sudo pip install selenium

でもって、adbをインストールします。Debian 8だと、sudo apt-get install android-tools-adbなんかで入りました。
私は他にもAndroid SDKをインストールしたりしましたが、多分ADBさえインストールされていれば動作すると思います。

そして、adbにAndroid端末を認識させるため、http://uropan.net/2013/12/ubuntu%E3%81%A7android%E7%AB%AF%E6%9C%AB%E3%81%AE%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A/

http://askubuntu.com/questions/461729/ubuntu-is-not-detecting-my-android-deviceを参考にして作業を行います。
作業後、Linux端末側で
adb start-server と打ち込み、Android端末側で承認した後、
adb devices
でAndroid端末が表示されれば認識完了です。
※なお私の場合、rulesファイルへの追記だけでは効果が得られず、後者のaskubuntuに出ている /dev/bus/usb/ 〜 に対してパーミッションを与える方法を取った途端に認識するようになりました。
また、VirtualBoxで動作させる場合、VirtualBoxの設定でAndroid端末のUSB接続をVMに割り当てる必要があります。

無事に認識できていることが確認できたら、netstat -plnを実行して、adb serverがデフォルトのポート5037で待ち受けているかを確認します。
もし、5037ポートで待ち受けておらず、UNIX domain socketsの欄に何食わぬ顔でadbが鎮座していた場合、以下の手順が必要となります(今回、私はここでハマった)。

ざっくり言えば、xwalkdriverはTCP 5037(ないしは何らかのTCPポート)でadbにアクセスしようとするので、そこでadbが待ち受けてくれていないと困る訳です。そこで、domain socket <-> TCP portの変換を行うため、socatを利用します。
今回の場合、socatを利用するには以下のコマンドを使います。
socat TCP-LISTEN:5037,reuseaddr,fork UNIX-CLIENT:/tmp/5037
私はデフォルトの5037ポートを使用していたため、このような形になりました。また、UNIX-CLIENT:以下にはnetstatで表示されたdomain socketのパスを入れます。環境によって変わっているかもしれないので、ここら辺は適宜変えること。
また、最後に&を付けないと端末が待機状態になるので注意が必要です。
実行できたら、再びnetstatを実行して、今度は正しく5037ポートで待ち受けられていることを確認します。

確認できたら、いよいよxwalkdriverの起動を行います。
最初にクローンしたディレクトリの中、具体的には crosswalk-web-driver/bin/ 下に実行バイナリが設置してあるので、自分の環境にあったものを選択して実行すればOKです。
私は64bit環境だったので、 xwalkdriver64_release を実行。&を付けないと端末が待機状態になるので注意です。
私の環境では、「依存関係で必要ないくつかのライブラリが無いよ!」と怒られて、エラーが出る度に該当のライブラリ周りをインストールする必要がありました。ここも要注意。
正常であれば、Starting 〜 という表示が出ます。

実行できたら、最後に接続テストです。
最初に保存したテスト用pythonコードを実行します。
python (テスト用コード名).py

何もエラーが出ず、Android端末でテスト対象アプリが起動すれば成功です。お疲れ様でした。


手順が複雑な上、私も試行錯誤して作業が完了した後でこれを書いているので、抜けている部分もあるかもしれません。
そこら辺は予めご了承願います。訂正等あればできる限り対応いたします。