以前にラズパイからAppium経由でiPhoneアプリを操作する記事を紹介しました。
ラズパイからAppiumとPythonを使ったiPhone自動テスト
今回、iPhoneの天気アプリから札幌市の天気情報を取得することを例に、テストを作成し実行するまでの一連の流れを動画にしましたので紹介します。
詳細は動画を見て頂くのが良いかと思いますが、以下に大枠の流れを示します。
1. AppiumサーバとAppiumインスペクタからテストコードの原型を作成
ラズパイとiPhoneアプリの通信はAppiumサーバを通して実行しますが、iPhoneアプリを操作するためのソースコードを作るためにはAppiumインスペクタを使用します。
AppiumインスペクタではiPhoneアプリ上の要素をポチポチしていくと画面を遷移したり文字を入力することができ、その操作のソースコードを出力することができます。
ただし、上図のようにACCESSBILITY_IDの値が、アプリの現在の値になっている箇所については、そのままで使用できないためxpath等に置き換える必要があります。(xpathを用いた要素取得は動作が遅くなる等のため推奨されないようですが、代替手段が考え付かなかったため使用しています)
2.Pythonファイルの作成
Appiumインスペクタから出力されたソースコードを基にPythonファイルを作成します。
実際にpytestとして動作させるためにライブラリの追加やsetupは自身で追加します。
また、上述の通り箇所によってはxpath等に置き換えます。
動画内で作成したソースコードも載せておきます。
import pytest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
import time
class Test:
@pytest.fixture(autouse=True)
def setup(self):
desired_caps = {
'deviceName': 'iPhone',
'automationName': 'XCUITest',
'platformName': 'iOS',
'udid': 'auto',
'webDriverAgentUrl': 'http://localhost:7777'
}
self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
yield
def test_weather_sapporo(self):
self.driver.activate_app('com.apple.weather')
time.sleep(5)
self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="場所のリスト").click()
self.driver.find_element(by=AppiumBy.XPATH, value="//XCUIElementTypeSearchField[contains(@name, '都市または空港名を検索')]").send_keys('札幌')
time.sleep(2)
self.driver.find_element(c).click()
time.sleep(2)
tempature = self.driver.find_element(by=AppiumBy.XPATH, value="//XCUIElementTypeOther[contains(@name, '札幌市')]").get_attribute('name')
print(f"札幌市の気温: {tempature}")
所感
Appiumインスペクタで大枠のテストコードを作れるのは助かりますが、ACCEBILITY_IDが現在の値になっていたりとそのまま使えないことも多いので、最終的には(推奨されていない上、意外と手間がかか理ますが)xpathで作成するに至りました。この辺りを効率的にやれる方法があるとテストコードの作成も捗るのになあと思いました。