AWS Device Farmでデスクトップブラウザテストを行う

2021.10.04

いわさです。

AWS Device FarmはAWS上でホストされているデバイスでテストを行うことが出来るサービスですが、モバイルだけでなくデスクトップブラウザでもテストを行うことが出来ます。

最近Device Farmのデスクトップブラウザ機能にアップデートがあったので試してみたかったのですが、そもそもDevice Farmでデスクトップブラウザテストを実施したことがなかったので本日はまずそこから始めてみました。

デスクトップブラウザテストの仕組み

Remote WebDriver

モバイルデバイスでテストを実施する場合はAppiumを使ったテストコードをDevice Farmへアップロードし、クラウドでホストされたデバイスをターゲットにDevice Farm上でテストコードが実行されます。
これについては以前ブログ記事にしています。

デスクトップブラウザの場合は、SeleniumのRemote WebDriver機能を使ってクラウドデバイスへアクセスします。
なので、テストコードの実施自体はローカル端末になり、Selenium APIを使ってクラウドデバイスと通信を行います。

なお、Device Farmのデスクトップブラウザテストでホストされる仮想マシンは、Microsoft Windows Serverで実行されるEC2 Windowsインスタンスです。

Selenium

なので、デスクトップブラウザテストを使うにあたって、Seleniumの使い方を習得する必要があります。

Pytest

また、テストコードの形でローカルでは実施する必要があります。
様々な言語でSeleniumは利用出来ますが、AWS公式ドキュメントではJavaとPythonが紹介されています。

私はPythonのPytestを今回は使いました。
pipしてimportするだけなのでお手軽かなぁなんて。

クライアントのテストコード

クライアント側実行するテストコードですが、Device Farm固有の流れとしては以下が必要です。

  • Device Farmデスクトップブラウザのプロジェクトを作成
  • 生成されたARNを使って、Device FarmsのAPIからテストグリッドURLを生成する
  • そのURLを使ってRemote WebDriverを初期化する

まずはAWSマネジメントコンソールから、Device Farmsのデスクトップブラウザテストプロジェクトを作成します。

生成されたARNをコピーします。

クライアントからはSelenium, Pytest, Boto3を使うのでpipでインストールしておきます。

pip install selenium pytest boto3

以下がテストコードになります。
ハイライトされた行のARNを自分の環境のものにします。

boto3でクライアントを生成する際に認証情報が必要になります。
私は今回は設定済みのプロファイルを使いました。
AWSのドキュメントには環境変数にアクセスキーを設定する方法が紹介されていました。
他にも、MFAが設定されている場合など色々なケースが考えられますが、ここはBoto3で認証をどう通すかの部分で、本題ではないので割愛します。

import pytest, boto3
from selenium.webdriver import Remote
from selenium.webdriver import DesiredCapabilities

class TestClass:
    def setup_method(self, method):
        session = boto3.Session(profile_name="hoge")
        devicefarm_client = session.client("devicefarm", region_name="us-west-2")
        testgrid_url_response = devicefarm_client.create_test_grid_url(
            projectArn="arn:aws:devicefarm:us-west-2:123456789023:testgrid-project:9e6b35de-1a24-4ae0-a007-d4cc63de9278",
            expiresInSeconds=300)
        self.driver = Remote(testgrid_url_response["url"], DesiredCapabilities.FIREFOX)

    # later, make sure to end your WebDriver session:
    def teardown_method(self, method):
        self.driver.quit()

    def test_title(self):
        self.driver.get('https://classmethod.jp/')
        self.driver.save_screenshot('capture.png')

上記テストコードでは、クラスメソッドのコーポレートサイトにアクセスし、キャプチャを取得しています。
もちろん要素を取得したAssertも可能です。

実行

pytestコマンドでテストコードを実行します。
pytestの前処理・後処理でRemote WebDriverの生成と後始末をしています。

iwasa.takahito@hoge devicefarm-selenium-pytest-sample % pytest
=========================================== test session starts ============================================
platform darwin -- Python 3.9.4, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /Users/iwasa.takahito/src/devicefarm-selenium-pytest-sample
collected 1 item                                                                                           

test_hoge.py .                                                                                       [100%]

======================================= 1 passed in 62.75s (0:01:02) =======================================

テスト実行が完了すると、ローカルにcapture.pngファイルが生成されています。
開いてみましょう。

ブラウザの確認結果を表示することが出来ました。

マネジメントコンソールにもRemote WebDriverによる操作情報は残ります。

モバイルデバイステストと同様にリモート操作時のビデオファイルが残されています。
秘匿情報の取り扱いには気をつけましょう。

さいごに

Appiumによるモバイルデバイスでのテストを実行するまでは結構道のりが大変だったのですが、Seleniumによるデスクトップブラウザテストは思ってたよりもすんなりといきました。良かったです。

複数のブラウザに対応しているので、Seleniumでのテストコードがすでにあれば、割と簡単にDevice Farmへも移行出来そうです。
今後、アップデートされた機能の確認やテストコードの色々なパターンを試していきたいと思います。