はじめに
appiumはモバイルアプリケーションのためのテストフレームワークです。
テストを実行するとappiumを経由してAndiroidやiOSのシミュレーターの中でテストに書いた操作が実行されます。
今回はSelenium Grid Hubとappiumを組み合わせで使うときのMacでの環境構築をしたときのメモです。
(homebrewが入っている前提)
ゴール
selenium webdriverで書いた操作をappium経由でiOSのシミュレーターとAndroidのシミュレーターで動くようにする。
(※Xcode8.1+iOS10の環境で動かす方法は調べきれていません。
http://appium.io/slate/en/v1.6.0/?ruby#testing-using-xcode-8-including-ios-10-with-xcuitest
これを見ると、どうもcarthageを使う方法があるみたいなんですがよくわからんかったです。教えてエロい人)
環境
ソフトウェア | バージョン |
---|---|
OS | Mac OS X El Capitan |
appium | 1.6.0 |
node.js | 7.2.0 |
Selenium Standalone Server | 3.0.1 |
Android Studio | 2.2.2 |
JDK | 8 |
Xcode | 7.3.1 |
ruby | 2.3.1p112 |
selenium-webdriver | 3.0.3 |
必要になるものをインストール
brew cask
brew tap caskroom/cask
Selenium Standalone Server
下記URLからSelenium Standalone Serverをダウンロード
http://www.seleniumhq.org/download/
JDK
brew cask install java
Android Studio
brew cask android-studio
Android Studioの設定は省略
Xcode
7.3.1をダウンロード
https://developer.apple.com/download/more/
dmgをダウンロードしてインストールしますが、僕の環境ではXcode8.1も入っているため"Xcode_7.3.1"にリネームしました
carthage
brew install carthage
node.js
brew install node
appium
npm install appium@1.6.0
appium-doctor
npm install appium-doctor
selenium-webdriver
gem install selenium-webdriver --no-document
事前準備
appium-doctorを実行
appium-doctor
環境変数を設定
bashrcとかに書いといたらいいと思います
export JAVA_HOME="/Library/Java/Home"
export PATH="$JAVA_HOME/bin:$PATH"
export ANDROID_HOME="/Users/kytiken/Library/Android/sdk"
ANDROID_HOMEの値はAndroid StudioのPreferencesに書いてあった。
Selenium Grid Hubを起動
java -jar selenium-server-standalone-3.0.1.jar -role hub
(参考)http://docs.seleniumhq.org/docs/07_selenium_grid.jsp
iOSで動かす
nodeconfig.jsonファイルを作る
{
"capabilities":
[
{
"platformName": "iOS",
"platformVersion": "9.3",
"deviceName": "iPhone 6s",
"browserName": "Safari",
"language": "ja",
"maxInstances": 1,
"platform": "MAC"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4723/wd/hub",
"host": "localhost",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}
(参考)http://appium.io/slate/en/v1.6.0/?ruby#appium-server-capabilities
appiumを起動
export DEVELOPER_DIR=/Applications/Xcode_7.3.1.app
appium --nodeconfig nodeconfig.json
selenium-webdriverを使う
require 'selenium-webdriver'
SERVER_URL = 'http://localhost:4444/wd/hub'
capabilities = {
'platformName' => 'iOS',
'browserName' => 'Safari',
'deviceName' => 'iPhone 6s'
}
driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => SERVER_URL)
driver.navigate.to "http://google.co.jp"
puts driver.title
driver.quit
(参考)https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings#remote
ruby ios_sample.rb
Androidで動かす
nodeconfig.jsonファイルを作る
{
"capabilities":
[
{
"platformName": "Android",
"platformVersion": "7.1.1",
"deviceName": "Nexus 5",
"browserName": "Chrome",
"language": "ja",
"maxInstances": 1,
"platform": "Android"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4723/wd/hub",
"host": "localhost",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}
(参考)http://appium.io/slate/en/v1.6.0/?ruby#appium-server-capabilities
appiumを起動
appium --nodeconfig nodeconfig.json
selenium-webdriverを使う
require 'selenium-webdriver'
SERVER_URL = 'http://localhost:4444/wd/hub'
capabilities = {
'platformName' => 'Android',
'browserName' => 'Chrome',
'deviceName' => 'Nexus 5'
}
driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => SERVER_URL)
driver.navigate.to "http://google.co.jp"
puts driver.title
driver.quit
(参考)https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings#remote
ruby android_sample.rb
nodeconfigの書き方
説明のために分けて書きましたが1つに書いたらいいです
{
"capabilities":
[
{
"platformName": "iOS",
"platformVersion": "9.3",
"deviceName": "iPhone 6s",
"browserName": "Safari",
"language": "ja",
"maxInstances": 1,
"platform": "MAC"
},
{
"platformName": "Android",
"platformVersion": "7.1.1",
"deviceName": "Nexus 5",
"browserName": "Chrome",
"language": "ja",
"maxInstances": 1,
"platform": "Android"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4723/wd/hub",
"host": "localhost",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}
(参考)http://appium.io/slate/en/v1.6.0/?ruby#appium-server-capabilities
さいごに
ものぐさな人(自分)のためにansible-playbookを作りました
https://github.com/kytiken/selenium_grid_hub_and_appium_sample