appium safari driver
v3.5.18
버전 13 이후 MacOS 및 iOS에서 Safari를 자동화하기위한 Appium 드라이버입니다. 드라이버는 W3C WebDriver 프로토콜을 사용하여 Safari 자동화 만 지원합니다. 후드 아래 에서이 드라이버는 Apple의 safaridriver
Binary에 대한 래퍼/프록시입니다. man safaridriver
명령의 출력을 확인하여 지원되는 기능 및 가능한 함정에 대한 자세한 내용을 확인하십시오.
메모
버전 3.0.0 이후 Safari 드라이버는 Appium 1의 지원을 삭제했으며 Appium 2 와만 호환됩니다
appium driver install safari
명령을 사용하여 Appium 2 Dist에 추가하십시오.
자동화 된 세션이 실행되기 전에 safaridriver --enable
명령)를 실행하고 관리자 암호를 제공해야합니다. 실제 장치에서 사파리를 자동화하려면 Settings → Safari → Advanced → Remote Automation
에서 원격 자동화 스위치를 활성화해야합니다.
그런 다음 자동 테스트가 실행될 위치를 결정해야합니다. Safari 드라이버는 다음과 같은 대상 플랫폼을 지원합니다.
Safari 드라이버를 사용하면 플랫폼 선택을위한 여러 기준을 정의하고 자동화 세션 속성을 미세 조정할 수 있습니다. 다음 세션 기능을 통해 수행 할 수 있습니다.
기능 이름 | 설명 |
---|---|
플랫폼 이름 | Safaridriver Binary는 데스크탑 또는 모바일 사파리를위한 WebDriver 세션 만 만들 수 있으며 MACOS에서만 실행할 수 있습니다. PlatformName의 값은 해당 플랫폼의 Safari 드라이버 세션을 시작하기 위해 'Mac'또는 'iOS'와 동일 할 수 있습니다. PlatformName의 값은 사례에 비해 비교됩니다. |
자동화 이름 | Safari 드라이버 세션을 시작하려면 AutomationName의 값은 'Safari'와 동일해야합니다. AutomationName의 값은 사례에 비해 비교됩니다. |
브라우터 이름 | Safaridriver는 Safari 용 WebDriver 세션 만 만들 수 있습니다. 이 기능으로 전달 된 값은 'Safari'로 변경됩니다. |
브라우저 버전 | Safaridriver는 Safari 버전이 Browserversion의 값과 일치하는 호스트를 사용하여 세션 만 생성합니다. 브라우저 버전 번호는 접두사 일치합니다. 예를 들어, BrowserVersion의 값이 '12'인 경우 '12 .0.1 '또는 '12 .1'의 Safari 버전을 가진 호스트가 허용됩니다. |
수용자는 확인합니다 | 브라우저가 적절한 보안 경고를 무시하도록하여 TLS 인증서가 잘못되거나 만료 된 웹 사이트에 대한 내비게이션을 허용합니다. 기능은 Safaridriver v15.4 이후에 지원됩니다. |
사파리 : 플랫폼 버전 | Safaridriver는 OS 버전이 Safari : PlatformVersion의 값과 일치하는 호스트를 사용하여 세션 만 생성합니다. OS 버전 번호는 접두사 일치합니다. 예를 들어, Safari : PlatformVersion의 값이 '12'인 경우 '12 .0 '또는 '12 .1'의 OS 버전이있는 호스트는 '10 .12 '가 아닙니다. |
Safari : 플랫폼 빌드 버전 | Safaridriver는 OS 빌드 버전이 Safari : PlatformBuildVersion의 값과 일치하는 호스트를 사용하여 세션 만 생성합니다. MacOS 빌드 버전의 예는 '18E193'입니다. MACOS에서 OS 빌드 버전은 SW_VERS (1) 유틸리티를 실행하여 결정할 수 있습니다. |
사파리 : useimulator | safari : useimulator의 값이 참이면 Safaridriver는 iOS 시뮬레이터 호스트 만 사용합니다. Safari : useimulator의 값이 False 인 경우 SafarIdriver는 iOS 시뮬레이터 호스트를 사용하지 않습니다. 참고 : iOS 시뮬레이터 호스트에서 WebDriver 테스트를 실행하려면 Xcode 설치가 필요합니다. |
사파리 : DeviceType | Safari : DeviceType의 값이 'iPhone'인 경우 SafarIdriver는 iPhone 장치 또는 iPhone 시뮬레이터를 사용하여 세션 만 생성합니다. Safari : DeviceType의 값이 'iPad'인 경우 Safaridriver는 iPad 장치 또는 iPad 시뮬레이터를 사용하여 세션 만 생성합니다. Safari의 값 : DeviceType은 사례에 비해 비교됩니다. |
사파리 : DeviceName | Safaridriver는 장치 이름이 Safari : DeviceName의 값과 일치하는 호스트를 사용하여 세션 만 생성합니다. 장치 이름은 비면적으로 비교됩니다. 참고 : 연결된 장치의 장치 이름은 iTunes에 표시됩니다. Xcode가 설치된 경우, 연결된 장치의 장치 이름은 Instruments (1) 및 장치 및 시뮬레이터 창 ( "창> 장치 및 시뮬레이터를 통해 Xcode에서 액세스)을 통해 사용할 수 있습니다. |
사파리 : 장치 | Safaridriver는 장치 UDID가 Safari : DeviceUdid의 값과 일치하는 호스트를 사용하여 세션 만 생성합니다. 장치 UDID는 사례 비교적으로 비교됩니다. 참고 : Xcode가 설치된 경우, 연결된 장치 용 UDID는 Instruments (1) 및 장치 및 시뮬레이터 창 ( "Window> Devices and Simulator"를 통해 Xcode에서 액세스)을 통해 사용할 수 있습니다. |
사파리 : 자동 변환 | 이 기능은 Safari에게 새로 만들어진 창을 반환하기 전에 웹 검사관과 JavaScript 디버거를 배경으로 예압하도록 지시합니다. JavaScript에서 테스트의 실행을 일시 중지하고 Web Inspector의 디버거 탭을 일으키려면 디버거를 간단히 평가할 수 있습니다. 테스트 페이지에서 문장. |
사파리 : 자동 프로파일 링 | 이 기능은 Safari에게 웹 검사관을 사전로드하고 새로 만들어진 창을 반환하기 전에 백그라운드에서 타임 라인 녹화를 시작하도록 지시합니다. 녹음을 보려면 Safari의 개발 메뉴를 통해 웹 검사관을 엽니 다. |
Webkit : Webrtc | 이 기능을 통해 테스트는 WEBRTC 및 미디어 캡처에 대한 Safari의 정책을 일시적으로 변경할 수 있습니다. WebKit : WebRTC 기능의 가치는 다음과 같은 하위 키를 가진 사전입니다. 모두 선택 사항입니다. DisableInsecureMediaCapture 일반적으로 Safari는 미디어 캡처를 통해 미디어 캡처를 허용하지 않습니다. 이 제한은 테스트 목적으로 WebDriver 세션에 대해 기본적으로 완화됩니다 (예 : HTTPS 용으로 구성되지 않은 테스트 웹 서버). 이 기능이 지정되면 Safari는 불안한 연결을 통해 미디어 캡처를 방지하는 정상적인 동작으로 되돌아갑니다. DisableICECandidateFiltering 사용자의 개인 정보를 보호하기 위해 Safari는 일반적으로 캡처 장치가 사용되지 않을 때 내부 네트워크 주소에 해당하는 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