إطار أتمتة المتصفح الكل في واحد:
الزحف على شبكة الإنترنت / الاختبار / الكشط / التخفي
ابدأ | ؟ المميزات | ⁉️ الخيارات | أمثلة | ؟ مخطوطات | متحرك
واجهات برمجة التطبيقات | ؟ التنسيقات | ؟ مسجل | لوحة القيادة | ؟ اللغات | مزرعة
️ واجهة المستخدم الرسومية | ؟ صفحة الاختبار | ؟ وضع جامعة كاليفورنيا | ؟ وضع CDP | ؟ رسوم بيانية | شبكة
⁉️ كيف | ؟ ترحيل | خطط الحالة | ♻️ القالب | ؟ هجين | ؟ جولات
؟ سي/سي دي | ⁉️ JSMgr | ؟ مترجم | مقدم | ؟ الحوار | ️ بصرية
SeleniumBase هي مجموعة الأدوات الاحترافية لأنشطة أتمتة الويب. تم تصميمه لاختبار مواقع الويب وتجاوز اختبارات CAPTCHA وتعزيز الإنتاجية وإكمال المهام وتوسيع نطاق أعمالك.
تعلم من أكثر من 200 مثال في مجلد SeleniumBase/examples/ .
؟ لاحظ أن وضع SeleniumBase UC (وضع التخفي) له الملف التمهيدي الخاص به.
؟ لاحظ أيضًا أن وضع Seleniumbase CDP له ملف تمهيدي منفصل خاص به.
يمكن استدعاء البرامج النصية عبر python
، على الرغم من أن بعض تنسيقات Syntax تتوقع pytest (إطار عمل اختبار وحدة Python المضمن مع SeleniumBase والذي يمكنه اكتشاف الاختبارات وجمعها وتشغيلها تلقائيًا).
؟ إليك my_first_test.py، الذي يختبر تسجيل الدخول والتسوق والخروج:
pytest my_first_test.py
يستخدم
pytest
--chrome
افتراضيًا ما لم يتم ضبطه بشكل مختلف.
؟ إليك test_coffee_cart.py، الذي يتحقق من موقع التجارة الإلكترونية:
pytest test_coffee_cart.py --demo
(
--demo
يبطئ الاختبارات ويسلط الضوء على الإجراءات)
؟ إليك test_demo_site.py، والذي يغطي عدة إجراءات:
pytest test_demo_site.py
من السهل الكتابة والنقر والتحديد والتبديل والسحب والإفلات والمزيد.
(لمزيد من الأمثلة، راجع المجلد SeleniumBase/examples/.)
اكتشف الملف التمهيدي:
- البدء / التثبيت
- المثال الأساسي/الاستخدام
- طرق الاختبار الشائعة
- حقائق ممتعة / اعرف المزيد
- الوضع التجريبي/تصحيح الأخطاء
- خيارات سطر الأوامر
- تكوين الدليل
- لوحة معلومات قاعدة السيلينيوم
- إنشاء تقارير الاختبار
SeleniumBase هو إطار عمل Python لأتمتة المتصفح واختباره. يستخدم SeleniumBase واجهات برمجة تطبيقات Selenium/WebDriver ويتضمن برامج اختبار مثل pytest
و pynose
behave
لتوفير بنية منظمة واكتشاف الاختبار وتنفيذ الاختبار وحالة الاختبار ( على سبيل المثال، تم النجاح أو الفشل أو التخطي )، وخيارات سطر الأوامر لتغيير الإعدادات الافتراضية ( مثل اختيار المتصفح ). باستخدام السيلينيوم الخام، ستحتاج إلى إعداد محلل الخيارات الخاص بك لتكوين الاختبارات من سطر الأوامر.
يمنحك مدير برامج التشغيل الخاص بـ SeleniumBase مزيدًا من التحكم في تنزيلات برامج التشغيل التلقائية. (استخدم --driver-version=VER
مع أمر pytest
run لتحديد الإصدار.) افتراضيًا، سيقوم SeleniumBase بتنزيل إصدار برنامج التشغيل الذي يطابق إصدار المتصفح الرئيسي لديك إذا لم يتم تعيينه.
يكتشف SeleniumBase تلقائيًا بين محددات CSS وXPath، مما يعني أنك لا تحتاج إلى تحديد نوع المحدد في أوامرك ( ولكن يمكنك ذلك اختياريًا ).
غالبًا ما تقوم أساليب SeleniumBase بتنفيذ إجراءات متعددة في استدعاء أسلوب واحد. على سبيل المثال، يقوم self.type(selector, text)
بما يلي:
1. ينتظر حتى يصبح العنصر مرئيًا.
2. ينتظر حتى يصبح العنصر تفاعليًا.
3. يمسح حقل النص.
4. أنواع في النص الجديد.
5. اضغط على Enter/Submit إذا كان النص ينتهي بـ "n"
.
مع السيلينيوم الخام، تتطلب هذه الإجراءات استدعاءات طرق متعددة.
يستخدم SeleniumBase قيم المهلة الافتراضية عندما لا يتم تعيينها:
✅ self.click("button")
مع السيلينيوم الخام، ستفشل الطرق على الفور ( افتراضيًا ) إذا احتاج العنصر إلى مزيد من الوقت للتحميل:
self.driver.find_element(by="css selector", value="button").click()
(الكود الموثوق به أفضل من الكود غير الموثوق به.)
يتيح لك SeleniumBase تغيير قيم المهلة الصريحة للطرق:
✅ self.click("button", timeout=10)
مع السيلينيوم الخام، يتطلب ذلك المزيد من التعليمات البرمجية:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable("css selector", "button")).click()
(الكود البسيط أفضل من الكود المعقد.)
يمنحك SeleniumBase إخراج خطأ نظيف عند فشل الاختبار. مع السيلينيوم الخام، يمكن أن تصبح رسائل الخطأ فوضوية للغاية.
يمنحك SeleniumBase خيار إنشاء لوحة معلومات وتقارير للاختبارات. كما أنه يحفظ لقطات الشاشة من الاختبارات الفاشلة في المجلد ./latest_logs/
. لا يحتوي السيلينيوم الخام على هذه الخيارات الجاهزة.
يتضمن SeleniumBase تطبيقات واجهة المستخدم الرسومية لسطح المكتب لإجراء الاختبارات، مثل SeleniumBase Commander لـ pytest
وSeleniumBase Behave GUI لـ behave
.
يحتوي SeleniumBase على مُسجل/مولد اختبار خاص به لإنشاء اختبارات من إجراءات المتصفح اليدوية.
يأتي SeleniumBase مزودًا ببرنامج إدارة حالات الاختبار ("CasePlans") لتنظيم الاختبارات ووصف الخطوات.
يتضمن SeleniumBase أدوات لإنشاء تطبيقات البيانات ("ChartMaker")، والتي يمكنها إنشاء JavaScript من Python.
التعرف على الطرق المختلفة لكتابة الاختبارات:
إليك test_simple_login.py، الذي يستخدم وراثة فئة BaseCase
، ويعمل مع pytest أو pynose. (استخدم self.driver
للوصول إلى driver
الأولي للسيلينيوم.)
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class TestSimpleLogin ( BaseCase ):
def test_simple_login ( self ):
self . open ( "seleniumbase.io/simple/login" )
self . type ( "#username" , "demo_user" )
self . type ( "#password" , "secret_pass" )
self . click ( 'a:contains("Sign in")' )
self . assert_exact_text ( "Welcome!" , "h1" )
self . assert_element ( "img#image1" )
self . highlight ( "#image1" )
self . click_link ( "Sign out" )
self . assert_text ( "signed out" , "#top_message" )
؟ إليك اختبارًا من sb_fixture_tests.py، والذي يستخدم أداة sb
pytest
. يعمل مع pytest. (استخدم sb.driver
للوصول إلى driver
الأولي لـ Selenium.)
def test_sb_fixture_with_no_class ( sb ):
sb . open ( "seleniumbase.io/simple/login" )
sb . type ( "#username" , "demo_user" )
sb . type ( "#password" , "secret_pass" )
sb . click ( 'a:contains("Sign in")' )
sb . assert_exact_text ( "Welcome!" , "h1" )
sb . assert_element ( "img#image1" )
sb . highlight ( "#image1" )
sb . click_link ( "Sign out" )
sb . assert_text ( "signed out" , "#top_message" )
؟ إليك Raw_login_sb.py، الذي يستخدم مدير سياق SB
. يعمل مع python
نقية. (استخدم sb.driver
للوصول إلى driver
الأولي لـ Selenium.)
from seleniumbase import SB
with SB () as sb :
sb . open ( "seleniumbase.io/simple/login" )
sb . type ( "#username" , "demo_user" )
sb . type ( "#password" , "secret_pass" )
sb . click ( 'a:contains("Sign in")' )
sb . assert_exact_text ( "Welcome!" , "h1" )
sb . assert_element ( "img#image1" )
sb . highlight ( "#image1" )
sb . click_link ( "Sign out" )
sb . assert_text ( "signed out" , "#top_message" )
؟ إليك ملف Raw_login_context.py، الذي يستخدم DriverContext
Manager. يعمل مع python
نقية. ( driver
هو نسخة محسنة من driver
السيلينيوم الخام، مع المزيد من الطرق.)
from seleniumbase import DriverContext
with DriverContext () as driver :
driver . open ( "seleniumbase.io/simple/login" )
driver . type ( "#username" , "demo_user" )
driver . type ( "#password" , "secret_pass" )
driver . click ( 'a:contains("Sign in")' )
driver . assert_exact_text ( "Welcome!" , "h1" )
driver . assert_element ( "img#image1" )
driver . highlight ( "#image1" )
driver . click_link ( "Sign out" )
driver . assert_text ( "signed out" , "#top_message" )
؟ إليك ملف Raw_login_driver.py، الذي يستخدم مدير Driver
. يعمل مع python
نقية. ( driver
هو نسخة محسنة من driver
السيلينيوم الخام، مع المزيد من الطرق.)
from seleniumbase import Driver
driver = Driver ()
try :
driver . open ( "seleniumbase.io/simple/login" )
driver . type ( "#username" , "demo_user" )
driver . type ( "#password" , "secret_pass" )
driver . click ( 'a:contains("Sign in")' )
driver . assert_exact_text ( "Welcome!" , "h1" )
driver . assert_element ( "img#image1" )
driver . highlight ( "#image1" )
driver . click_link ( "Sign out" )
driver . assert_text ( "signed out" , "#top_message" )
finally :
driver . quit ()
إليك ميزة login_app.feature، التي تستخدم صيغة Bebe-BDD Gherkin. يعمل مع behave
. (تعرف على تكامل SeleniumBase Behavior-BDD )
Feature : SeleniumBase scenarios for the Simple App
Scenario : Verify the Simple App (Login / Logout)
Given Open "seleniumbase.io/simple/login"
And Type "demo_user" into "#username"
And Type "secret_pass" into "#password"
And Click 'a:contains("Sign in")'
And Assert exact text "Welcome!" in "h1"
And Assert element "img#image1"
And Highlight "#image1"
And Click link "Sign out"
And Assert text "signed out" in "#top_message"
؟ أضف Python و Git إلى مسار النظام الخاص بك.
؟ يوصى باستخدام بيئة Python الافتراضية.
يمكنك تثبيت seleniumbase
من PyPI أو GitHub:
؟ كيفية تثبيت seleniumbase
من PyPI:
pip install seleniumbase
--upgrade
OR -U
لترقية SeleniumBase.)--force-reinstall
لترقية الحزم غير المباشرة.)pip3
في حالة وجود إصدارات متعددة من Python.) ؟ كيفية تثبيت seleniumbase
من نسخة GitHub:
git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase/
pip install -e .
؟ كيفية ترقية التثبيت الحالي من نسخة GitHub:
git pull
pip install -e .
؟ اكتب seleniumbase
أو sbase
للتحقق من تثبيت SeleniumBase بنجاح:
___ _ _ ___
/ __ | ___ | | ___ _ _ (_)_ _ _ __ | _ ) __ _ ______
_ _ / -_) / -_) ' | | | | ' | _ / _ ` (_- < -_)
| ___/ _ __ | _ _ __ | _ || _ | _ | _ ,_ | _ | _ | _ | ___/ _ _,_/__ | ___ |
----------------------------------------------------
╭──────────────────────────────────────────────────╮
│ * USAGE: " seleniumbase [COMMAND] [PARAMETERS] " │
│ * OR: " sbase [COMMAND] [PARAMETERS] " │
│ │
│ COMMANDS: PARAMETERS / DESCRIPTIONS: │
│ get / install [DRIVER_NAME] [OPTIONS] │
│ methods (List common Python methods) │
│ options (List common pytest options) │
│ behave-options (List common behave options) │
│ gui / commander [OPTIONAL PATH or TEST FILE] │
│ behave-gui (SBase Commander for Behave) │
│ caseplans [OPTIONAL PATH or TEST FILE] │
│ mkdir [DIRECTORY] [OPTIONS] │
│ mkfile [FILE.py] [OPTIONS] │
│ mkrec / codegen [FILE.py] [OPTIONS] │
│ recorder (Open Recorder Desktop App.) │
│ record (If args: mkrec. Else: App.) │
│ mkpres [FILE.py] [LANG] │
│ mkchart [FILE.py] [LANG] │
│ print [FILE] [OPTIONS] │
│ translate [SB_FILE.py] [LANG] [ACTION] │
│ convert [WEBDRIVER_UNITTEST_FILE.py] │
│ extract-objects [SB_FILE.py] │
│ inject-objects [SB_FILE.py] [OPTIONS] │
│ objectify [SB_FILE.py] [OPTIONS] │
│ revert-objects [SB_FILE.py] [OPTIONS] │
│ encrypt / obfuscate │
│ decrypt / unobfuscate │
│ proxy (Start a basic proxy server) │
│ download server (Get Selenium Grid JAR file) │
│ grid-hub [start | stop] [OPTIONS] │
│ grid-node [start | stop] --hub=[HOST/IP] │
│ │
│ * EXAMPLE = > " sbase get chromedriver stable " │
│ * For command info = > " sbase help [COMMAND] " │
│ * For info on all commands = > " sbase --help " │
╰──────────────────────────────────────────────────╯
✅ يقوم SeleniumBase تلقائيًا بتنزيل برامج تشغيل الويب حسب الحاجة، مثل chromedriver
.
*** chromedriver to download = 121.0.6167.85 (Latest Stable)
Downloading chromedriver-mac-arm64.zip from:
https://storage.googleapis.com/chrome-for-testing-public/121.0.6167.85/mac-arm64/chromedriver-mac-arm64.zip ...
Download Complete !
Extracting [ ' chromedriver ' ] from chromedriver-mac-arm64.zip ...
Unzip Complete !
The file [chromedriver] was saved to:
/Users/michael/github/SeleniumBase/seleniumbase/drivers/chromedriver
Making [chromedriver 121.0.6167.85] executable ...
[chromedriver 121.0.6167.85] is now ready for use !
؟ إذا قمت باستنساخ SeleniumBase، فيمكنك إجراء الاختبارات من المجلد/الأمثلة.
إليك my_first_test.py:
cd examples/
pytest my_first_test.py
إليك رمز my_first_test.py:
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class MyTestClass ( BaseCase ):
def test_swag_labs ( self ):
self . open ( "https://www.saucedemo.com" )
self . type ( "#user-name" , "standard_user" )
self . type ( "#password" , "secret_sauce n " )
self . assert_element ( "div.inventory_list" )
self . assert_exact_text ( "Products" , "span.title" )
self . click ( 'button[name*="backpack"]' )
self . click ( "#shopping_cart_container a" )
self . assert_exact_text ( "Your Cart" , "span.title" )
self . assert_text ( "Backpack" , "div.cart_item" )
self . click ( "button#checkout" )
self . type ( "#first-name" , "SeleniumBase" )
self . type ( "#last-name" , "Automation" )
self . type ( "#postal-code" , "77123" )
self . click ( "input#continue" )
self . assert_text ( "Checkout: Overview" )
self . assert_text ( "Backpack" , "div.cart_item" )
self . assert_text ( "29.99" , "div.inventory_item_price" )
self . click ( "button#finish" )
self . assert_exact_text ( "Thank you for your order!" , "h2" )
self . assert_element ( 'img[alt="Pony Express"]' )
self . js_click ( "a#logout_sidebar_link" )
self . assert_element ( "div#login_button_container" )
self . open ( url ) # Navigate the browser window to the URL.
self . type ( selector , text ) # Update the field with the text.
self . click ( selector ) # Click the element with the selector.
self . click_link ( link_text ) # Click the link containing text.
self . go_back () # Navigate back to the previous URL.
self . select_option_by_text ( dropdown_selector , option )
self . hover_and_click ( hover_selector , click_selector )
self . drag_and_drop ( drag_selector , drop_selector )
self . get_text ( selector ) # Get the text from the element.
self . get_current_url () # Get the URL of the current page.
self . get_page_source () # Get the HTML of the current page.
self . get_attribute ( selector , attribute ) # Get element attribute.
self . get_title () # Get the title of the current page.
self . switch_to_frame ( frame ) # Switch into the iframe container.
self . switch_to_default_content () # Leave the iframe container.
self . open_new_window () # Open a new window in the same browser.
self . switch_to_window ( window ) # Switch to the browser window.
self . switch_to_default_window () # Switch to the original window.
self . get_new_driver ( OPTIONS ) # Open a new driver with OPTIONS.
self . switch_to_driver ( driver ) # Switch to the browser driver.
self . switch_to_default_driver () # Switch to the original driver.
self . wait_for_element ( selector ) # Wait until element is visible.
self . is_element_visible ( selector ) # Return element visibility.
self . is_text_visible ( text , selector ) # Return text visibility.
self . sleep ( seconds ) # Do nothing for the given amount of time.
self . save_screenshot ( name ) # Save a screenshot in .png format.
self . assert_element ( selector ) # Verify the element is visible.
self . assert_text ( text , selector ) # Verify text in the element.
self . assert_exact_text ( text , selector ) # Verify text is exact.
self . assert_title ( title ) # Verify the title of the web page.
self . assert_downloaded_file ( file ) # Verify file was downloaded.
self . assert_no_404_errors () # Verify there are no broken links.
self . assert_no_js_errors () # Verify there are no JS errors.
؟ للحصول على القائمة الكاملة لطرق SeleniumBase، راجع: ملخص الطريقة
✅ يتعامل SeleniumBase تلقائيًا مع إجراءات WebDriver الشائعة مثل تشغيل متصفحات الويب قبل الاختبارات، وحفظ لقطات الشاشة أثناء حالات الفشل، وإغلاق متصفحات الويب بعد الاختبارات.
✅ يتيح لك SeleniumBase تخصيص الاختبارات عبر خيارات سطر الأوامر.
✅ يستخدم SeleniumBase بناء جملة بسيط للأوامر. مثال:
self . type ( "input" , "dogs n " ) # (The "n" presses ENTER)
يمكن تشغيل معظم البرامج النصية لـ SeleniumBase باستخدام pytest
أو pynose
أو python
النقي. لا يمكن لجميع المتسابقين في الاختبار تشغيل جميع تنسيقات الاختبار. على سبيل المثال، لا يمكن تشغيل الاختبارات التي تستخدم تركيبات sb
pytest إلا باستخدام pytest
. (راجع تنسيقات بناء الجملة) يوجد أيضًا تنسيق اختبار Gherkin الذي يعمل مع السلوك.
pytest coffee_cart_tests.py --rs
pytest test_sb_fixture.py --demo
pytest test_suite.py --rs --html=report.html --dashboard
pynose basic_test.py --mobile
pynose test_suite.py --headless --report --show-report
python raw_sb.py
python raw_test_scripts.py
behave realworld.feature
behave calculator.feature -D rs -D dashboard
✅ يتضمن pytest
الاكتشاف التلقائي للاختبار. إذا لم تحدد ملفًا أو مجلدًا معينًا لتشغيله، فسيبحث pytest
تلقائيًا في جميع الدلائل الفرعية عن الاختبارات التي سيتم تشغيلها بناءً على المعايير التالية:
test_
أو تنتهي بـ _test.py
.test_
. مع وجود ملف SeleniumBase pytest.ini، يمكنك تعديل إعدادات الاكتشاف الافتراضية. يمكن أن يكون اسم فئة Python أي شيء لأن seleniumbase.BaseCase
يرث unittest.TestCase
لتشغيل الاكتشاف التلقائي.
✅ يمكنك إجراء فحص ما قبل الرحلة لمعرفة الاختبارات التي سيتم اكتشافها بواسطة pytest
قبل التشغيل الفعلي:
pytest --co -q
✅ يمكنك أن تكون أكثر تحديدًا عند استدعاء pytest
أو pynose
على ملف:
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ لا مزيد من الاختبارات غير المستقرة! تنتظر أساليب SeleniumBase تلقائيًا حتى تنتهي عناصر الصفحة من التحميل قبل التفاعل معها ( حتى حد المهلة ). هذا يعني أنك لم تعد بحاجة إلى عبارات time.sleep()
العشوائية في نصوصك البرمجية .
✅ يدعم SeleniumBase جميع المتصفحات وأنظمة التشغيل الرئيسية:
المتصفحات: كروم، إيدج، فايرفوكس، وسفاري.
الأنظمة: Linux/Ubuntu، وmacOS، وWindows.
✅ يعمل SeleniumBase على جميع منصات CI/CD الشائعة:
✅ يتضمن SeleniumBase حلاً هجينًا آليًا/يدويًا يسمى MasterQA لتسريع الاختبار اليدوي باستخدام الأتمتة بينما يتعامل المختبرون اليدويون مع التحقق من الصحة.
✅ يدعم SeleniumBase إجراء الاختبارات أثناء عدم الاتصال بالإنترنت ( بافتراض أنه تم تنزيل برامج تشغيل الويب مسبقًا عند الاتصال بالإنترنت ).
✅ للحصول على قائمة كاملة بميزات SeleniumBase، انقر هنا.
؟ يساعدك الوضع التجريبي على معرفة ما يفعله الاختبار. إذا كان الاختبار يتحرك بسرعة كبيرة جدًا بالنسبة لعينيك، فقم بتشغيله في الوضع التجريبي لإيقاف المتصفح مؤقتًا لفترة وجيزة بين الإجراءات، وتمييز عناصر الصفحة التي يتم التصرف عليها، وعرض التأكيدات:
pytest my_first_test.py --demo
؟ يمكن استخدام time.sleep(seconds)
لإجراء اختبار الانتظار في مكان محدد:
import time ; time . sleep ( 3 ) # Do nothing for 3 seconds.
؟ يساعدك وضع التصحيح مع مكتبة pdb المضمنة في Python على تصحيح الاختبارات:
import pdb ; pdb . set_trace ()
import pytest ; pytest . set_trace ()
breakpoint () # Shortcut for "import pdb; pdb.set_trace()"
(أوامر
pdb
:n
,c
,s
,u
,d
=>next
,continue
,step
,up
,down
)
؟ لإيقاف اختبار نشط يؤدي إلى حدوث استثناء أو خطأ مؤقتًا ( والإبقاء على نافذة المتصفح مفتوحة أثناء بدء وضع التصحيح في وحدة التحكم )، أضف --pdb
كخيار pytest
:
pytest test_fail.py --pdb
؟ لبدء الاختبارات في وضع التصحيح، أضف --trace
كخيار pytest
:
pytest test_coffee_cart.py --trace
✅ فيما يلي بعض خيارات سطر الأوامر المفيدة التي تأتي مع pytest
:
-v # Verbose mode. Prints the full name of each test and shows more details.
-q # Quiet mode. Print fewer details in the console output when running tests.
-x # Stop running the tests after the first failure is reached.
--html=report.html # Creates a detailed pytest-html report after tests finish.
--co | --collect-only # Show what tests would get run. (Without running them)
--co -q # (Both options together!) - Do a dry run with full test names shown.
-n=NUM # Multithread the tests using that many threads. (Speed up test runs!)
-s # See print statements. (Should be on by default with pytest.ini present.)
--junit-xml=report.xml # Creates a junit-xml report after tests finish.
--pdb # If a test fails, enter Post Mortem Debug Mode. (Don't use with CI!)
--trace # Enter Debug Mode at the beginning of each test. (Don't use with CI!)
-m=MARKER # Run tests with the specified pytest marker.
✅ يوفر SeleniumBase خيارات سطر أوامر pytest
إضافية للاختبارات:
--browser=BROWSER # (The web browser to use. Default: "chrome".)
--chrome # (Shortcut for "--browser=chrome". On by default.)
--edge # (Shortcut for "--browser=edge".)
--firefox # (Shortcut for "--browser=firefox".)
--safari # (Shortcut for "--browser=safari".)
--settings-file=FILE # (Override default SeleniumBase settings.)
--env=ENV # (Set the test env. Access with "self.env" in tests.)
--account=STR # (Set account. Access with "self.account" in tests.)
--data=STRING # (Extra test data. Access with "self.data" in tests.)
--var1=STRING # (Extra test data. Access with "self.var1" in tests.)
--var2=STRING # (Extra test data. Access with "self.var2" in tests.)
--var3=STRING # (Extra test data. Access with "self.var3" in tests.)
--variables=DICT # (Extra test data. Access with "self.variables".)
--user-data-dir=DIR # (Set the Chrome user data directory to use.)
--protocol=PROTOCOL # (The Selenium Grid protocol: http|https.)
--server=SERVER # (The Selenium Grid server/IP used for tests.)
--port=PORT # (The Selenium Grid port used by the test server.)
--cap-file=FILE # (The web browser's desired capabilities to use.)
--cap-string=STRING # (The web browser's desired capabilities to use.)
--proxy=SERVER:PORT # (Connect to a proxy server:port as tests are running)
--proxy=USERNAME:PASSWORD@SERVER:PORT # (Use an authenticated proxy server)
--proxy-bypass-list=STRING # (";"-separated hosts to bypass, Eg "*.foo.com")
--proxy-pac-url=URL # (Connect to a proxy server using a PAC_URL.pac file.)
--proxy-pac-url=USERNAME:PASSWORD@URL # (Authenticated proxy with PAC URL.)
--proxy-driver # (If a driver download is needed, will use: --proxy=PROXY.)
--multi-proxy # (Allow multiple authenticated proxies when multi-threaded.)
--agent=STRING # (Modify the web browser's User-Agent string.)
--mobile # (Use the mobile device emulator while running tests.)
--metrics=STRING # (Set mobile metrics: "CSSWidth,CSSHeight,PixelRatio".)
--chromium-arg= " ARG=N,ARG2 " # (Set Chromium args, ","-separated, no spaces.)
--firefox-arg= " ARG=N,ARG2 " # (Set Firefox args, comma-separated, no spaces.)
--firefox-pref=SET # (Set a Firefox preference:value set, comma-separated.)
--extension-zip=ZIP # (Load a Chrome Extension .zip|.crx, comma-separated.)
--extension-dir=DIR # (Load a Chrome Extension directory, comma-separated.)
--disable-features= " F1,F2 " # (Disable features, comma-separated, no spaces.)
--binary-location=PATH # (Set path of the Chromium browser binary to use.)
--driver-version=VER # (Set the chromedriver or uc_driver version to use.)
--sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)
--wfa # (Wait for AngularJS to be done loading after specific web actions.)
--pls=PLS # (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
--headless # (The default headless mode. Linux uses this mode by default.)
--headless1 # (Use Chrome's old headless mode. Fast, but has limitations.)
--headless2 # (Use Chrome's new headless mode, which supports extensions.)
--headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
--xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
--xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
--locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
--interval=SECONDS # (The autoplay interval for presentations & tour steps)
--start-page=URL # (The starting URL for the web browser when tests begin.)
--archive-logs # (Archive existing log files instead of deleting them.)
--archive-downloads # (Archive old downloads instead of deleting them.)
--time-limit=SECONDS # (Safely fail any test that exceeds the time limit.)
--slow # (Slow down the automation. Faster than using Demo Mode.)
--demo # (Slow down and visually see test actions as they occur.)
--demo-sleep=SECONDS # (Set the wait time after Slow & Demo Mode actions.)
--highlights=NUM # (Number of highlight animations for Demo Mode actions.)
--message-duration=SECONDS # (The time length for Messenger alerts.)
--check-js # (Check for JavaScript errors after page loads.)
--ad-block # (Block some types of display ads from loading.)
--host-resolver-rules=RULES # (Set host-resolver-rules, comma-separated.)
--block-images # (Block images from loading during tests.)
--do-not-track # (Indicate to websites that you don't want to be tracked.)
--verify-delay=SECONDS # (The delay before MasterQA verification checks.)
--ee | --esc-end # (Lets the user end the current test via the ESC key.)
--recorder # (Enables the Recorder for turning browser actions into code.)
--rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
--rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
--rec-print # (If the Recorder is enabled, prints output after tests end.)
--disable-cookies # (Disable Cookies on websites. Pages might break!)
--disable-js # (Disable JavaScript on websites. Pages might break!)
--disable-csp # (Disable the Content Security Policy of websites.)
--disable-ws # (Disable Web Security on Chromium-based browsers.)
--enable-ws # (Enable Web Security on Chromium-based browsers.)
--enable-sync # (Enable "Chrome Sync" on websites.)
--uc | --undetected # (Use undetected-chromedriver to evade bot-detection.)
--uc-cdp-events # (Capture CDP events when running in "--undetected" mode.)
--log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
--remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
--ftrace | --final-trace # (Debug Mode after each test. Don't use with CI!)
--dashboard # (Enable the SeleniumBase Dashboard. Saved at: dashboard.html)
--dash-title=STRING # (Set the title shown for the generated dashboard.)
--enable-3d-apis # (Enables WebGL and 3D APIs.)
--swiftshader # (Chrome "--use-gl=angle" / "--use-angle=swiftshader-webgl")
--incognito # (Enable Chrome's Incognito mode.)
--guest # (Enable Chrome's Guest mode.)
--dark # (Enable Chrome's Dark mode.)
--devtools # (Open Chrome's DevTools when the browser opens.)
--rs | --reuse-session # (Reuse browser session for all tests.)
--rcs | --reuse-class-session # (Reuse session for tests in class.)
--crumbs # (Delete all cookies between tests reusing a session.)
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
--window-position=X,Y # (Set the browser's starting window position.)
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
--maximize # (Start tests with the browser window maximized.)
--screenshot # (Save a screenshot at the end of each test.)
--no-screenshot # (No screenshots saved unless tests directly ask it.)
--visual-baseline # (Set the visual baseline for Visual/Layout tests.)
--wire # (Use selenium-wire's webdriver for replacing selenium webdriver.)
--external-pdf # (Set Chromium "plugins.always_open_pdf_externally":True.)
--timeout-multiplier=MULTIPLIER # (Multiplies the default timeout values.)
--list-fail-page # (After each failing test, list the URL of the failure.)
(راجع القائمة الكاملة لتعريفات خيارات سطر الأوامر هنا . للحصول على أمثلة تفصيلية لخيارات سطر الأوامر، راجع customizing_test_runs.md )
؟ أثناء فشل الاختبار، سيتم حفظ السجلات ولقطات الشاشة من أحدث تشغيل اختباري في المجلد latest_logs/
. سيتم نقل هذه السجلات إلى archived_logs/
إذا أضفت --archive_logs إلى خيارات سطر الأوامر، أو قمت بتعيين ARCHIVE_EXISTING_LOGS
على True في settings.py، وإلا فسيتم تنظيف ملفات السجل في بداية التشغيل الاختباري التالي. تحتوي مجموعة test_suite.py
على اختبارات تفشل عمدًا حتى تتمكن من معرفة كيفية عمل التسجيل.
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
هناك طريقة سهلة لتجاوز seleniumbase/config/settings.py وهي استخدام ملف إعدادات مخصص. إليك خيار سطر الأوامر لإضافته إلى الاختبارات: (راجع الأمثلة/custom_settings.py) --settings_file=custom_settings.py
(تتضمن الإعدادات قيم المهلة الافتراضية، ومفتاح المصادقة الثنائي، وبيانات اعتماد قاعدة البيانات، وبيانات اعتماد S3، وإعدادات مهمة أخرى المستخدمة في الاختبارات.)
؟ لتمرير بيانات إضافية من سطر الأوامر إلى الاختبارات، أضف --data="ANY STRING"
. داخل اختباراتك، يمكنك استخدام self.data
للوصول إلى ذلك.
؟ عند إجراء الاختبارات باستخدام pytest
، ستحتاج إلى نسخة من pytest.ini في مجلداتك الجذرية. عند إجراء الاختبارات باستخدام pynose
، ستحتاج إلى نسخة من setup.cfg في مجلداتك الجذرية. تحدد هذه الملفات تفاصيل التكوين الافتراضية للاختبارات. يجب أن تتضمن مجلدات الاختبار أيضًا ملف init .py فارغًا للسماح لملفات الاختبار باستيراد ملفات أخرى من هذا المجلد.
؟ يقوم sbase mkdir DIR
بإنشاء مجلد يحتوي على ملفات التكوين ونماذج الاختبارات:
sbase mkdir ui_tests
سيحتوي هذا المجلد الجديد على هذه الملفات:
ui_tests/
├── __init__.py
├── my_first_test.py
├── parameterized_test.py
├── pytest.ini
├── requirements.txt
├── setup.cfg
├── test_demo_site.py
└── boilerplates/
├── __init__.py
├── base_test_case.py
├── boilerplate_test.py
├── classic_obj_test.py
├── page_objects.py
├── sb_fixture_test.py
└── samples/
├── __init__.py
├── google_objects.py
├── google_test.py
├── sb_swag_test.py
└── swag_labs_test.py
ProTip™: يمكنك أيضًا إنشاء مجلد معياري بدون أي نماذج اختبارات فيه عن طريق إضافة -b
أو --basic
إلى أمر sbase mkdir
:
sbase mkdir ui_tests --basic
سيحتوي هذا المجلد الجديد على هذه الملفات:
ui_tests/
├── __init__.py
├── pytest.ini
├── requirements.txt
└── setup.cfg
من بين هذه الملفات، يعد ملف التكوين pytest.ini
هو الأكثر أهمية، يليه ملف __init__.py
فارغ. يوجد أيضًا ملف setup.cfg
(لـ Pynose). وأخيرًا، يمكن استخدام ملف requirements.txt
لمساعدتك في تثبيت seleniumbase في بيئتك (إذا لم يكن مثبتًا بالفعل).
لنجرب مثالاً على اختبار فشل:
""" test_fail.py """
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class MyTestClass ( BaseCase ):
def test_find_army_of_robots_on_xkcd_desert_island ( self ):
self . open ( "https://xkcd.com/731/" )
self . assert_element ( "div#ARMY_OF_ROBOTS" , timeout = 1 ) # This should fail
يمكنك تشغيله من examples/
المجلد مثل هذا:
pytest test_fail.py
؟ ستلاحظ أنه تم إنشاء مجلد السجلات، "latest_logs"، للاحتفاظ بمعلومات حول الاختبار الفاشل ولقطات الشاشة. أثناء عمليات التشغيل الاختبارية، يتم نقل النتائج السابقة إلى المجلد archive_logs إذا قمت بتعيين ARCHIVE_EXISTING_LOGS على True في settings.py، أو إذا كانت اختبارات التشغيل الخاصة بك باستخدام --archive-logs
. إذا اخترت عدم أرشفة السجلات الموجودة، فسيتم حذفها واستبدالها بسجلات التشغيل التجريبي الأخير.
؟ يقوم خيار --dashboard
الخاص بـ pytest بإنشاء لوحة تحكم SeleniumBase الموجودة في dashboard.html
، والتي يتم تحديثها تلقائيًا أثناء تشغيل الاختبارات وإصدار النتائج. مثال:
pytest --dashboard --rs --headless
؟ بالإضافة إلى ذلك، يمكنك استضافة خادم SeleniumBase Dashboard الخاص بك على منفذ من اختيارك. فيما يلي مثال على ذلك باستخدام http.server
الخاص بـ Python:
python -m http.server 1948
؟ يمكنك الآن الانتقال إلى http://localhost:1948/dashboard.html
لعرض لوحة المعلومات كتطبيق ويب. يتطلب ذلك نافذتين طرفيتين مختلفتين: واحدة لتشغيل الخادم، والأخرى لتشغيل الاختبارات، والتي يجب تشغيلها من نفس الدليل. (استخدم Ctrl+C لإيقاف خادم http.)
؟ فيما يلي مثال كامل لما قد تبدو عليه لوحة معلومات SeleniumBase:
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
: ✅ يمنحك استخدام --html=report.html
تقريرًا رائعًا بالاسم المحدد بعد اكتمال مجموعة الاختبار الخاصة بك.
pytest test_suite.py --html=report.html
✅ عند دمج تقارير pytest html مع استخدام SeleniumBase Dashboard، ستتم إضافة المخطط الدائري من لوحة المعلومات إلى تقرير html. بالإضافة إلى ذلك، إذا قمت بتعيين عنوان URL لتقرير html ليكون هو نفسه عنوان URL للوحة المعلومات عند استخدام لوحة المعلومات أيضًا (على سبيل المثال: --dashboard --html=dashboard.html
)، فستصبح لوحة المعلومات تقرير html متقدم عند كل اكتملت الاختبارات.
✅ فيما يلي مثال لتقرير html تمت ترقيته:
pytest test_suite.py --dashboard --html=report.html
في حالة عرض تقارير pytest html في Jenkins، قد تحتاج إلى تكوين إعدادات Jenkins حتى يتم عرض html بشكل صحيح. هذا بسبب تغييرات Jenkins CSP.
يمكنك أيضًا استخدام --junit-xml=report.xml
للحصول على تقرير XML بدلاً من ذلك. يمكن لـ Jenkins استخدام هذا الملف لعرض تقارير أفضل عن اختباراتك.
pytest test_suite.py --junit-xml=report.xml
pynose
: يمنحك خيار --report
تقريرًا رائعًا بعد اكتمال مجموعة الاختبار الخاصة بك.
pynose test_suite.py --report
(ملاحظة: يمكنك إضافة --show-report
لعرض تقارير Pynose على الفور بعد اكتمال مجموعة الاختبار. استخدم فقط --show-report
عند تشغيل الاختبارات محليًا لأنه يوقف تشغيل الاختبار مؤقتًا.)
behave
والتقارير:(يمكن العثور على المجلد السلوكي/bdd في المجلد الأمثلة/.)
behave behave_bdd/features/ -D dashboard -D headless
يمكنك أيضًا استخدام --junit
للحصول على تقارير .xml
لكل ميزة behave
. يمكن لـ Jenkins استخدام هذه الملفات لعرض تقارير أفضل عن اختباراتك.
behave behave_bdd/features/ --junit -D rs -D headless
راجع: https://allurereport.org/docs/pytest/
لم يعد SeleniumBase يتضمن allure-pytest
كجزء من التبعيات المثبتة. إذا كنت تريد استخدامه، قم بتثبيته أولاً:
pip install allure-pytest
الآن يمكن لاختباراتك إنشاء ملفات نتائج Allure، والتي يمكن معالجتها بواسطة Allure Reports.
pytest test_suite.py --alluredir=allure_results
إذا كنت ترغب في استخدام خادم وكيل لاختبارات متصفحك (Chromium أو Firefox)، فيمكنك إضافة --proxy=IP_ADDRESS:PORT
كوسيطة في سطر الأوامر.
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
إذا كان الخادم الوكيل الذي ترغب في استخدامه يتطلب المصادقة، فيمكنك القيام بما يلي (Chromium فقط):
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
يدعم SeleniumBase أيضًا بروكسي SOCKS4 وSOCKS5:
pytest proxy_test.py --proxy= " socks4://IP_ADDRESS:PORT "
pytest proxy_test.py --proxy= " socks5://IP_ADDRESS:PORT "
لتسهيل الأمور، يمكنك إضافة الوكلاء الذين تستخدمهم بشكل متكرر إلى PROXY_LIST في proxy_list.py، ثم استخدام --proxy=KEY_FROM_PROXY_LIST
لاستخدام IP_ADDRESS:PORT لهذا المفتاح.
pytest proxy_test.py --proxy=proxy1
؟ إذا كنت ترغب في تغيير وكيل المستخدم لاختبارات المتصفح الخاص بك (Chromium وFirefox فقط)، فيمكنك إضافة --agent="USER AGENT STRING"
كوسيطة في سطر الأوامر.
pytest user_agent_test.py --agent= " Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU "
؟ ينتظر self.accept_alert()
تلقائيًا النوافذ المنبثقة للتنبيه ويقبلها. ينتظر self.dismiss_alert()
تلقائيًا النوافذ المنبثقة للتنبيه ويرفضها. في بعض الأحيان، قد تقوم بعض الأساليب مثل self.click(SELECTOR)
بتجاهل النافذة المنبثقة من تلقاء نفسها لأنها تستدعي JavaScript للتأكد من complete
readyState
للصفحة قبل التقدم. إذا كنت تحاول قبول نافذة منبثقة تم تجاهلها بهذه الطريقة، فاستخدم هذا الحل البديل: اتصل بـ self.find_element(SELECTOR).click()
بدلاً من ذلك، (مما سيسمح للإطار المنبثق بالبقاء على الشاشة)، ثم استخدم self.accept_alert()
لقبول النافذة المنبثقة (المزيد حول ذلك هنا). إذا كانت النوافذ المنبثقة متقطعة، فقم بلف التعليمات البرمجية في كتلة محاولة/باستثناء.
؟ تعرف على الإرشادات التفاعلية لـ SeleniumBase (في مجلد examples/tour_examples/
). إنه أمر رائع لإعداد نماذج أولية لتجربة الإعداد على موقع ويب.
--with-s3-logging
في سطر الأوامر عند تشغيل اختباراتك.فيما يلي مثال على إجراء الاختبارات مع تمكين بعض الميزات الإضافية:
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
؟ التنقل إلى صفحة ويب: (والأوامر ذات الصلة)
self . open ( "https://xkcd.com/378/" ) # This method opens the specified page.
self . go_back () # This method navigates the browser to the previous page.
self . go_forward () # This method navigates the browser forward in history.
self . refresh_page () # This method reloads the current page.
self . get_current_url () # This method returns the current page URL.
self . get_page_source () # This method returns the current page source.
ProTip™: يمكنك استخدام الأسلوب self.get_page_source()
مع أمر find()
الخاص بـ Python للتحليل عبر HTML للعثور على شيء محدد. (للحصول على تحليل أكثر تقدمًا، راجع مثال BeautifulSoup.)
source = self . get_page_source ()
head_open_tag = source . find ( '<head>' )
head_close_tag = source . find ( '</head>' , head_open_tag )
everything_inside_head = source [ head_open_tag + len ( '<head>' ): head_close_tag ]
؟ النقر:
للنقر على عنصر في الصفحة:
self . click ( "div#my_id" )
ProTip™: في معظم متصفحات الويب، يمكنك النقر بزر الماوس الأيمن على الصفحة وتحديد Inspect Element
لرؤية تفاصيل محدد CSS التي ستحتاج إليها لإنشاء البرامج النصية الخاصة بك.
؟ كتابة النص:
self.type(selector, text)
# يقوم بتحديث النص من العنصر المحدد بالقيمة المحددة. يظهر استثناء إذا كان العنصر مفقودًا أو إذا كان حقل النص غير قابل للتحرير. مثال:
self . type ( "input#id_value" , "2012" )
يمكنك أيضًا استخدام self.add_text()
أو الأمر WebDriver .send_keys()
، ولكن لن يؤدي ذلك إلى مسح مربع النص أولاً إذا كان هناك نص بداخله بالفعل.
؟ الحصول على النص من عنصر في الصفحة:
text = self . get_text ( "header h2" )
؟ الحصول على قيمة السمة من عنصر في الصفحة:
attribute = self . get_attribute ( "#comic img" , "title" )
؟ التأكد من وجود عنصر في الصفحة خلال عدد من الثواني:
self . wait_for_element_present ( "div.my_class" , timeout = 10 )
(ملاحظة: يمكنك أيضًا استخدام: self.assert_element_present(ELEMENT)
)
؟ التأكد من رؤية عنصر ما على الصفحة خلال عدد معين من الثواني:
self . wait_for_element_visible ( "a.my_class" , timeout = 5 )
(ملاحظة: الإصدارات القصيرة منها هي self.find_element(ELEMENT)
و self.assert_element(ELEMENT)
. يقوم إصدار find_element()
بإرجاع العنصر.)
بما أن السطر أعلاه يعرض العنصر، فيمكنك دمج ذلك مع .click()
كما هو موضح أدناه:
self . find_element ( "a.my_class" , timeout = 5 ). click ()
# But you're better off using the following statement, which does the same thing:
self . click ( "a.my_class" ) # DO IT THIS WAY!
ProTip™: يمكنك استخدام النقاط للإشارة إلى أسماء الفئات (على سبيل المثال: div.class_name
) كإصدار مبسط من div[class="class_name"]
داخل محدد CSS.
يمكنك أيضًا استخدام *=
للبحث عن أي قيمة جزئية في محدد CSS كما هو موضح أدناه:
self . click ( 'a[name*="partial_name"]' )
؟ التأكد من رؤية النص داخل عنصر على الصفحة خلال عدد من الثواني:
self . assert_text ( "Make it so!" , "div#trek div.picard div.quotes" )
self . assert_text ( "Tea. Earl Grey. Hot." , "div#trek div.picard div.quotes" , timeout = 3 )
(ملاحظة: self.find_text(TEXT, ELEMENT)
و self.wait_for_text(TEXT, ELEMENT)
يقومان بذلك أيضًا. من أجل التوافق مع الإصدارات السابقة، تم الاحتفاظ بأسماء الطرق الأقدم، ولكن قد تكون المهلة الافتراضية مختلفة.)
؟ التأكيد على أي شيء:
self . assert_true ( var1 == var2 )
self . assert_false ( var1 == var2 )
self . assert_equal ( var1 , var2 )
؟ عبارات شرطية مفيدة: (مع أمثلة إبداعية)
❓ is_element_visible(selector):
(مرئي على الصفحة)
if self . is_element_visible ( 'div#warning' ):
print ( "Red Alert: Something bad might be happening!" )
❓ is_element_present(selector):
(موجود في HTML)
if self . is_element_present ( 'div#top_secret img.tracking_cookie' ):
self . contact_cookie_monster () # Not a real SeleniumBase method
else :
current_url = self . get_current_url ()
self . contact_the_nsa ( url = current_url , message = "Dark Zone Found" ) # Not a real SeleniumBase method
def is_there_a_cloaked_klingon_ship_on_this_page ():
if self . is_element_present ( "div.ships div.klingon" ):
return not self . is_element_visible ( "div.ships div.klingon" )
return False
❓ is_text_visible(text, selector):
(النص مرئي على العنصر)
if self . is_text_visible ( "You Shall Not Pass!" , "h1" ):
self . open ( "https://www.youtube.com/watch?v=3xYXUeSmb-Y" )
is_text_visible():
def get_mirror_universe_captain_picard_superbowl_ad ( superbowl_year ):
selector = "div.superbowl_%s div.commercials div.transcript div.picard" % superbowl_year
if self . is_text_visible ( "Yes, it was I who summoned you all here." , selector ):
return "Picard Paramount+ Superbowl Ad 2020"
elif self . is_text_visible ( "Commander, signal the following: Our Network is Secure!" ):
return "Picard Mirror Universe iboss Superbowl Ad 2018"
elif self . is_text_visible ( "For the Love of Marketing and Earl Grey Tea!" , selector ):
return "Picard Mirror Universe HubSpot Superbowl Ad 2015"
elif self . is_text_visible ( "Delivery Drones... Engage" , selector ):
return "Picard Mirror Universe Amazon Superbowl Ad 2015"
elif self . is_text_visible ( "Bing it on Screen!" , selector ):
return "Picard Mirror Universe Microsoft Superbowl Ad 2015"
elif self . is_text_visible ( "OK Glass, Make it So!" , selector ):
return "Picard Mirror Universe Google Superbowl Ad 2015"
elif self . is_text_visible ( "Number One, I've Never Seen Anything Like It." , selector ):
return "Picard Mirror Universe Tesla Superbowl Ad 2015"
elif self . is_text_visible ( "Let us make sure history never forgets the name ... Facebook" , selector ):
return "Picard Mirror Universe Facebook Superbowl Ad 2015"
elif self . is_text_visible ( """With the first link, the chain is forged.
The first speech censored, the first thought forbidden,
the first freedom denied, chains us all irrevocably.""" , selector ):
return "Picard Mirror Universe Wikimedia Superbowl Ad 2015"
else :
raise Exception ( "Reports of my assimilation are greatly exaggerated." )
❓ is_link_text_visible(link_text):
if self . is_link_text_visible ( "Stop! Hammer time!" ):
self . click_link ( "Stop! Hammer time!" )
إذا فتح الاختبار علامة تبويب/نافذة جديدة، فيمكنك التبديل إليها. (يتحول SeleniumBase تلقائيًا إلى علامات تبويب جديدة لا تفتح على about:blank
.)
self . switch_to_window ( 1 ) # This switches to the new tab (0 is the first one)
؟ تتبع إطارات iframe نفس المبدأ الذي تتبعه النوافذ الجديدة: يجب عليك أولاً التبديل إلى iframe إذا كنت تريد تنفيذ الإجراءات هناك:
self . switch_to_frame ( "iframe" )
# ... Now perform actions inside the iframe
self . switch_to_parent_frame () # Exit the current iframe
للخروج من إطارات iframe متعددة، استخدم self.switch_to_default_content()
. (إذا كان داخل إطار iframe واحد، فسيكون لذلك نفس تأثير self.switch_to_parent_frame()
.)
self . switch_to_frame ( 'iframe[name="frame1"]' )
self . switch_to_frame ( 'iframe[name="frame2"]' )
# ... Now perform actions inside the inner iframe
self . switch_to_default_content () # Back to the main page
؟ يمكنك أيضًا استخدام مدير السياق للعمل داخل إطارات iframe:
with self . frame_switch ( "iframe" ):
# ... Now perform actions while inside the code block
# You have left the iframe
يعمل هذا أيضًا مع إطارات iframe المتداخلة:
with self . frame_switch ( 'iframe[name="frame1"]' ):
with self . frame_switch ( 'iframe[name="frame2"]' ):
# ... Now perform actions while inside the code block
# You are now back inside the first iframe
# You have left all the iframes
jQuery هي مكتبة JavaScript قوية تتيح لك تنفيذ إجراءات متقدمة في متصفح الويب. إذا كانت صفحة الويب التي تتصفحها قد تم تحميل jQuery بالفعل، فيمكنك البدء في تنفيذ البرامج النصية لـ jQuery على الفور. ستعرف هذا لأن صفحة الويب ستحتوي على شيء مثل ما يلي في HTML:
< script src =" https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js " > </ script >
؟ لا بأس إذا كنت تريد استخدام jQuery على صفحة لم يتم تحميلها بعد. للقيام بذلك، قم بتشغيل الأمر التالي أولاً:
self . activate_jquery ()
self . execute_script ( "jQuery, window.scrollTo(0, 600)" ) # Scrolling the page
self . execute_script ( "jQuery('#annoying-widget').hide()" ) # Hiding elements on a page
self . execute_script ( "jQuery('#hidden-widget').show(0)" ) # Showing hidden elements on a page
self . execute_script ( "jQuery('#annoying-button a').remove()" ) # Removing elements on a page
self . execute_script ( "jQuery('%s').mouseover()" % ( mouse_over_item )) # Mouse-over elements on a page
self . execute_script ( "jQuery('input#the_id').val('my_text')" ) # Fast text input on a page
self . execute_script ( "jQuery('div#dropdown a.link').click()" ) # Click elements on a page
self . execute_script ( "return jQuery('div#amazing')[0].text" ) # Returns the css "text" of the element given
self . execute_script ( "return jQuery('textarea')[2].value" ) # Returns the css "value" of the 3rd textarea element on the page
(يمكن تنفيذ معظم الأوامر المذكورة أعلاه مباشرة باستخدام أساليب SeleniumBase المضمنة.)
❗ لدى بعض مواقع الويب سياسة أمان محتوى مقيدة لمنع المستخدمين من تحميل jQuery والمكتبات الخارجية الأخرى على مواقع الويب الخاصة بهم. إذا كنت بحاجة إلى استخدام jQuery أو مكتبة JS أخرى على مواقع الويب هذه، فأضف --disable-csp
كخيار سطر أوامر pytest
لتحميل ملحق Chromium الذي يتجاوز CSP.
start_page = "https://xkcd.com/465/"
destination_page = "https://github.com/seleniumbase/SeleniumBase"
self . open ( start_page )
referral_link = '''<a class='analytics test' href='%s'>Free-Referral Button!</a>''' % destination_page
self . execute_script ( '''document.body.innerHTML = " %s " ''' % referral_link )
self . click ( "a.analytics" ) # Clicks the generated button
(نظرًا للطلب الشائع، تم تضمين مثال توليد حركة المرور هذا في SeleniumBase باستخدام الأساليب self.generate_referral(start_page, end_page)
و self.generate_traffic(start_page, end_page, loops)
.)
لنفترض أنك تريد التحقق من عدة عناصر مختلفة على صفحة ويب في اختبار واحد، ولكنك لا تريد أن يفشل الاختبار حتى تقوم بالتحقق من عدة عناصر في وقت واحد حتى لا تضطر إلى إعادة تشغيل الاختبار للعثور على المزيد من العناصر المفقودة العناصر في نفس الصفحة وهنا يأتي دور التأكيدات المؤجلة. وإليك مثال:
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class DeferredAssertTests ( BaseCase ):
def test_deferred_asserts ( self ):
self . open ( "https://xkcd.com/993/" )
self . wait_for_element ( "#comic" )
self . deferred_assert_element ( 'img[alt="Brand Identity"]' )
self . deferred_assert_element ( 'img[alt="Rocket Ship"]' ) # Will Fail
self . deferred_assert_element ( "#comicmap" )
self . deferred_assert_text ( "Fake Item" , "ul.comicNav" ) # Will Fail
self . deferred_assert_text ( "Random" , "ul.comicNav" )
self . deferred_assert_element ( 'a[name="Super Fake !!!"]' ) # Will Fail
self . deferred_assert_exact_text ( "Brand Identity" , "#ctitle" )
self . deferred_assert_exact_text ( "Fake Food" , "#comic" ) # Will Fail
self . process_deferred_asserts ()
سيعمل deferred_assert_element()
و deferred_assert_text()
على حفظ أي استثناءات قد تظهر. لحذف جميع التأكيدات المؤجلة الفاشلة في استثناء واحد، تأكد من استدعاء self.process_deferred_asserts()
في نهاية طريقة الاختبار الخاصة بك. إذا وصل الاختبار إلى عدة صفحات، فيمكنك الاتصال بـ self.process_deferred_asserts()
قبل الانتقال إلى صفحة جديدة بحيث تتطابق لقطة الشاشة من ملفات السجل مع عنوان URL الذي تم إجراء التأكيدات المؤجلة عليه.
إذا كنت بحاجة إلى الوصول إلى أي أوامر تأتي مع WebDriver القياسي، فيمكنك الاتصال بها مباشرةً على النحو التالي:
self . driver . delete_all_cookies ()
capabilities = self . driver . capabilities
self . driver . find_elements ( "partial link text" , "GitHub" )
(بشكل عام، ستحتاج إلى استخدام إصدارات SeleniumBase من الأساليب عندما تكون متاحة.)
يمكنك استخدام pytest --reruns=NUM
لإعادة محاولة الاختبارات الفاشلة عدة مرات. أضف --reruns-delay=SECONDS
للانتظار عدة ثوانٍ بين عمليات إعادة المحاولة. مثال:
pytest --reruns=1 --reruns-delay=1
يمكنك استخدام المزخرف @retry_on_exception()
لإعادة محاولة الطرق الفاشلة. (الاستيراد الأول: from seleniumbase import decorators
). لمعرفة المزيد عن ديكورات SeleniumBase، انقر هنا.
"اكتشف الأخطاء في ضمان الجودة قبل نشر التعليمات البرمجية للإنتاج!"