RobotFramework + SeleniumLibraryにて、Android実機上のChromeを使ってテストする

Android実機上のChromeを使うテストをRobotFrameworkで書く機会があったため、メモを残します。

なお、環境構築などは以下が参考になりました。ありがとうございました。

 
目次

 

環境

 
なお、このMacにはJDK1.8がインストール済です。必要かどうか分かりませんが、うまくいかない場合はJDKも入れてみてください。

 

準備

Android接続環境の構築

手元のMacにはAndroid接続環境がなかったため、環境を構築します。

Slideshareの資料では、Android SDK Toolsをインストールし、 adb devices を使ってAndroid実機が接続されているかを確認していました。

現時点でadb コマンドを使うには Platform-tools のインストールが必要です。
IDE および SDK ツールの更新 | Android Studio

そのため、

  • Android Studioをインストールし、Platform-toolsをGUIでインストール
  • Android SDK Toolsをダウンロードし、Platform-toolsをCUIでインストール
    • 昔はAndroid SDK ToolsのGUIでインストールできたが、最近削除された

のどちらかを行います。

 
今回は

  • Android実機にアプリをデプロイすることはない
  • Android実機上のChromeを動かすだけ
  • インストールは必要最小限にしたい

のため、Android SDK ToolsのCUIでインストールすることにしました。

 

Android SDK Toolsのダウンロード

以下のページの下部にある、「コマンドライン ツールのみ入手する」からダウンロードします。
https://developer.android.com/studio/index.html?hl=ja#downloads

今回は、 sdk-tools-darwin-3859397.zip をダウンロードしました。

ダウンロード後、任意のディレクトリに展開しました。

 

platform-toolsのインストール

以下を参考に、sdkmanager を使ってコマンドラインにてインストールします。
sdkmanager | Android Studio

# インストール可能なものを確認
$ ./bin/sdkmanager --list
...
platform-tools                    | 26.0.0       | Android SDK Platform-Tools       
...

# platform-toolsをインストール
$ ./bin/sdkmanager "platform-tools"
# 途中でAcceptが出るので、y
Accept? (y/N): y
done

 

接続確認

以下の手順に従い、端末の接続を確認します。
ハードウェア端末上でアプリを実行する | Android Studio

なお、MacにはUSB Driverは不要のようです。

$ ./platform-tools/adb devices
List of devices attached
* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *
xxxxxxxx     unauthorized

 
この時点で実機を見ると「USBデバックを許可しますか?」が表示されるため、OKを押します

再度実行します。

$ ./platform-tools/adb devices
List of devices attached
xxxxxxxx     device

認識されたようです。

 

.bashprofileの設定

以下を参考に、末尾に設定を追加します。
android sdk tools 25.3.0 に関しての備忘メモ - exception think

# for Android
export ANDROID_HOME=$HOME/android/
PATH=$ANDROID_HOME/tools:$PATH
PATH=$ANDROID_HOME/tools/bin:$PATH
PATH=$ANDROID_HOME/platform-tools:$PATH

 

ChromeDriverの起動

事前にChromeDriverを起動しておくことで、Android実機上のChromeに接続できるようになります。

$ chromedriver
Starting ChromeDriver 2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) on port 9515
Only local connections are allowed.

 
以上で準備が完了しました。

 

テストコードの実行

RobotFrameworkのテストコードを作成
Create Webdriverについて

以前同様、GooglePythonを検索するテストコードを作成します。

ポイントはCreate Webdriverのところです。

PythonSelenium

options = webdriver.ChromeOptions()
options.add_experimental_option('androidPackage', 'com.android.chrome')
driver = webdriver.Chrome(chrome_options=options)

となる場合、RobotFrameworkでは

${options} =  evaluate  sys.modules['selenium.webdriver'].ChromeOptions()  sys
call method  ${options}  add_experimental_option  androidPackage  com.android.chrome
create webdriver  Chrome  chrome_options=${options}

となります。

 

ソースコード全体
*** Settings ***

Library  SeleniumLibrary


*** Keywords ***
GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する
    # 以下のコードをRobot Framework風にした
    # http://qiita.com/orangain/items/db4594113c04e8801aad

    # 以下を参考に、Chromeのオプションを追加して、Chromeを起動する
    # https://sites.google.com/a/chromium.org/chromedriver/getting-started/getting-started---android
    ${options} =  evaluate  sys.modules['selenium.webdriver'].ChromeOptions()  sys
    call method  ${options}  add_experimental_option  androidPackage  com.android.chrome
    create webdriver  Chrome  chrome_options=${options}

    # Googleのトップ画面を開く
    go to  https://www.google.co.jp/

    # タイトルにGoogleが含まれていることを確認する
    ${page_title} =  get title
    should contain  ${page_title}  Google

    # 検索後を入力してEnter
    input text  name=q  Python
    # Robot FrameworkではEnterキーは\\13になる
    # https://github.com/robotframework/Selenium2Library/issues/4
    press key  name=q  \\13

    # Ajax遷移のため、適当に2秒待つ
    sleep  2sec

    # タイトルにPythonが含まれていることを確認する
    ${result_title} =  get title
    should contain  ${result_title}  Python

    # スクリーンショットを撮る
    capture page screenshot  filename=result_google_python.png

    # ログを見やすくするために改行を入れる
    log to console  ${SPACE}

    # 検索結果を表示する
    @{web_elements} =  get webelements  css=h3 > a
    :for  ${web_element}  in  @{web_elements}
    \  ${text} =  get text  ${web_element}
    \  log to console  ${text}
    \  ${href} =  call method  ${web_element}  get_attribute  href
    \  log to console  ${href}

    # ブラウザを終了する
    close browser


*** TestCases ***

GoogleでPythonを検索するテスト
    GoogleでPythonを検索してスクリーンショットを撮り、結果を出力する

 

テストの実行

Android実機上でChromeが起動し、テストコードが実行されました。

$ robot google.robot 
================================
Google
================================
GoogleでPythonを検索するテスト
Python - ウィキペディア
https://ja.wikipedia.org/wiki/Python
...
GoogleでPythonを検索するテスト    | PASS |

 
スクリーンショットAndroid上のChromeの画面が撮れていました。

f:id:thinkAmi:20170901220911p:plain

 

ソースコード

GitHubに上げました。 selenium_android_sample/android_chrome.robot ファイルが今回のテストファイルです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples