Il s'agit d'un pilote Appium pour l'automatisation de Safari sur MacOS et IOS depuis la version 13. Le pilote prend en charge uniquement safari Automation à l'aide du protocole W3C WebDriver. Sous le capot, ce pilote est un emballage / proxy sur le binaire safaridriver
d'Apple. Vérifiez la sortie de la commande man safaridriver
pour obtenir plus de détails sur les fonctionnalités prises en charge et les pièges possibles.
Note
Étant donné que le pilote Safari de la version 3.0.0 a supprimé la prise en charge d'Appium 1 et n'est compatible qu'Appium 2. Utilisez la commande
appium driver install safari
pour l'ajouter à votre Appium 2 Dist.
Il est obligatoire d'exécuter la commande safaridriver --enable
à partir du terminal macOS et de fournir votre mot de passe administrateur avant que toute session automatisée ne soit exécutée. Afin d'automatiser Safari sur des appareils réels, il est également nécessaire d'activer le commutateur d'automatisation à distance dans Settings → Safari → Advanced → Remote Automation
pour ces appareils particuliers.
Ensuite, vous devez décider où le test automatisé va être exécuté. Safari Driver prend en charge les plates-formes cibles suivantes:
Safari Driver permet de définir plusieurs critères pour la sélection de la plate-forme et également d'améliorer vos propriétés de session d'automatisation. Cela pourrait être fait via les capacités de session suivantes:
Nom de capacité | Description |
---|---|
jeu de plate-forme | Safaridriver Binary ne peut créer des sessions WebDriver que pour le bureau ou le safari mobile et ne peut fonctionner que sur macOS. La valeur de la plate-forme peut être égale à «Mac» ou «iOS» afin de démarrer la session de pilote Safari pour la plate-forme correspondante. Les valeurs de la plate-forme sont comparées dans l'insensibilité. |
nom d'automatisation | La valeur de l'automatisation doit être égale à «Safari» afin de démarrer la session du pilote Safari. Les valeurs de l'automatisation sont comparées dans l'insensibilité. |
nom de navigation | Safaridriver ne peut créer des sessions WebDriver que pour Safari. Toute valeur transmise à cette capacité sera modifiée en «Safari». |
navigation | Safaridriver ne créera qu'une session à l'aide d'hôtes dont la version Safari correspond à la valeur de BrowserVersion. Les numéros de version du navigateur sont assortis de préfixe. Par exemple, si la valeur de BrowserVersion est «12», cela permettra aux hôtes avec une version Safari de '12 .0.1 'ou '12 .1'. |
AcceptInSecureCerts | Fait le navigateur pour ignorer l'avertissement de sécurité approprié et permet ainsi à la navigation aux sites Web ayant des certificats TLS invalides ou expirés. La capacité est prise en charge depuis Safaridriver v15.4. |
Safari: Version de plate-forme | Safaridriver ne créera qu'une session en utilisant des hôtes dont la version OS correspond à la valeur de Safari: PlatformVersion. Les numéros de version du système d'exploitation sont assortis de préfixe. Par exemple, si la valeur de Safari: PlatformVersion est «12», cela permettra aux hôtes avec une version OS de '12 .0 'ou '12 .1' mais pas '10 .12 '. |
Safari: PlatformBuildVersion | Safaridriver ne créera qu'une session en utilisant des hôtes dont la version de construction OS correspond à la valeur de Safari: PlatformBuildVersion. L'exemple d'une version de build macOS est «18E193». Sur MacOS, la version de construction du système d'exploitation peut être déterminée en exécutant l'utilitaire SW_VERS (1). |
Safari: using iMulateur | Si la valeur de Safari: Using iMulator est vraie, Safaridriver n'utilisera que des hôtes de simulateur iOS. Si la valeur de Safari: USEDIMulator est fausse, Safaridriver n'utilisera pas les hôtes de simulateur iOS. Remarque: Une installation Xcode est requise afin d'exécuter des tests WebDriver sur les hôtes du simulateur iOS. |
Safari: DeviceType | Si la valeur de Safari: DeviceType est «iPhone», Safaridriver ne créera qu'une session à l'aide d'un appareil iPhone ou d'un simulateur iPhone. Si la valeur de Safari: DeviceType est «iPad», Safaridriver ne créera qu'une session à l'aide d'un périphérique iPad ou d'un simulateur iPad. Les valeurs de Safari: DeviceType sont comparées dans le cas insensible. |
Safari: Devicename | Safaridriver ne créera qu'une session à l'aide d'hôtes dont le nom de l'appareil correspond à la valeur de Safari: DeviceName. Les noms de périphériques sont comparés dans l'insensibilité. Remarque: les noms de périphériques pour les périphériques connectés sont affichés dans iTunes. Si Xcode est installé, les noms de périphériques pour les périphériques connectés sont disponibles via la sortie des instruments (1) et dans la fenêtre Devices and Simulators (accessible dans Xcode via "Fenêtre> Dispositifs et simulateurs"). |
Safari: Deviceudid | Safaridriver ne créera qu'une session à l'aide d'hôtes dont le périphérique UDID correspond à la valeur de Safari: Deviceudid. Les UDID de dispositif sont comparés dans le cas. Remarque: Si Xcode est installé, les UDID pour les périphériques connectés sont disponibles via la sortie des instruments (1) et dans la fenêtre des périphériques et simulateurs (accessible dans Xcode via "Fenêtre> Dispositifs et simulateurs"). |
Safari: AutomaticInspection | Cette capacité demande à Safari de précharger l'inspecteur Web et le débogueur JavaScript en arrière-plan avant de retourner une fenêtre nouvellement créée. Pour suspendre l'exécution du test en JavaScript et afficher l'onglet débogueur de l'inspecteur Web, vous pouvez simplement évaluer un débogueur; déclaration dans la page de test. |
Safari: Automaticprofil | Cette capacité demande à Safari de précharger l'inspecteur Web et de démarrer un enregistrement de chronologie en arrière-plan avant de retourner une fenêtre nouvellement créée. Pour afficher l'enregistrement, ouvrez l'inspecteur Web via le menu de développement de Safari. |
webkit: webrtc | Cette capacité permet à un test de modifier temporairement les politiques de Safari pour la capture de WebBrTC et des médias. La valeur du webkit: la capacité de webrtc est un dictionnaire avec les sous-clés suivants, qui sont tous facultatifs: DisableInsecureMediaCapture - normalement, Safari refuse d'autoriser la capture des médias par rapport aux connexions non sécurisées. Cette restriction est assouplie par défaut pour les sessions WebDriver à des fins de test (par exemple, un serveur Web de test non configuré pour HTTPS). Lorsque cette capacité est spécifiée, Safari reviendra au comportement normal de la prévention de la capture des médias par rapport aux connexions non sécurisées. DisableICECandidateFiltering - Pour protéger la confidentialité d'un utilisateur, Safari filtre normalement les candidats de glace WebBrTC qui correspondent aux adresses du réseau interne lorsque les appareils de capture ne sont pas utilisés. Cette capacité supprime le filtrage des candidats ICE afin que les adresses de réseau internes et externes soient toujours envoyées comme candidats 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