appium safari driver
v3.5.18
這是自版本第13版以來,可以在MacOS和iOS上自動執行Safari的Appium驅動程序。該驅動程序僅支持使用W3C WebDriver協議的Safari自動化。在引擎蓋下,這款駕駛員是蘋果的safaridriver
二進製文件的包裝紙/代理。檢查man safaridriver
命令的輸出,以獲取有關受支持的功能和可能的陷阱的更多詳細信息。
筆記
由於版本3.0.0 Safari驅動程序已刪除Appium 1的支持,並且僅與Appium 2兼容。使用
appium driver install safari
命令將其添加到Appium 2 Dist中。
必須從MacOS終端運行safaridriver --enable
命令,並在執行任何自動化會話之前提供您的管理員密碼。為了在真實設備上自動化Safari,還必須在Settings → Safari → Advanced → Remote Automation
中,為這些特定設備啟用遠程自動化開關。
然後,您需要確定要執行自動測試的位置。 Safari驅動程序支持以下目標平台:
Safari驅動程序允許定義多個用於平台選擇的標準,並可以微調您的自動化會話屬性。這可以通過以下會話功能完成:
功能名稱 | 描述 |
---|---|
PlatformName | Safaridriver二進製文件只能為桌面或移動野生動物園創建Web Driver會話,並且只能在MacOS上運行。平台名稱的值可以等於“ Mac”或“ iOS”,以便為相應平台啟動Safari驅動程序會話。平台名稱的值對案例不敏感。 |
AutomationName | 為了啟動Safari驅動程序會話,AutomationName的值必須等於“ Safari”。自動名稱值的值對案例不敏感。 |
瀏覽 | Safaridriver只能為Safari創建WebDriver會議。傳遞給此功能的任何值都將更改為“ Safari”。 |
瀏覽 | Safaridriver只能使用其Safari版本與瀏覽器的值匹配的主機創建會話。瀏覽器版本號是前綴匹配的。例如,如果瀏覽器的值為“ 12”,則將允許主機具有'12 .0.1'或'12 .1'的Safari版本。 |
Appactinsecurecerts | 使瀏覽器忽略適當的安全警告,從而允許導航到具有無效或已過期TLS證書的網站。由於Safaridriver v15.4,因此支持該功能。 |
Safari:平台Version | Safaridriver只能使用OS版本與Safari:PlatformVersion的值匹配的主機創建會話。 OS版本號是前綴匹配的。例如,如果Safari:PlatformVersion的價值為“ 12”,則將允許主機具有'12 .0'或'12 .1'但不是'10 .12'的OS版本。 |
Safari:Platform Buildversion | Safaridriver只能使用OS構建版本與Safari:Platform Buildversion的值匹配的主機創建會話。 MacOS構建版本的示例是“ 18E193”。在MacOS上,可以通過運行SW_VERS(1)實用程序來確定OS構建版本。 |
Safari:使用仿真 | 如果Safari:useImulator的價值為真,則Safaridriver僅使用iOS模擬器主機。如果Safari:用途模擬器的價值是錯誤的,則Safaridriver將不使用iOS模擬器主機。注意:為了在iOS模擬器主機上運行WebDriver測試,需要安裝XCode。 |
Safari:DeviceType | 如果Safari:DeviceType的價值是“ iPhone”,Safaridriver只會使用iPhone設備或iPhone模擬器創建會話。如果Safari:DeviceType的值是“ iPad”,Safaridriver只能使用iPad設備或iPad Simulator創建會話。野生動物園的值:偏斜型的案例不敏感。 |
Safari:Devicename | Safaridriver只能使用設備名稱與Safari:DeviceName的值匹配的主機創建會話。對設備名稱進行敏感性比較。注意:iTunes中顯示了連接設備的設備名稱。如果安裝了XCode,則可以通過儀器(1)的輸出以及設備和模擬器窗口(通過“窗口>設備和模擬器”訪問XCode訪問)。 |
Safari:deviceudid | Safaridriver只能使用設備UDID匹配Safari:Deviceudid的值的主機創建會話。 udids被敏感地比較。注意:如果安裝了Xcode,則可以通過儀器(1)的輸出以及設備和模擬器窗口(通過Xcode訪問Xcode,通過“窗口>設備和模擬器”訪問連接的設備的UDIDS)。 |
野生動物園:自動化 | 此功能指示Safari在返回新創建的窗口之前,在背景中預先加載Web Inspector和JavaScript調試器。要在JavaScript中暫停測試的執行並提出Web Inspector的Debugger選項卡,您可以簡單地評估調試器;在“測試”頁面中進行聲明。 |
野生動物園:自動加工 | 此功能指示野生動物園預訂Web檢查員,並在返回新創建的窗口之前在後台開始記錄時間表。要查看錄製,請通過Safari的開髮菜單打開Web檢查員。 |
Webkit:Webrtc | 該功能允許測試暫時更改WEBRTC和媒體捕獲的野生動物園政策。 WebKit的值:WEBRTC功能是具有以下子鍵的字典,所有這些都是可選的: DisableInsecureMediaCapture 通常,Safari拒絕允許媒體捕獲過度不安全的連接。默認情況下,用於測試目的的WebDriver會話會放寬此限制(例如,未為HTTPS配置的測試Web服務器)。當指定此功能時,Safari將恢復到防止媒體捕獲而不是不安全連接的正常行為。 DisableICECandidateFiltering 為了保護用戶的隱私,Safari通常會濾除與內部網絡地址相對應的WEBRTC 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