Este é o Appium Driver para automatizar o Safari no MacOS e o iOS desde a versão 13. O driver suporta apenas a automação do Safari usando o protocolo W3C WebDriver. Sob o capô, este motorista é um invólucro/proxy sobre o binário safaridriver
da Apple. Verifique a saída do comando man safaridriver
para obter mais detalhes sobre os recursos suportados e possíveis armadilhas.
Observação
Desde a versão 3.0.0 O Driver Safari retirou o suporte do Appium 1 e é compatível apenas com Appium 2. Use o comando
appium driver install safari
para adicioná -lo ao seu Appium 2 Dist.
É obrigatório executar o comando safaridriver --enable
do terminal MacOS e fornecer a senha do seu administrador antes que qualquer sessão automatizada seja executada. Para automatizar o Safari em dispositivos reais, também é necessário ativar a chave de automação remota nas Settings → Safari → Advanced → Remote Automation
para esses dispositivos específicos.
Então você precisa decidir onde o teste automatizado será executado. O Driver Safari suporta as seguintes plataformas de destino:
O Driver Safari permite definir vários critérios para a seleção da plataforma e também ajustar suas propriedades de sessão de automação. Isso pode ser feito através dos seguintes recursos de sessão:
Nome de capacidade | Descrição |
---|---|
Nome da plataforma | O Safaridriver Binary pode criar apenas sessões do WebDriver para desktop ou safari móvel e só pode ser executado no macOS. O valor do nome da plataforma pode ser igual a 'Mac' ou 'iOS' para iniciar a sessão de driver Safari para a plataforma correspondente. Os valores do nome da plataforma são comparados de maneira insensível. |
AutomationName | O valor do nome da automação deve ser igual a 'safari' para iniciar a sessão do driver Safari. Os valores do nome da automação são comparados em caso de caso. |
Nome da navegação | O Safaridriver pode criar apenas sessões do WebDriver para Safari. Qualquer valor passado para esse recurso será alterado para 'Safari'. |
navegação por navegação | O Safaridriver criará apenas uma sessão usando hosts cuja versão do Safari corresponde ao valor da navegação. Os números da versão do navegador são correspondidos pelo prefixo. Por exemplo, se o valor da navegação é '12', isso permitirá que os hosts com uma versão Safari de '12 .0.1 'ou '12 .1'. |
AceptInsecureCerts | Faz o navegador ignorar o aviso de segurança apropriado e, portanto, permite a navegação em sites com certificados TLS inválidos ou expirados. A capacidade é suportada desde o Safaridriver v15.4. |
Safari: PlatformVersion | O Safaridriver criará apenas uma sessão usando hosts cuja versão do OS corresponde ao valor do Safari: PlatformVersion. Os números da versão do sistema operacional são correspondidos pelo prefixo. Por exemplo, se o valor do safari: a plataforma é '12', isso permitirá que os hosts com uma versão do sistema operacional '12 .0 'ou '12 .1', mas não '10 .12 '. |
Safari: PlatformbuildVersion | O Safaridriver criará apenas uma sessão usando hosts cuja versão do sistema operacional corresponde ao valor do Safari: plataformbuildVersion. Exemplo de uma versão do Build MacOS é '18e193'. No MacOS, a versão de compilação do sistema operacional pode ser determinada executando o utilitário sw_vers (1). |
Safari: usaImulator | Se o valor do safari: usaImulator for verdadeiro, o Safaridriver usará apenas os hosts do simulador iOS. Se o valor do Safari: usaImulator for falso, o Safaridriver não usará os hosts do simulador iOS. Nota: É necessária uma instalação do Xcode para executar os testes do WebDriver nos hosts do simulador iOS. |
Safari: DeviceType | Se o valor do Safari: DeviceType for 'iPhone', o Safaridriver só criará uma sessão usando um dispositivo iPhone ou um simulador de iPhone. Se o valor do Safari: DeviceType for 'iPad', o Safaridriver só criará uma sessão usando um dispositivo iPad ou um simulador de iPad. Os valores do safari: DeviceType são comparados de caso. |
Safari: deviceName | O Safaridriver criará apenas uma sessão usando hosts cujo nome do dispositivo corresponde ao valor do Safari: DeviceName. Os nomes dos dispositivos são comparados em caso de caixa. Nota: Os nomes de dispositivos para dispositivos conectados são mostrados no iTunes. Se o Xcode estiver instalado, os nomes de dispositivos para dispositivos conectados estarão disponíveis através da saída de instrumentos (1) e na janela Dispositivos e simuladores (acessados no Xcode via "Window> Devices and Simulators"). |
Safari: Deviceudid | O Safaridriver criará apenas uma sessão usando hosts cujo dispositivo UDID corresponde ao valor do Safari: DeviceUDID. Os UDIDs do dispositivo são comparados de maneira insensível. Nota: Se o Xcode estiver instalado, os UDIDs para dispositivos conectados estarão disponíveis através da saída de instrumentos (1) e na janela Dispositivos e simuladores (acessados no Xcode via "Window> Dispositivos e simuladores"). |
Safari: AutomaticInspeção | Esse recurso instrui o Safari a pré-carregar o inspetor da Web e o depurador JavaScript em segundo plano antes de retornar uma janela recém-criada. Para pausar a execução do teste no JavaScript e criar a guia Depurador do Inspetor da Web, você pode simplesmente avaliar um depurador; Declaração na página de teste. |
Safari: Profilitação automática | Esse recurso instrui o Safari a pré-carregar o Inspetor da Web e iniciar uma gravação da linha do tempo em segundo plano antes de retornar uma janela recém-criada. Para visualizar a gravação, abra o inspetor da Web no menu Develop Develop do Safari. |
Webkit: WebRTC | Esse recurso permite que um teste altere temporariamente as políticas do Safari para o WebRTC e a captura de mídia. O valor do recurso WebKit: WebRTC é um dicionário com as seguintes sub -teclas, todas opcionais: DisableInsecureMediaCapture - normalmente, o Safari se recusa a permitir a captura de mídia sobre conexões inseguras. Essa restrição é relaxada por padrão para sessões do WebDriver para fins de teste (por exemplo, um servidor da Web de teste não configurado para HTTPS). Quando esse recurso for especificado, o Safari reverte para o comportamento normal de impedir a captura de mídia sobre conexões inseguras. DisableICECandidateFiltering - Para proteger a privacidade de um usuário, o Safari normalmente filtra os candidatos a gelo WebRTC que correspondem aos endereços de rede interna quando os dispositivos de captura não estão em uso. Essa capacidade suprime a filtragem de candidatos ao gelo, para que os endereços de rede internos e externos sejam sempre enviados como candidatos a gelo. |
# 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