Это драйвер Appium для автоматизации Safari на MacOS и iOS с версии 13. Драйвер только поддерживает автоматизацию Safari с использованием протокола W3C Webdriver. Под капюшоном этот водитель - обертка/прокси над safaridriver
бинарником Apple. Проверьте вывод команды man safaridriver
чтобы получить более подробную информацию о поддерживаемых функциях и возможных подводных камнях.
Примечание
Поскольку версия 3.0.0 Safari Driver отказался от поддержки Appium 1 и совместима только с Appium 2. Используйте команду
appium driver install safari
, чтобы добавить ее в свой Appium 2 Dist.
Обязательно запустить команду safaridriver --enable
-из терминала MacOS и предоставить пароль вашего администратора до выполнения какого -либо автоматического сеанса. Чтобы автоматизировать Safari на реальных устройствах, также необходимо включить удаленный коммутатор автоматизации в Settings → Safari → Advanced → Remote Automation
для этих конкретных устройств.
Тогда вам нужно решить, где будет проведен автоматический тест. Драйвер Safari поддерживает следующие целевые платформы:
Driver Safari позволяет определять несколько критериев для выбора платформы, а также настраивать свойства сеанса автоматизации. Это можно сделать с помощью следующих возможностей сеанса:
Название возможностей | Описание |
---|---|
Платформовое имя | Baindriver Binary может создавать только сеансы Webdriver для настольных или мобильных сафари и может работать только на macOS. Значение PlatformName может равняться «MAC» или «iOS», чтобы запустить сеанс драйвера Safari для соответствующей платформы. Значения имени платформы сравниваются случайно. |
AutomationName | Значение AutomationName должно равняться «сафари», чтобы запустить сеанс драйвера сафари. Значения AutomationName сравниваются случайно. |
BrowerName | SafaRidriver может создавать только сеансы Webdriver для Safari. Любое значение, передаваемое этой возможности, будет изменено на «Safari». |
Браузерверсия | SafaRidriver создаст только сеанс с использованием хостов, версия Safari, версия сафари, соответствует значению браузерверсии. Номера версий браузера соответствуют префиксу. Например, если значение браузерверсии составляет «12», это позволит хостам с сафари версией '12 .0.1 'или '12 .1'. |
Принимайте | Заставляет браузер игнорировать соответствующее предупреждение о безопасности и, следовательно, позволяет навигации на веб -сайты, имеющие недействительные или истекшие сертификаты TLS. Возможности поддерживается с тех пор, как SafarIdriver V15.4. |
Safari: Platformversion | SafaRidriver создаст сеанс только с использованием хостов, чья версия ОС соответствует значению Safari: Platformversion. Номера версий ОС сопоставлены. Например, если значение Safari: Platformversion составляет «12», это позволит хостам с версией ОС '12 .0 'или '12 .1', но не '10 .12 '. |
Safari: Platformbuildversion | SafaRidriver создаст только сеанс, используя хосты, чья версия по сборке ОС соответствует значению Safari: PlatformBuildVersion. Пример версии MacOS Build - «18E193». На MacOS версия сборки ОС может быть определена путем запуска утилиты SW_VERS (1). |
Safari: Используется | Если значение Safari: Использует ИМОЛЕТАТОР ИСТИНА, SAFARIDRIVER будет использовать только хосты симулятора iOS. Если значение Safari: Использует ИМПОЛИТЕЛЬ ЛОЖИ, SAFARIDRIVER не будет использовать хосты симулятора iOS. ПРИМЕЧАНИЕ. Для запуска тестов WebDriver требуется установка XCode на хосте симулятора iOS. |
Сафари: Devicetype | Если значение Safari: DeviceType - это «iPhone», SafariRiver создаст сеанс только с помощью устройства iPhone или симулятора iPhone. Если значение Safari: DeviceType - это «iPad», SafariRriver создаст сеанс только с помощью устройства iPad или симулятора iPad. Значения Safari: Devicetype сравниваются случайно. |
Сафари: Devicename | SafaRidriver создаст только сеанс, используя хосты, чье имя устройства соответствует значению Safari: DeviceName. Названия устройств сравниваются. Примечание. Имена устройств для подключенных устройств показаны в iTunes. Если xcode установлен, имена устройств для подключенных устройств доступны через вывод инструментов (1) и в окне «Устройства и симуляторов» (доступ к Xcode через «Window> Devices и Simulators»). |
Safari: DeviceUdid | SafaRidriver создаст только сеанс, используя хост, устройство UDID, значение UDID соответствует значению Safari: DeviceUdid. Удиды устройства сравниваются. ПРИМЕЧАНИЕ. Если xcode установлен, UDIDS для подключенных устройств доступны через вывод инструментов (1) и в окне «Устройства и симуляторов» (доступ к XCODE через «Окно> устройства и симуляторы»). |
Сафари: Automaticinspection | Эта возможность инструктирует Safari для предварительного загрузки веб-инспектора и отладчика JavaScript в фоновом режиме до возврата недавно созданного окна. Чтобы приостановить выполнение теста в JavaScript и выпустить вкладку «Отладка веб -инспектора», вы можете просто оценить отладчик; утверждение на тестовой странице. |
Сафари: автоматическое профиль | Эта возможность инструктирует Safari для предварительного загрузки веб-инспектора и запустить запись временной шкалы в фоновом режиме до возврата недавно созданного окна. Чтобы просмотреть запись, откройте веб -инспектор через меню Safari. |
Webkit: Webrtc | Эта возможность позволяет тесту временно изменить политику Safari для WEBRTC и захвата носителя. Значение Webkit: WEBRTC - это словарь со следующими подчинками, все из которых являются необязательными: DisableInsecureMediaCapture - Обычно Safari отказывается разрешать захват среды над небезопасными соединениями. Это ограничение по умолчанию ослаблено для сеансов WebDriver для целей тестирования (например, тестовый веб -сервер, не настроенный для HTTPS). Когда эта возможность будет указана, Safari вернется к нормальному поведению предотвращения захвата носителя по сравнению с небезопасными соединениями. DisableICECandidateFiltering - Чтобы защитить конфиденциальность пользователя, Safari обычно отфильтровывает кандидатов в ICE WEBRTC, которые соответствуют внутренним сетевым адресам, когда устройства захвата не используются. Эта возможность подавляет фильтрацию кандидатов на 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