هذا هو برنامج تشغيل Appium لأتمتة Safari على MacOS و iOS منذ الإصدار 13. يدعم برنامج التشغيل أتمتة Safari فقط باستخدام بروتوكول W3C WebDriver. تحت غطاء المحرك هذا السائق عبارة عن غلاف/وكيل على ثنائي safaridriver
من Apple. تحقق من إخراج أمر man safaridriver
للحصول على مزيد من التفاصيل حول الميزات المدعومة والمخاطر المحتملة.
ملحوظة
نظرًا لأن برنامج Safari Driver الإصدار 3.0.0 قد أسقط دعم Appium 1 ، وهو متوافق فقط مع Appium 2. استخدم أمر
appium driver install safari
لإضافته إلى Appium 2 Dist.
من الضروري تشغيل أمر safaridriver --enable
من محطة MacOS وتزويد كلمة مرور المسؤول قبل تنفيذ أي جلسة تلقائية. من أجل أتمتة Safari على الأجهزة الحقيقية ، من الضروري أيضًا تمكين مفتاح التشغيل الآلي عن بُعد في Settings → Safari → Advanced → Remote Automation
لهذه الأجهزة المعينة.
ثم تحتاج إلى تحديد مكان تنفيذ الاختبار الآلي. يدعم سائق Safari المنصات المستهدفة التالية:
يسمح Safari Driver بتحديد معايير متعددة لاختيار النظام الأساسي وأيضًا ضبط خصائص جلسة الأتمتة الخاصة بك. يمكن القيام بذلك عبر إمكانيات الجلسة التالية:
اسم القدرة | وصف |
---|---|
PlatformName | يمكن لـ SafaridRiver Binary إنشاء جلسات WebDriver فقط لسطح المكتب أو Safari للهاتف المحمول ويمكن أن تعمل فقط على MacOS. يمكن أن تساوي قيمة اسم النظام الأساسي "Mac" أو "iOS" من أجل بدء جلسة سائق Safari للمنصة المقابلة. تتم مقارنة قيم الاسم المنصية بشكل غير متوقع. |
أتمتة الاسم | يجب أن تساوي قيمة AutomationName "Safari" من أجل بدء جلسة سائق Safari. تتم مقارنة قيم AutomationName بشكل غير مرغوب فيه. |
الاسم المستعبو | يمكن لـ SafaridRiver إنشاء جلسات WebDriver فقط لـ Safari. سيتم تغيير أي قيمة تنتقل إلى هذه القدرة إلى "Safari". |
المتصفح | ستقوم SafaridRiver بإنشاء جلسة فقط باستخدام مضيفين يتطابق إصدار Safari مع قيمة المتصفح. أرقام إصدار المتصفح هي مطابقة البادئة. على سبيل المثال ، إذا كانت قيمة Browserversion هي "12" ، فسيسمح ذلك للمضيفين بإصدار Safari من '12 .0.1 'أو '12 .1'. |
قبول ectecureCerts | يجعل المتصفح يتجاهل التحذير الأمني المناسب ، وبالتالي يسمح للملاحة بالمواقع على الويب التي لها شهادات TLS غير صالحة أو منتهية الصلاحية. يتم دعم القدرة منذ SafaridRiver v15.4. |
سفاري: منصة | ستقوم SafarIdRiver بإنشاء جلسة فقط باستخدام مضيفات يتطابق إصدار نظام التشغيل الذين يتطابق إصدار Safari: PlatformVersion. أرقام إصدار OS هي مطابقة بادئة. على سبيل المثال ، إذا كانت قيمة Safari: Platformverse هي "12" ، فسيسمح ذلك للمضيفين بإصدار OS من "12 .0" أو "12 .1" ولكن ليس "10 .12". |
Safari: PlatformBuildversion | ستقوم SafarIdRiver بإنشاء جلسة فقط باستخدام مضيفات تتطابق إصدار OS Build مع قيمة Safari: PlatformBuildversion. مثال على نسخة بناء MacOS هو "18E193". على MacOS ، يمكن تحديد إصدار إنشاء نظام التشغيل عن طريق تشغيل الأداة المساعدة SW_Vers (1). |
سفاري: يستخدم | إذا كانت قيمة Safari: useMulator صحيحة ، فإن SafaridRiver ستستخدم فقط مضيفي محاكي iOS. إذا كانت قيمة Safari: useMulator خاطئة ، فلن تستخدم SafaridRiver مضيفي محاكي iOS. ملاحظة: مطلوب تثبيت Xcode من أجل تشغيل اختبارات WebDriver على مضيفات محاكي iOS. |
Safari: DeviceType | إذا كانت قيمة Safari: DeviceType هي "iPhone" ، فسيقوم SafarIdRiver بإنشاء جلسة فقط باستخدام جهاز iPhone أو جهاز iPhone. إذا كانت قيمة Safari: DeviceType هي "iPad" ، فسيقوم SafaridRiver بإنشاء جلسة فقط باستخدام جهاز iPad أو محاكاة iPad. قيم Safari: تتم مقارنة deviceType بشكل غير محدود. |
Safari: Devicename | سيقوم SafaridRiver بإنشاء جلسة فقط باستخدام المضيفين الذين يتطابق اسم جهازهم مع قيمة Safari: Devicename. تتم مقارنة أسماء الأجهزة بشكل غير مرغوب فيه. ملاحظة: يتم عرض أسماء الأجهزة للأجهزة المتصلة في iTunes. إذا تم تثبيت Xcode ، تتوفر أسماء الأجهزة للأجهزة المتصلة عبر إخراج الأدوات (1) وفي نافذة الأجهزة والمحاكاة (التي يتم الوصول إليها في Xcode عبر "Window> الأجهزة والمحاكاة"). |
Safari: DeviceUdid | ستقوم SafaridRiver بإنشاء جلسة فقط باستخدام مضيفات يطابق جهاز UDID قيمة Safari: DeviceUdid. تتم مقارنة uDIDs الجهاز بشكل غير ملائم. ملاحظة: إذا تم تثبيت Xcode ، فإن UDIDs للأجهزة المتصلة متوفرة عبر إخراج الأدوات (1) وفي نافذة الأجهزة والمحاكاة (التي يتم الوصول إليها في Xcode عبر "Window> الأجهزة والمحاكاة"). |
Safari: AutomaticInspection | هذه الإمكانية ترشد Safari إلى التحميل مسبقًا لمفتش الويب وتصحيح الأخطاء JavaScript في الخلفية قبل إعادة نافذة تم إنشاؤها حديثًا. لإيقاف تنفيذ الاختبار في JavaScript وإحضار علامة تصحيح أخطاء مفتش الويب ، يمكنك ببساطة تقييم تصحيح الأخطاء ؛ بيان في صفحة الاختبار. |
Safari: AutomaticProfiling | ترشد هذه الإمكانية Safari إلى التحميل المسبق لمفتش الويب وبدء تسجيل جدول زمني في الخلفية قبل إرجاع نافذة تم إنشاؤها حديثًا. لعرض التسجيل ، افتح مفتش الويب من خلال قائمة تطوير Safari. |
WebKit: Webrtc | تتيح هذه الإمكانية إجراء الاختبار لتغيير سياسات Safari مؤقتًا لـ WEBRTC والتقاط الوسائط. قيمة 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