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