Appium連携のチュートリアル
概要
Appium は、スマホやタブレットのテスト自動化を実現するためのテストフレームワークのひとつです。以前より Remote TestKit では仮想 ADB 機能や Xcode 連携機能 (Xcode connector) を用いることで、ローカル PC 上に構築された Appium 環境を用いたテスト自動化が可能でした。新しく、 Remote TestKit Appium Cloud により、 Appium サーバ環境を構築することなく簡便に Appium のテストスクリプトを実行することが可能となり、 CI 環境との連携も容易に実現することが可能となりました。
※ Remote TestKit Appium Cloud は、 Flat 3以上のプランをご契約しているお客様のみご利用いただけます。
Remote TestKit がサポートする Appium 連携について
■Remote TestKit を用いない場合の Appium 環境
Appium によるテスト自動化を行うためには、一般的には図に示すように、 Appium を動作させるローカル PC 内に Node.js や Appium Server などの実行環境を整えた上で、テストスクリプトを作成してスクリプトを実行させる必要がありました。またテストスクリプトで用いる端末もローカル PC に接続された実機端末のみが対象となり、 Android / iOS シミュレータを用いらざるを得ないケースも多々ありました。
■Remote TestKit の仮想 adb 機能 / Xcode 連携を用いた Appium 環境
Remote TestKit では、従来より仮想 ADB 機能や Xcode 連携機能 (Xcode connector) を用いることで、クラウド上の端末を用いた Appium 環境を構築することが可能です。この構成では低レイヤーでクラウド上の端末と連携するため、 Appium 以外のテストフレームワークとの連携が可能というメリットがあります。
※ iOS 端末においては Xcode を用いたデバッグで一部機能制限があります。
■Remote TestKit Appium Cloud を用いた Appium 環境
Remote TestKit Appium Cloud を利用することで、 Appium を用いたテスト自動化においてはユーザがテストスクリプトさえ用意すれば、 Node.js や Appium server 等の実行環境を整えることなく動作可能となりました。また、本機能を用いることで社内外の CI 環境との連携も容易に実現することが可能となり、本来業務としてのテストスクリプトの開発に集中することができます。新機能を用いた Appium 環境は図のとおりです。
※現時点では Android 4.4 以上または iOS 10.3 以上の端末に対応
※ Remote TestKit Appium Cloud は、 Flat 3以上のプランをご契約しているお客様のみご利用いただけます。
各種 Appium 環境との比較
前述した3つの環境についての比較は下記表のとおりとなります。
Remote TestKit Appium Cloud を用いた環境 | Remote TestKit 仮想 adb 機能 / Xcode 連携を用いた環境 | Remote TestKit なしの環境 | |
---|---|---|---|
Server 環境構築 | 不要 | 必要 | 必要 |
Client ライブラリ | 必要 | 必要 | 必要 |
スマートフォン実機 | 不要 | 不要 | 必要 |
テストスクリプト実行場所 | ローカル PC | ローカル PC | ローカル PC |
Appium 以外の連携 | 不可 | 可 | 可 |
CI 環境との連携 | 簡易 | ThriftAPI による連携が必要 | 実機連携はやや困難 |
解決される課題
テスト自動化に取り組まれている企業で課題となるのが CI(継続的インテグレーション)での実機検証です。市中の CI サービスは海外のサービスが多く、端末ラインナップも海外端末がほとんどです。一方、 Jenkins 等を用いて自社内に CI 環境を構築する場合は、実機検証環境を用意し運用することは大変です。今回リリースされる Remote TestKit の新しい Appium 機能を用いることで、 CI 環境から実機検証を比較的容易に実現することが可能となります。
Remote TestKit Appium Cloud を用いた Appium 連携の手順
基本的には、ローカル PC 上の Appium 環境で動かしているテストスクリプトの Capabilities の設定を変更するだけで、 Appium 自動テストクラウドをご利用いただけます。以下、 Ruby 言語によるテストスクリプトの例を挙げながら説明いたします。まずはじめに、 Ruby が実行可能なPCを準備してください。
Appium Client ライブラリのインストール
Appium Client ライブラリを下記の手順でインストールします。
gem install selenium-webdriver -v 4.15.0
gem install appium_lib -v 13.0.1
gem install appium_lib_core -v 7.3.2
接続先の説明
Appium クライアント(テストスクリプト)の接続先として、通常ローカル PC 上で実行しているときに "http://localhost:4723/wd/hub" としている部分を "https://gwjp.appkitbox.com/wd/hub" に変更します。
・Ruby でのコード例
@driver = Appium::Driver.new(
caps: {
...
},
appium_lib: {
#server_url: 'http://localhost:4723/wd/hub',
server_url: 'https://gwjp.appkitbox.com/wd/hub',
wait: 60
}
).start_driver
ユーザ認証
Appium クライアントの接続時の認証には、 Remote TestKit のユーザ名・パスワードを Capabilities に指定するか、アクセストークンを Capabilities に指定します。アクセストークンはソフトウェア版のメニューから生成することが可能です。
Capabilities名 | 値 |
---|---|
userName | Remote TestKit のユーザ名 |
password | Remote TestKit のパスワード |
accessToken | Remote TestKit のトークン |
・Ruby でのコード例(ユーザ名・パスワード認証の場合)
@driver = Appium::Driver.new(
caps: {
userName: "Remote TestKit のユーザ名",
password: "Remote TestKit のパスワード",
...
},
appium_lib: {
...
}
).start_driver
・Ruby でのコード例(アクセストークン認証の場合)
@driver = Appium::Driver.new(
caps: {
accessToken: "Remote TestKit のアクセストークン",
...
},
appium_lib: {
...
}
).start_driver
・アクセストークンの取得方法
ソフトウェア版のメニューから生成することが可能です。ソフトウェア版の右上メニューからアクセストークン設定をクリックすることで、アクセストークンを取得することができます。アクセストークンを再生成する場合は、再生成ボタンをクリックしてください。
Appium のバージョン指定
Android 端末に対しては、指定可能な Appium のバージョンは以下のとおりです。
1.7.2, 1.8.0, 1.8.1, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.11.0, 1.11.1, 1.12.0, 1.12.1, 1.13.0, 1.14.0, 1.14.2, 1.15.1, 1.16.0, 1.17.0, 1.17.1, 1.18.0, 1.18.1, 1.18.2, 1.18.3, 1.19.0, 1.19.1, 1.20.0, 1.20.1, 1.20.2, 1.21.0, 1.22.0, 1.22.1, 1.22.2, 1.22.3, 2.0.0, 2.0.1, 2.1.3
Capabilities名 | 値 |
---|---|
appiumVersion | 1.7.2, 1.8.0, 1.8.1, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.11.0, 1.11.1, 1.12.0, 1.12.1, 1.13.0, 1.14.0, 1.14.2, 1.15.1, 1.16.0, 1.17.0, 1.17.1, 1.18.0, 1.18.1, 1.18.2, 1.18.3, 1.19.0, 1.19.1, 1.20.0, 1.20.1, 1.20.2, 1.21.0, 1.22.0, 1.22.1, 1.22.2, 1.22.3, 2.0.0, 2.0.1, 2.1.3 のいずれかを指定 |
iOS 端末は詳細なバージョン指定をすることが出来ません。iOS 端末が接続されているサーバで設定された Appium のバージョンに依存した、固定のバージョンとなります。iOSのバージョンにより1.xと2.xのバージョンを上記Capabilitiesで指定することで切り替えることが可能です。
iOS Version | Appium 1.x | Appium 2.x | 指定なし |
---|---|---|---|
iOS 17.x | 利用不可 | 2.0.0 | 2.0.0 |
iOS 16.x | 1.22.3 | 2.0.0 | 2.0.0 |
iOS 15.x | 1.22.3 | 2.0.0 | 2.0.0 |
iOS 14.x | 1.22.3 | 2.0.0 | 2.0.0 |
iOS 13.x | 1.22.3 | 利用不可 | 1.22.3 |
iOS 12.x | 1.19.1 | 利用不可 | 1.19.1 |
iOS 11.x | 1.19.1 | 利用不可 | 1.19.1 |
iOS 10.x | 1.19.1 | 利用不可 | 1.19.1 |
端末指定
「機種名のみ」「機種名 & バージョン」の二種類の方法で、 Appium を実行する端末を指定できます。機種名には正規表現も指定することができます。指定する端末は、 Web クライアントや PC クライアントで確認します。
機種名のみで指定する場合
下記の Capabilities を指定します。
Capabilities名 | 値 |
---|---|
platformName | Android または iOS を指定 |
deviceName | 機種名を指定。"全体一致" → "スペースによる区切りありの前方一致" → "前方一致の正規表現" の優先順位で判定(大文字・小文字の区別なし) |
・Ruby でのコード例(Nexus 5を指定)
@driver = Appium::Driver.new(
caps: {
...
platformName: 'Android',
deviceName: 'Nexus 5X',
},
appium_lib: {
...
}
).start_driver
機種名 & バージョンで指定する場合
下記の Capabilities を指定します。機種名で絞り込んだ後、バージョンやデバイス ID で判定されて、端末が決定されます。
Capabilities名 | 値 |
---|---|
platformName | Android または iOS を指定 |
deviceName | 機種名を指定。"全体一致" → "スペースによる区切りありの前方一致" → "前方一致の正規表現" の優先順位で判定(大文字・小文字の区別なし) |
platformVersion | バージョンを指定。 PC クライアントの OS カラムの "Android" "iOS" を除いた部分を指定。"全体一致" → "前方一致の正規表現" の優先順位で判定 |
udid | 端末のデバイス ID を指定。"全体一致"で判定 |
・Ruby でのコード例(Nexus 5X の version8 を指定)
@driver = Appium::Driver.new(
caps: {
...
platformName: 'Android',
deviceName: 'Nexus 5X',
platformVersion: '8',
},
appium_lib: {
...
}
).start_driver
・Ruby でのコード例(iPhone 7の version とデバイス ID を指定)
@driver = Appium::Driver.new(
caps: {
...
platformName: 'iOS',
deviceName: 'iPhone 7',
platformVersion: '11.1',
udid: 'aea01650edff7cf42bc72c73e882b8ade545db85',
},
appium_lib: {
...
}
).start_driver
API を使った共有ストレージへのアプリのアップロード
Remote TestKit にはアプリストレージ機能というものがあります。これは、 PC クライアントのメニューからアプリケーションファイルをストレージへアップロードする機能です。
このメニューの代替として、 REST API を使ってコマンドラインからストレージへアプリをアップロードすることもできます。 CI 環境の利用を前提としたお客様などに便利な機能です。
概要
API を使って apk / ipa ファイルを Remote TestKit のストレージにアップロードする。
URL
https://gwjp.appkitbox.com/storage/xxxxxxxx
xxxxxxxxにアップロードするファイル名を指定してください。
Method Type
POST
curl コマンドでの実行例
RTK_USERNAME=xxxxxxxx
RTK_ACCESSTOKEN=xxxxxxxx
RTK_FILENAME=xxxxxxxx
curl -u $RTK_USERNAME:$RTK_ACCESSTOKEN -X POST -H 'Content-Type: application/octet-stream' https://gwjp.appkitbox.com/storage/$RTK_FILENAME --data-binary @/some/path/to/file
注意事項
ご利用にあたって、以下の注意事項があります。
- 日本語のファイル名を指定することはできません。
- 同じハッシュのファイルをアップロードすることはできません。
アプリのインストール
方法1. 自社サーバーからインストール
Remote TestKit からアクセス可能なお客様ご自身の公開サーバ等に apk または ipa をアップロードして、下記の Capabilities を指定します。※ 必要に応じて、社内の Firewall 等の設定に Remote TestKit からのアクセス許可設定を追加してください。アクセス元 IP アドレスは FAQ に記載があります。
Capabilities名 | 値 |
---|---|
app | apk または ipa をアップロードした URL を指定 |
bundleId | ipa の bundleId 名 ※ipa の場合必須 |
・Ruby でのコード例
@driver = Appium::Driver.new(
caps: {
...
app: "https://appkitbox.com/test/sample.apk",
},
appium_lib: {
...
}
).start_driver
方法2. Remote TestKit の共有ストレージからインストール
Remote TestKit のクライアント版にログインして、メニュ-よりアプリストレージ機能を使って apk または ipa をアップロードした後に、下記の Capabilities を指定してください。
Capabilities名 | 値 |
---|---|
app | アップロードした apk または ipa ファイル名を指定。同名ファイルが複数アップロードされている場合には、最新のアップロードファイルが使われます |
・Ruby でのコード例
@driver = Appium::Driver.new(
caps: {
...
app: "sample.apk",
},
appium_lib: {
...
}
).start_driver
自動再署名機能の指定
ipa をインストールする際、自動再署名が行われます。必要に応じて下記の Capabilities を指定していただく事で、自動再署名を OFF にできます。
Capabilities名 | 値 |
---|---|
resigningEnabled | True または False (※False を指定で自動再署名が OFF ) |
実行中の画面の確認
Appium サーバに接続後に画面を取得するための snapshotUrl および screenUrl が発行されます。 capability を使って snapshotUrl または screenUrl を取得しブラウザで開くことで、現在実行中の画面が閲覧可能です。 snapshotUrl はワンショットで静止画像を取得する機能に対して、 screenUrl は定期的に静止画像が更新され動画風に画面を確認できる機能となっております。プログラム内から画像を取得する場合には snapshotUrl 機能を用い、ブラウザで確認する場合には screenUrl 機能を用いると便利です。
・Ruby でのコード例
snapshotUrl = @driver.capabilities['snapshotUrl']
また、AppiumCloudで動作中の端末をソフトウェア版で起動することで、実行中の画面を確認することも可能です。
実行中の Appium 実行ログの確認
Appium サーバの実行ログを取得するためには、ログレベルを Capabilities に指定し、 capability を使って serverLogUrl を取得してブラウザ等で開いてください。取得可能な Appium ログはセッションを開始してから取得時までのすべてのログとなり、最終出力(通常はセッション終了ログ)から10分間、取得可能です。
Capabilities名 | 値 |
---|---|
logLevel | "info", "warn", "error", "debug" のいずれかを指定。デフォルト値は "info" |
・Ruby でのコード例
serverLogUrl = @driver.capabilities['serverLogUrl']
Appium セッションの強制削除
Appium のテストケースを実行時にエラーが発生するなどした際、クライアントが強制終了するなどで正常にセッションの削除が実行されないとセッションが残りますが、同一の端末指定条件で再度テストを行えば、セッションを上書きして再度同一端末でテストを実行することが可能です。ただし、この場合はセッションが上書きされるため、同一ケーパビリティで複数端末を同時にテストすることができません。複数端末を同時にテストしたい場合には、 "noSessionOverwriting" ケーパビリティに true (真偽値)を指定してください。これにより、 Appium Gateway のセッションで利用中の端末が端末選択からスキップされて、セッションが上書きされないようになります。
Capabilities名 | 値 |
---|---|
noSessionOverwriting | true, false のどちらかを指定。デフォルト値は false |
・Ruby でのコード例
@driver = Appium::Driver.new(
caps: {
...
noSessionOverwriting: true,
},
appium_lib: {
...
}
).start_driver
端末レンタルの自動返却
指定の時間 Appium サーバ経由で同一端末にアクセスがない場合には、自動返却が行われます。指定が無い場合、10分後に自動返却されます。
Capabilities名 | 値 |
---|---|
deviceKeepingTimeout | "300000 ~ 1800000"[ミリ秒]の表記。5〜30分の間の時間を指定。 |
端末レンタルの自動延長
レンタル残り時間が10分未満になった場合に、 Appium サーバ経由で同一端末にアクセスがあれば、自動的に30分間のレンタル自動延長が行われます。
端末レンタルの強制返却
端末は利用がないと自動返却されますが、すぐに別の端末で自動検証を行いたいときには強制的に端末を返却することが可能です。テストコードを実行中に returnDeviceUrl が発行されます。 capability を使って returnDeviceUrl を取得し、テストコードの中で該当 URL へアクセスすることで強制的に端末を返却できます。
・Ruby でのコード例
returnDeviceUrl = @driver.capabilities['returnDeviceUrl']
system("curl #{returnDeviceUrl}")
最新の Chrome Driver での実行
最新の Chrome Driver で動作しない場合は、 Capability に下記設定を追記する必要があります。
・Ruby での設定例の抜粋
caps: {
'chromeOptions': {'w3c': false},
},
サンプルコード
Google 検索を行う Ruby のテストスクリプト
以下のスクリプトを test.rb 等の名前でローカル PC に保存してください。
require 'rubygems'
require 'test/unit'
require 'selenium-webdriver'
require 'appium_lib'
# get userName, password from Environment variable
RTK_USERNAME = ENV['RTK_USERNAME']
RTK_PASSWORD = ENV['RTK_PASSWORD']
unless RTK_USERNAME && RTK_PASSWORD then
puts "Environment variable error"
exit(0)
end
class OpenUrlTest < Test::Unit::TestCase
def setup
opts = {
caps: {
userName: RTK_USERNAME,
password: RTK_PASSWORD,
deviceName: 'Nexus 5',
platformName: 'Android',
browserName: 'Chrome',
appiumVersion: '1.22.3',
chromeOptions: {'w3c': false}
},
appium_lib: {
server_url: 'https://gwjp.appkitbox.com/wd/hub',
wait: 60
}
}
@driver = Appium::Driver.new(opts).start_driver
end
def teardown
@driver.quit()
end
def test_google_search
puts @driver.capabilities['snapshotUrl']
# Open URL
url = "https://www.google.com/"
puts "Open URL: " + url
@driver.get(url)
element = @driver.find_element(:name, 'q')
sleep(5)
@driver.save_screenshot('capture_01.png')
# Input keys
word = "Remote testKit"
puts "Input Keys: " + word
element.send_keys(word)
element.send_keys(:enter)
sleep(5)
@driver.save_screenshot('capture_02.png')
# Get value
value = @driver.find_element(:name, 'q').value
puts "Text field value=" + value
assert_equal true, value == "Remote testKit"
end
end
iPhone 端末で電卓で計算を行う Ruby のテストスクリプト
以下のスクリプトを test.rb 等の名前でローカル PC に保存してください。
# gem install selenium-webdriver
# gem install appium_lib
# export RTK_USERNAME=xxxx
# export RTK_PASSWORD=xxxx
require 'rubygems'
require 'test/unit'
require 'selenium-webdriver'
require 'appium_lib'
# get userName, password from Environment variable
RTK_USERNAME = ENV['RTK_USERNAME']
RTK_PASSWORD = ENV['RTK_PASSWORD']
unless RTK_USERNAME && RTK_PASSWORD
puts 'Environment variable error'
exit(0)
end
class ContactsIOsTests < Test::Unit::TestCase
def setup
opts = {
caps: {
# get userName, password from Environment variable
userName: RTK_USERNAME,
password: RTK_PASSWORD,
deviceName: 'iPhone 8.*',
platformName: 'iOS',
platformVersion: '14.0.1',
bundleId: 'com.apple.calculator'
},
appium_lib: {
server_url: 'https://gwjp.appkitbox.com/wd/hub',
wait: 60
}
}
@driver = Appium::Driver.new(opts).start_driver
end
def teardown
@driver.quit
end
def test_google_search
puts @driver.capabilities['snapshotUrl']
@driver.save_screenshot('capture_01.png')
el1 = @driver.find_element(:accessibility_id, '1')
el1.click
@driver.save_screenshot('capture_02.png')
is_lang_english = true
begin
el2 = @driver.find_element(:accessibility_id, 'multiply')
el2.click
rescue StandardError
is_lang_english = false
el2 = @driver.find_element(:accessibility_id, '乗算')
el2.click
end
@driver.save_screenshot('capture_03.png')
el3 = @driver.find_element(:accessibility_id, '3')
el3.click
@driver.save_screenshot('capture_04.png')
el2.click
@driver.save_screenshot('capture_05.png')
el3.click
@driver.save_screenshot('capture_06.png')
if is_lang_english
el4 = @driver.find_element(:accessibility_id, 'equals')
el4.click
@driver.save_screenshot('capture_07.png')
el5 = @driver.find_element(:accessibility_id, 'Result')
value = el5.attribute('value')
puts 'Text field value=' + value
assert_equal(value, '9')
el6 = @driver.find_element(:accessibility_id, 'clear')
el6.click
@driver.save_screenshot('capture_08.png')
else
el4 = @driver.find_element(:accessibility_id, '計算実行')
el4.click
@driver.save_screenshot('capture_07.png')
el5 = @driver.find_element(:accessibility_id, '結果')
value = el5.attribute('value')
puts 'Text field value=' + value
assert_equal(value, '9')
el6 = @driver.find_element(:accessibility_id, '消去')
el6.click
@driver.save_screenshot('capture_08.png')
end
end
end
本テストスクリプトを実行するに当たり、環境変数に Remote TestKit のユーザ名、パスワードを設定します。ターミナルより以下を実行します。
export RTK_USERNAME=xxxx
export RTK_PASSWORD=xxxx
Proxy を通して Appium Cloud に接続したい場合
Proxy 対応はテストスクリプトを記述するライブラリによってサポートの有無が異なります。
例えば Python は標準で Proxy 対応のサポートがないため、以下のように MonkeyPatch を利用します。
サンプルコード内の PROXY_URL はご自身の環境に合わせて設定してください。
import os
import sys
import unittest
from time import sleep
from appium import webdriver
from selenium.webdriver.common.by import By
from appium.options.common import AppiumOptions
# ------------------------------------------------------------------------------------------
# The original selenium.webdriver.remote.remote_connection is not implemented to access
# the endpoint via proxy. So We wrote a monkey patch for the proxy.
import certifi
import urllib3
from selenium.webdriver.remote.remote_connection import RemoteConnection
RemoteConnection.__org__init__ = RemoteConnection.__init__
def patch_init(self, remote_server_addr, keep_alive=False, ignore_proxy=False):
print("\nMonkey patch version: selenium.webdriver.remote.remote_connection")
RemoteConnection.__org__init__(self, remote_server_addr, keep_alive=keep_alive, ignore_proxy=ignore_proxy)
if keep_alive:
# Define proxy. Default value is squid port.
PROXY_URL = "http://localhost:3128"
self._conn = urllib3.ProxyManager(proxy_url=PROXY_URL, timeout=self._timeout)
# If basic authentication is required, uncomment the following and define it.
# headers = urllib3.util.make_headers(proxy_basic_auth="userid:password")
# self._conn = urllib3.ProxyManager(
# proxy_url=PROXY_URL, proxy_headers=headers, cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
RemoteConnection.__init__ = patch_init
# ------------------------------------------------------------------------------------------
# Specify userName, password to Environment variable
RTK_ACCESSTOKEN = os.environ.get('RTK_ACCESSTOKEN')
if not RTK_ACCESSTOKEN:
print("Environment variable error")
sys.exit()
class OpenUrlTest(unittest.TestCase):
def setUp(self):
caps = {
'accessToken': RTK_ACCESSTOKEN,
'deviceName': 'Pixel',
'platformName': 'Android',
'browserName': 'Chrome',
'appiumVersion': '1.22.3',
'automationName': 'UiAutomator2',
'chromeOptions': {'w3c': False}
}
# Specify the endpoint
options = AppiumOptions()
for k in caps:
options.set_capability(k, caps[k])
self.driver = webdriver.Remote(
"https://gwjp.appkitbox.com/wd/hub", options=options
)
print(f"command_executor={self.driver.command_executor}")
print(f"proxy={self.driver.command_executor._conn.proxy}")
def tearDown(self):
self.driver.quit()
def test_google_search(self):
# print(self.driver.capabilities['snapshotUrl'])
# Open URL
url = "https://www.google.com/"
print("Open URL: " + url)
self.driver.get(url)
element = self.driver.find_element(By.CSS_SELECTOR, 'textarea')
sleep(5)
self.driver.save_screenshot('capture_01.png')
# Input keys
word = "Remote testKit"
print("Input Keys: " + word)
element.send_keys(word)
element.submit
sleep(5)
self.driver.save_screenshot('capture_02.png')
# Get value
value = self.driver.find_element(By.CSS_SELECTOR, 'textarea').get_attribute('value')
print("Text field value=" + value)
self.assertEqual(value, "Remote testKit")
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(OpenUrlTest)
unittest.TextTestRunner(verbosity=2).run(suite)
そのほかのサンプルコード
その他の言語やテストスクリプトのサンプルコードは下記のリポジトリを参照ください。
https://github.com/remotetestkit/sample-code
また、 Python 言語でテストスクリプトを実行する際には、 Appium Client ライブラリを下記の手順でインストールしてください。
pip3 install Appium-Python-Client==3.1.0
もしくは
pip install Appium-Python-Client==3.1.0
技術仕様および制限事項
2021.10月現在、以下の制限があります。
- Remote TestKit Appium Cloud は、 Flat 3以上のプランをご契約しているユーザの方が、無料でご利用になれる機能です。
- Appium の仕様から、対象となる端末は UiAutomator2 に対応している Android 4.4 以上または iOS 10.3 以上の端末に限られます。
- iOS 端末の場合はレンタルした iOS のバージョンに最適な Appium バージョンが選択されるため、 capability で指定はできません。作成するクライアント側のテストスクリプトは、対応バージョンを想定した実装をお願い致します。
- 端末レンタルの自動返却時間の指定が無い場合、10分間 Appium サーバ経由で同一端末にアクセスがない場合には、自動返却が行われます。また、自動返却されるまでは同じ端末に対して複数スクリプトを実行することができます。
- サーバに対して負荷のかかる処理やメモリを大量に必要とする処理は、強制終了する場合があります。
- 必要に応じて、社内の Firewall 等の設定に Remote TestKit からのアクセス許可設定を追加してください。アクセス元 IP アドレスは FAQ に記載があります。
- プロキシ環境下での動作はサポートしておりません。
Remote TestKit Appium Cloud で発生し得るエラーの一覧
実行したテストスクリプトがエラーで異常終了した際には、 Appium Client ライブラリを通じてサーバ側で発生したエラーメッセージが返却されます。「The environment you requested was unavailable」のあとに続くエラーメッセージと原因は下記の通りとなります。テストスクリプトの修正などにお役立てください。
エラーメッセージ | 原因 |
---|---|
An unknown server-side error occurred while processing the command. Original error: | Appium Cloudサーバ内部エラー |
No 'deviceName' is specified. | capabilityのdeviceNameが正しくない |
'platformName' is not 'Android' or 'iOS'. | capabilityのplatformNameが正しくない |
No 'platformName' is specified. | capabilityのplatformNameが正しくない |
No 'elementName' is specified. | Capabilityのエレメント名が正しくない |
Access to Appium Cloud is limited to FLAT upper rank plans. | FLAT契約がない |
Installing application failed. | URLからダウンロードしたアプリケーションがインストール出来ない |
failed to get application response body | URLからダウンロードしたアプリケーションファイルが不正 |
Login with access token failed: clientAddress = | アクセストークンエラー |
Installing application failed. | アプリインストールエラー |
Application file is not uploaded. | アプリケーションファイルがアップロードされていない |
User storage is not permitted. | 共有ストレージエラー |
Login for sub-account user failed: loginIdentifier = | サブアカウントログインエラー |
No device is rentable because of no matched device | 条件にマッチする端末が存在しない |
Session is not created | セッション確立に失敗した |
A session is either terminated or not started | セッションが終了しているもしくはセッション確立に失敗した |
An connection error occurred. | 接続が切断された |
Activating the device failed. | 端末レンタルに失敗した |
Device is not rentable | 端末レンタルに失敗した |
No device is rentable. | 端末レンタルに失敗した |
Application file name must contain alphabets only. | ファイル名はアルファベット以外不可 |
Destroying old session failed | 古いセッションの破棄に失敗した |
Connection source IP address is invalid. | 無許可のIPアドレスからの接続切断 |
No device is rentable because rented devices reaches the maximum of your plan: maxRentableDeviceCount = | レンタル中の端末がレンタル可能上限数に達した |
Device is not launchable | レンタルした端末の起動に失敗した |
Device is not launchable because its operation was aborted | レンタルした端末の起動に失敗した |
Device is unavailabe without known reasons | レンタル可能な端末が存在しない |
a pair of username and password, or an accessToken is required. | ログインエラー |
Login failed because of invalid login identifier: loginIdentifier = | ログインエラー |
Login failed: loginIdentifier = | ログインエラー |
User name is invalid | ログインエラー |
Could not rent a device that meets your criteria | 条件にマッチする端末レンタルに失敗した |
You have exceeded the number of sessions you can connect to. | 接続可能なセッション数を超えた |
よくあるご質問
「Appium連携のよくあるご質問(FAQ)」をまとめています。お問い合わせの前にご確認ください。