appium safari driver
v3.5.18
これは、バージョン13以来、MacOSおよびiOSでSafariを自動化するためのAppiumドライバーです。ドライバーは、W3C WebDriverプロトコルを使用してSafari Automationのみをサポートしています。フードの下で、このドライバーは、Appleのsafaridriver
バイナリをめぐるラッパー/プロキシです。 man safaridriver
コマンドの出力をチェックして、サポートされている機能と考えられる落とし穴の詳細を取得してください。
注記
バージョン3.0.0 SafariドライバーはAppium 1のサポートを削除しており、Appium 2とのみ互換性があります。AppiumDriver
appium driver install safari
コマンドを使用してAppium 2 Distに追加します。
MACOS端末からのsafaridriver --enable
コマンドを実行し、自動化されたセッションが実行される前に管理者パスワードを提供することが必須です。実際のデバイスでSafariを自動化するには、これらの特定のデバイスのSettings → Safari → Advanced → Remote Automation
でリモートオートメーションスイッチを有効にすることも必要です。
次に、自動テストがどこに実行されるかを決定する必要があります。 Safariドライバーは、次のターゲットプラットフォームをサポートしています。
Safariドライバーでは、プラットフォーム選択のための複数の基準を定義し、自動化セッションプロパティを微調整することもできます。これは、次のセッション機能を介して行うことができます。
機能名 | 説明 |
---|---|
PlatformName | Safaridriver Binaryは、デスクトップまたはモバイルSafari用のWebDriverセッションのみを作成でき、MacOSでのみ実行できます。 PlatformNameの値は、対応するプラットフォームのSafariドライバーセッションを開始するために、「Mac」または「iOS」に等しくなります。 PlatformNameの値は、ケースインセンシタルに比較されます。 |
AutomationName | Safariドライバーセッションを開始するには、自動化名の値が「Safari」に等しくなければなりません。 AutomationNameの値は、ケースインセンシタルに比較されます。 |
閲覧名 | Safaridriverは、Safari用のWebDriverセッションのみを作成できます。この機能に渡された値はすべて「Safari」に変更されます。 |
ブラウザーバージョン | Safaridriverは、SafariバージョンがBrowserversionの値と一致するホストを使用してセッションを作成します。ブラウザバージョン番号はプレフィックスマッチングされています。たとえば、ブラウザーバージョンの値が「12」の場合、これにより、'12 .0.1 'または'12 .1'のサファリバージョンを持つホストが可能になります。 |
AcceptInseCureCerts | ブラウザが適切なセキュリティ警告を無視するようにし、したがって、TLS証明書を無効または期限切れにしたWebサイトへのナビゲーションを可能にします。 Safaridriver V15.4以降、機能はサポートされています。 |
Safari:PlatformVersion | Safaridriverは、OSバージョンがSafari:PlatformVersionの値と一致するホストを使用してセッションのみを作成します。 OSバージョン番号はプレフィックスマッチングされています。たとえば、Safari:PlatformVersionの値が「12」の場合、これにより、'12 .0 'または'12 .1'のOSバージョンを持つホストが許可されますが、'10 .12 'ではありません。 |
Safari:PlatformBuildversion | Safaridriverは、OSビルドバージョンがSafari:PlatformBuildversionの値と一致するホストを使用してセッションのみを作成します。 MacOSビルドバージョンの例は「18e193」です。 MacOSでは、OSビルドバージョンは、SW_Vers(1)ユーティリティを実行することで決定できます。 |
Safari:UseSimulator | Safariの値:UseSimulatorが真である場合、SafaridriverはiOSシミュレーターホストのみを使用します。 Safariの値:UseSimulatorがfalseの場合、SafaridriverはiOSシミュレーターホストを使用しません。注:iOSシミュレーターホストでWebDriverテストを実行するには、Xcodeインストールが必要です。 |
Safari:DeviceType | Safari:DeviceTypeの値が「iPhone」の場合、SafaridRiverはiPhoneデバイスまたはiPhoneシミュレーターを使用してセッションのみを作成します。 Safari:DeviceTypeの値が「iPad」の場合、SafaridRiverはiPadデバイスまたはiPadシミュレーターを使用してセッションを作成するだけです。 Safariの値:DeviceTypeはケースインテンシテーブと比較されます。 |
Safari:Devicename | Safaridriverは、デバイス名がSafari:Devicenameの値と一致するホストを使用してセッションのみを作成します。デバイス名は、ケースインセンシタルに比較されます。注:接続されたデバイスのデバイス名はiTunesに表示されます。 Xcodeがインストールされている場合、接続されたデバイスのデバイス名は、機器の出力(1)およびデバイスおよびシミュレーターウィンドウ(「ウィンドウ>デバイスとシミュレーター」を介してXcodeにアクセス)で使用できます。 |
Safari:DeviceDid | Safaridriverは、デバイスがsafari:deviceudidの値と一致するホストを使用してセッションを作成します。デバイスの尿道は、ケースインセンシタルに比較されます。注:Xcodeがインストールされている場合、接続されたデバイス用のUDIDは、機器(1)の出力とデバイスおよびシミュレーターウィンドウ(「ウィンドウ>デバイスとシミュレーター」を介してXcodeでアクセス)で使用できます。 |
Safari:自動インスペクション | この機能は、Safariに、新しく作成されたウィンドウを返す前に、WebインスペクターとJavaScriptデバッガーをバックグラウンドでプリロードするよう指示します。 JavaScriptでのテストの実行を一時停止し、Web Inspectorのデバッガータブを表示するには、デバッガーを評価するだけです。テストページのステートメント。 |
Safari:AutomaticProfiling | この機能は、SafariにWebインスペクターをプリロードし、新しく作成されたウィンドウを返す前にバックグラウンドでタイムライン録音を開始するよう指示します。録音を表示するには、Safariの開発メニューを使用してWeb検査官を開きます。 |
webkit:webrtc | この機能により、テストはWeBRTCおよびメディアキャプチャのSafariのポリシーを一時的に変更できます。 WebKitの値:Webrtc機能は、次のサブキーを備えた辞書であり、 DisableInsecureMediaCapture はすべてオプションです。この制限は、テスト目的でWebDriverセッションでデフォルトで緩和されます(たとえば、HTTPS用に構成されていないテストWebサーバー)。この機能が指定されると、Safariは、安全でない接続に対するメディアキャプチャを防ぐという通常の動作に戻ります。 DisableICECandidateFiltering ユーザーのプライバシーを保護するために、Safariは通常、キャプチャデバイスが使用されていないときに内部ネットワークアドレスに対応するWeBRTC ICE候補を除外します。この機能により、ICE候補のフィルタリングが抑制されるため、内部ネットワークアドレスと外部ネットワークアドレスの両方が常にICE候補として送信されます。 |
# Python3 + PyTest
import pytest
import time
from appium import webdriver
# Options are available in Python client since v2.6.0
from appium . options . ios import SafariOptions
from selenium . webdriver . common . by import By
def generate_options ():
common_caps = {
# It does not really matter what to put there, although setting 'Safari' might cause a failure
# depending on the particular client library
'browserName' : 'AppiumSafari' ,
}
real_device_opts = SafariOptions (). load_capabilities ( common_caps )
# This is optional
real_device_opts . device_type = 'iPhone'
# Do not forget to verify that Remote Automation is enabled for this device
real_device_opts . device_udid = '<MyDeviceUDID>'
real_device_opts . use_simulator = False
simulator_opts = SafariOptions (). load_capabilities ( common_caps )
simulator_opts . platform_version = '14.1'
simulator_opts . device_name = 'iPad Air 2'
simulator_opts . use_simulator = True
desktop_browser_opts = SafariOptions (). load_capabilities ({
** common_caps ,
'platformName' : 'Mac' ,
})
return [ real_device_opts , simulator_opts , desktop_browser_opts ]
@ pytest . fixture ( params = generate_options ())
def driver ( request ):
# The default URL is http://127.0.0.1:4723/wd/hub in Appium1
drv = webdriver . Remote ( 'http://127.0.0.1:4723' , options = request . param )
yield drv
drv . quit ()
class TimeoutError ( Exception ):
pass
def wait_until_truthy ( func , timeout_sec = 5.0 , interval_sec = 0.5 ):
started = time . time ()
original_error = None
while time . time () - started < timeout_sec :
original_error = None
try :
result = func ()
if result :
return result
except Exception as e :
original_error = e
time . sleep ( interval_sec )
if original_error is None :
raise TimeoutError ( f'Condition unmet after { timeout_sec } s timeout' )
raise original_error
def test_feature_status_page_search ( driver ):
driver . get ( 'https://webkit.org/status/' )
# Enter "CSS" into the search box.
# Ensures that at least one result appears in search
# !!! Remember there are no ID and NAME locators in W3C standard
# These two have been superseded by CSS ones
search_box = driver . find_element_by_css ( '#search' )
search_box . send_keys ( 'CSS' )
value = search_box . get_attribute ( 'value' )
assert len ( value ) > 0
search_box . submit ()
# Count the visible results when filters are applied
# so one result shows up in at most one filter
assert wait_until_truthy ( lambda : len ( driver . execute_script ( "return document.querySelectorAll('li.feature:not(.is-hidden)')" )) > 0 )
def test_feature_status_page_filters ( driver ):
driver . get ( 'https://webkit.org/status/' )
assert wait_until_truthy ( lambda : len ( driver . execute_script ( "return document.querySelectorAll('.filter-toggle')" )) == 7 )
# Make sure every filter is turned off.
for checked_filter in filter ( lambda f : f . is_selected (), filters ):
checked_filter . click ()
# Make sure you can select every filter.
for filt in filters :
filt . click ()
assert filt . is_selected ()
filt . click ()
# clone repo, then in repo dir:
npm install
npm run lint
npm run test