Ini adalah driver appium untuk mengotomatiskan Safari di macOS dan iOS sejak versi 13. Driver hanya mendukung Safari Automation menggunakan W3C Webdriver Protocol. Di bawah kap pengemudi ini adalah pembungkus/proxy di atas biner safaridriver
Apple. Periksa output perintah man safaridriver
untuk mendapatkan detail lebih lanjut tentang fitur yang didukung dan kemungkinan jebakan.
Catatan
Sejak Versi 3.0.0 Safari Driver telah menjatuhkan dukungan Appium 1, dan hanya kompatibel dengan Appium 2. Gunakan perintah
appium driver install safari
untuk menambahkannya ke appium 2 Anda dist.
Adalah wajib untuk menjalankan perintah safaridriver --enable
dari terminal macOS dan memberikan kata sandi administrator Anda sebelum sesi otomatis mana pun akan dieksekusi. Untuk mengotomatiskan Safari pada perangkat nyata, juga perlu untuk mengaktifkan sakelar otomatisasi jarak jauh di Settings → Safari → Advanced → Remote Automation
untuk perangkat khusus ini.
Maka Anda perlu memutuskan di mana tes otomatis akan dieksekusi. Safari Driver mendukung platform target berikut:
Safari Driver memungkinkan untuk menentukan beberapa kriteria untuk pemilihan platform dan juga untuk menyempurnakan properti sesi otomatisasi Anda. Ini bisa dilakukan melalui kemampuan sesi berikut:
Nama kemampuan | Keterangan |
---|---|
PlatformName | Safaridriver Binary hanya dapat membuat sesi webdriver untuk desktop atau safari seluler dan hanya dapat berjalan di macOS. Nilai PlatformName dapat sama dengan 'Mac' atau 'iOS' untuk memulai sesi driver Safari untuk platform yang sesuai. Nilai platformName dibandingkan case-sensitif. |
AutomationName | Nilai OtomationName harus sama dengan 'Safari' untuk memulai sesi pengemudi Safari. Nilai nama otomasi dibandingkan dengan case-sensitif. |
nama browsery | Safaridriver hanya dapat membuat Sesi Webdriver untuk Safari. Nilai apa pun yang ditularkan ke kemampuan ini akan diubah menjadi 'Safari'. |
BrowserVersion | Safaridriver hanya akan membuat sesi menggunakan host yang versi safarinya cocok dengan nilai browserVersion. Nomor versi browser cocok dengan awalan. Misalnya, jika nilai browserver adalah '12', ini akan memungkinkan host dengan versi safari '12 .0.1 'atau '12 .1'. |
AcceptIncurecerts | Membuat browser mengabaikan peringatan keamanan yang sesuai dan dengan demikian memungkinkan navigasi ke situs web yang memiliki sertifikat TLS yang tidak valid atau kedaluwarsa. Kemampuan didukung sejak Safaridriver v15.4. |
Safari: PlatformVersion | Safaridriver hanya akan membuat sesi menggunakan host yang versi OSnya cocok dengan nilai Safari: PlatformVersion. Nomor versi OS cocok dengan awalan. Misalnya, jika nilai Safari: PlatformVersion adalah '12', ini akan memungkinkan host dengan versi OS '12 .0 'atau '12 .1' tetapi tidak '10 .12 '. |
Safari: PlatformBuildVersion | Safaridriver hanya akan membuat sesi menggunakan host yang versi OS Build yang cocok dengan nilai Safari: PlatformBuildVersion. Contoh versi MacOS Build adalah '18E193'. Pada MacOS, versi OS Build dapat ditentukan dengan menjalankan utilitas SW_VERS (1). |
Safari: Penggunaan | Jika nilai Safari: Penggunaan adalah benar, Safaridriver hanya akan menggunakan host simulator iOS. Jika nilai Safari: Penggunaan false, safaridriver tidak akan menggunakan host simulator iOS. Catatan: Instalasi Xcode diperlukan untuk menjalankan tes webdriver pada host simulator iOS. |
Safari: DeviceType | Jika nilai Safari: DeviceType adalah 'iPhone', Safaridriver hanya akan membuat sesi menggunakan perangkat iPhone atau simulator iPhone. Jika nilai Safari: DeviceType adalah 'iPad', Safaridriver hanya akan membuat sesi menggunakan perangkat iPad atau simulator iPad. Nilai Safari: Devicetype dibandingkan dengan case-tidak sensitif. |
Safari: DeviceName | Safaridriver hanya akan membuat sesi menggunakan host yang nama perangkatnya cocok dengan nilai Safari: DeviceName. Nama perangkat dibandingkan secara tidak sensitif. Catatan: Nama perangkat untuk perangkat yang terhubung ditampilkan di iTunes. Jika Xcode diinstal, nama perangkat untuk perangkat yang terhubung tersedia melalui output instrumen (1) dan di jendela perangkat dan simulator (diakses di Xcode melalui "jendela> perangkat dan simulator"). |
Safari: Deviceudid | Safaridriver hanya akan membuat sesi menggunakan host yang perangkat yang sesuai dengan nilai safari: deviceudid. Udid perangkat dibandingkan dengan case-sensitif. Catatan: Jika XCODE diinstal, UDIDS untuk perangkat yang terhubung tersedia melalui output instrumen (1) dan di jendela perangkat dan simulator (diakses di Xcode melalui "jendela> perangkat dan simulator"). |
Safari: AutomaticPection | Kemampuan ini menginstruksikan Safari untuk Preload The Web Inspector dan JavaScript Debugger di latar belakang sebelum mengembalikan jendela yang baru dibuat. Untuk menjeda eksekusi tes di JavaScript dan memunculkan tab Debugger Inspektur Web, Anda dapat dengan mudah mengevaluasi debugger; pernyataan di halaman tes. |
Safari: PRofiling otomatis | Kemampuan ini menginstruksikan Safari untuk memuat inspektur web dan memulai perekaman garis waktu di latar belakang sebelum mengembalikan jendela yang baru dibuat. Untuk melihat perekaman, buka Inspektur Web melalui menu Safari's Develop. |
Webkit: WebRTC | Kemampuan ini memungkinkan tes untuk sementara mengubah kebijakan Safari untuk WEBRTC dan penangkapan media. Nilai Webkit: Kemampuan WEBRTC adalah kamus dengan sub -key berikut, yang semuanya opsional: DisableInsecureMediaCapture - biasanya, Safari menolak untuk memungkinkan penangkapan media atas koneksi yang tidak aman. Pembatasan ini rileks secara default untuk sesi webdriver untuk tujuan pengujian (misalnya, server web uji yang tidak dikonfigurasi untuk HTTPS). Ketika kemampuan ini ditentukan, Safari akan kembali ke perilaku normal mencegah penangkapan media atas koneksi yang tidak aman. DisableICECandidateFiltering - Untuk melindungi privasi pengguna, Safari biasanya menyaring kandidat es WebRTC yang sesuai dengan alamat jaringan internal ketika perangkat penangkapan tidak digunakan. Kemampuan ini menekan penyaringan kandidat ICE sehingga alamat jaringan internal dan eksternal selalu dikirim sebagai kandidat 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