Selene هي مكتبة موجزة وقوية لكتابة اختبارات واجهة المستخدم في المتصفح في بيثون. تم بناؤه كميناء بيثوني لمشروع سيلينيد الشهير من عالم جافا. تساعد Selene المطورين على كتابة اختبارات قابلة للقراءة ويمكن صيانتها "التحدث" باللغة الإنجليزية المشتركة ، مما يجعلهم أسهل في الفهم والمشاركة عبر الفرق.
القوة الأساسية لـ Selene هي واجهة برمجة تطبيقاتها الموجهة للمستخدم ، والتي تملأ تعقيد العمل مع Selenium WebDriver. يمكن كتابة الاختبارات باستخدام بناء الجملة البسيط والتعبيري وميزات الدعم مثل العناصر التي تم تقييمها الكسول ، وآليات إعادة المحاولة التلقائية للانتظار الضمني الأكثر ذكاءً للتحميل الذي يشبه AJAX. مع دعم PageObject المدمج ، فإنه يتيح إعادة استخدام عناصر الويب من خلال الحاجيات.
By.*ActionChains .يدعم Selene حاليًا نسختين رئيسيتين:
أحدث إصدار موصى به قبل الإصدار (v2.0.0rc9) :
3.8+>=4.12.0نسخة مستقرة (v1.0.2) :
2.7, 3.5, 3.6, 3.7<4.0.0للهجرة من v1.x إلى v2.x ، اتبع دليل الترحيل.
من 1.0.2 إلى 2.0.0rc<LATEST> :
2.0.0rc<LATEST>collection.first() من .first() إلى .firsttext('foo') استخدم be.* أو have.* بناء الجملةأمثلة على إعادة البناء المحتملة أثناء الهجرة:
(text('foo')) إلى (have.text('foo'))(visible) إلى (be.visible).should(x, timeout=y) إلى .with_(timeout=y).should(x).should_not(be.*) .should(be.not_.*) .should(be.*.not_) ..should_not(have.*) .should(have.*.not_) .should(have.no.*).should_each(condition) .should(condition.each)from selene import be, have Python 3.8+ مطلوب.
يتم تثبيت Pyenv ، وتثبيت الإصدار المطلوب من Python بسيط:
$ pyenv install 3.8.13
$ pyenv global 3.8.13
$ python -V
Python 3.8.13تأكد من تثبيت الشعر و pyenv ، ثم:
poetry new my-tests-with-selene
cd my-tests-with-selene
pyenv local 3.8.13
poetry add selene --allow-prereleases # for pre-release version
poetry installلإصدار ما قبل الإصدار (الموصى به للمشاريع الجديدة):
pip install selene --preللحصول على أحدث إصدار مستقر:
pip install seleneإذا كنت تفضل تثبيت Selene مباشرة من رمز المصدر:
git clone https://github.com/yashaka/selene.git
cd selene
python setup.py installأو باستخدام الشعر:
poetry add git+https://github.com/yashaka/selene.gitأو باستخدام PIP:
pip install git+https://github.com/yashaka/selene.gitأتمتة بحث Google بسيط باستخدام Selene:
from selene import browser , be , have
browser . open ( 'https://google.com/ncr' )
browser . element ( '[name=q]' ). should ( be . blank )
. type ( 'selenium' ). press_enter ()
browser . all ( '#rso>div' ). should ( have . size_greater_than ( 5 ))
. first . should ( have . text ( 'Selenium automates browsers' ))
# not mandatory, because will be closed automatically:
# browser.quit() يوفر Selene واجهة برمجة تطبيقات بديهية للتفاعل مع عناصر الويب باستخدام وحدات مثل be أو have by .
عناصر كسول وديناميكية: عناصر سيلين كسول وديناميكي ، مما يعني أنها موجودة في كل مرة يتم فيها إجراء إجراء. هذا يضمن التفاعل مع العنصر الأكثر حداثة.
هنا تفاعل العنصر الأساسي:
from selene import browser , by , be
# because elements are "lazy",
# you can store them in variable:
search_box = browser . element ( by . name ( 'q' ))
# – even before the actual page will be loaded:
browser . open ( 'https://google.com/ncr' )
search_box . should ( be . blank ). type ( 'Selenium' ). press_enter ()يعد اختيار محددات العناصر الصحيحة أمرًا بالغ الأهمية للاختبارات الموثوقة. فيما يلي بعض النصائح:
افحص العنصر: انقر بزر الماوس الأيمن على عنصر الويب وحدد فحصًا لعرض HTML في أدوات مطور المستعرض.
استخدم سمات فريدة: ابحث عن سمات فريدة مثل المعرف أو الاسم أو السمات المخصصة لاستخدامها في محدداتك. تتمثل أفضل الممارسات في التفاوض مع المطورين حول استخدام سمات data-* خصيصًا لتلبية احتياجات الاختبار ، مثل data-test-id .
بناء CSS أو محددات XPath: بناء محددات تحدد العناصر بشكل فريد. على سبيل المثال ، باستخدام css css-selectors #elementId ، .className ، أو [name="q"] ، أو استخدام xPath للأشياء التي لا يمكن لـ CSS التعامل معها: //*[text()="Submit"]/.. ستكتشف Selene تلقائيًا ما إذا كنت تقدم محدد CSS أو XPath.
استخدم مساعدي Selene Selector (اختياري): إذا كنت بحاجة إلى معظم التعليمات البرمجية القابلة للقراءة البشرية ، فيمكنك استخدامها by.name('q') و by.text('Submit') وغيرها by.* المساعدين. لاحظ أن شخصًا ما يفضل محدد CSS الخام مثل [name=q] فوق by.name('q') لغرض مبدأ القبلة.
قم بتحويل المحددات الطويلة إلى أجزاء أصغر لتحسين قابلية القراءة وقابلية الصيانة: إذا كنت تجد عنصرًا محددًا معقدًا مثل في: browser.element('//*[@role="row" and contains(.,"Jon")]//*[@data-field="select-row"]') browser.all('[role=row]').element_by(have.text('Jon')).element('[data-field=select-row]') مع الحاجة التالية إلى التحقق من كل سبب محتمل للفشل.
قم بإنشاء استراتيجية محدد مخصصة (اختياري): تخيل أن مطوري الواجهة الأمامية يتبعون أفضل الممارسات واستخدام سمات data-test-id لجميع العناصر التي تحتاج إلى تغطية الاختبارات ، وهناك اتفاقية تسمية متابعة لهذا العنصر ليكون Snake_Case_or-kebab-case. مع خيار Selene's browser.config.selector_to_by_strategy يمكنك تحديد استراتيجية محدد مخصصة للكشف تلقائيًا من جميع "snake_kebab-words" التي تم تمريرها كمحددات وتحويلها إلى [data-test-id="snake_kebab-words"] . بعد ذلك مثال مثل browser.all('[data-testid=result]').first.element('[data-testid=result-title-a]').click() browser.all('result').first.element('result-title-a').click() تعرف على كيفية تبسيط البحث حسب معرفات الاختبار؟ دليل لمزيد من التفاصيل.
❗ ستكون هذه الميزة متوفرة في الإصدار التالي من Selene.️
يمكن لـ Selene إدارة برنامج تشغيل المتصفح تلقائيًا ، ولكن يمكنك تخصيصه إذا لزم الأمر.
from selene import browser
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
# Selene will automatically detect the browser type (Chrome, Firefox, etc.)
# based on the options passed
browser . config . driver_options = options
browser . config . driver_remote_url = 'http://localhost:4444/wd/hub'
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
browser . config . driver = webdriver . Remote (
command_executor = 'http://localhost:4444/wd/hub' ,
options = options
)
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' )استخدم المحددات القابلة للقراءة والمستقرة: الهدف من المحددات الفريدة والتعبيرية والاقتران مع بنية DOM لجعل اختباراتك أكثر قابلية للصيانة.
تغليف المكونات القابلة لإعادة الاستخدام: استخدم نموذج كائن الصفحة لتغليف العناصر والإجراءات ، وتعزيز إعادة استخدام التعليمات البرمجية.
الاستفادة من الانتظار المدمج: ينتظر Selene تلقائيًا عن العناصر في الحالة المطلوبة ، مما يقلل من الحاجة إلى انتظار صريح.
استكشاف واجهة برمجة التطبيقات: الغوص في رمز المصدر الخاص بـ Selene أو وثائقه لفهم الأساليب والتكوينات المتاحة بشكل أفضل.
نرحب بالمساهمات في سيلين! إليك كيف يمكنك المشاركة:
لمزيد من التفاصيل ، راجع دليل المساهمة لدينا.
راجع changelog لمزيد من التفاصيل حول التحديثات الحديثة.