人気記事

Appium iPhone Python RaspberryPi

ラズパイ+AppiumのiPhone自動テストで動画を保存する方法

投稿日:

これまでラズパイ+Appiumの構成でのiPhone自動テストを紹介してきました。

ラズパイ+AppiumでiPhone自動テストを実行する方法

今回は、自動テストの様子を録画する方法を紹介します。

スポンサーリンク

セットアップ

appiumには録画用のコマンドとして Start Recording Screen が用意されています。

ただ、↑のリンクで紹介したappiumのDockerデフォルトでは Start Recording Screen  を使用することができません。

これは録画用にffmpegがインストールされている必要があるためです。

そこで、appiumのDockerビルドの際にffmpegをインストールすることとします。

Dockerは ios-appium-on-linux というソースコードを元に以下のようなDockerファイルとしました。

FROM ubuntu:latest
# setup libimobile device, usbmuxd and some tools 
RUN apt-get update && apt-get -y install unzip  wget curl libimobiledevice-utils libimobiledevice6 usbmuxd 
# setup ffmpeg
RUN apt-get -y install ffmpeg
# grab go-iOS from github
COPY ios /
# set up nvm and add a little hack so installing appium will work as the root user
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
RUN export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && \
     . "$NVM_DIR/nvm.sh" && nvm install 18.12.1 && \
    npm config set user 0 && npm config set unsafe-perm true && npm install -g appium
COPY startAppium.sh / 
ENTRYPOINT ["/bin/bash","-c","/startAppium.sh"]

5行目にffmpegのインストールを追加しています。

また、7行目の「COPY ios /」ですが、こちらはgo-iosというLinux上のAppiumとiPhoneをプロキシするサーバ機能をラズパイ用にarm64用にビルドしたバイナリをローカルからコピーしています。

テスト実行

天気アプリから気温を取得するテストの様子を録画するサンプルです。

import pytest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
import time
import base64

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.start_recording_screen(videoType='libx264')
        self.driver.activate_app('com.apple.weather')
        self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="場所のリスト").click()
        time.sleep(2)
        self.driver.find_element(by=AppiumBy.XPATH, value="//XCUIElementTypeSearchField[contains(@name, '都市または空港名を検索')]").send_keys("札幌")
        time.sleep(2)
        print(self.driver.page_source)
        self.driver.save_screenshot("札幌検索結果.png")
        self.driver.find_element(by=AppiumBy.XPATH, value="//XCUIElementTypeButton[contains(@name, '札幌市')]").click()
        time.sleep(2)
        tempature = self.driver.find_element(by=AppiumBy.XPATH, value="//XCUIElementTypeOther[contains(@name, '札幌市')]").get_attribute('name')
        print(f"札幌市の気温: {tempature}")
        video_data = self.driver.stop_recording_screen()
        file_name = "sapporo_weather.mp4"
        with open(file_name,"wb+") as vd:
             vd.write(base64.b64decode(video_data))

録画に成功するとテスト用のpyファイルと同階層にmp4形式の動画ファイルが保存されます。

コマンドの説明欄の通り、形式はmjpeg、libx264、mpeg4を選択することができますが、

今回はlibx264としました。

options.videoType string (iOS Only) The format of the screen capture to be recorded. Available formats are the output of ffmpeg -codecs such as libx264 and mpeg4. Defaults to mjpeg.

以上です。

-Appium, iPhone, Python, RaspberryPi

Copyright© ITエンジニアへの転身 , 2024 All Rights Reserved Powered by STINGER.