السيلينيوم هو مشروع شامل يضم مجموعة متنوعة من الأدوات والمكتبات التي تتيح التشغيل الآلي لمتصفح الويب. يوفر السيلينيوم على وجه التحديد بنية تحتية لمواصفات W3C WebDriver - منصة وواجهة ترميز محايدة للغة متوافقة مع جميع متصفحات الويب الرئيسية.
أصبح هذا المشروع ممكنًا بفضل المساهمين المتطوعين الذين تبرعوا بسخاء بآلاف الساعات في تطوير التعليمات البرمجية وصيانتها.
الكود المصدري للسيلينيوم متاح بموجب ترخيص Apache 2.0.
هذا الملف التمهيدي مخصص للمطورين المهتمين بالمساهمة في المشروع. بالنسبة للأشخاص الذين يتطلعون إلى البدء في استخدام السيلينيوم، يرجى مراجعة دليل المستخدم الخاص بنا للحصول على أمثلة وأوصاف تفصيلية، وإذا واجهتك مشكلة، فهناك عدة طرق للحصول على المساعدة.
يرجى قراءة CONTRIBUTING.md قبل تقديم طلبات السحب الخاصة بك.
هذه هي المتطلبات اللازمة لإنشاء بيئة التطوير المحلية الخاصة بك للمساهمة في السيلينيوم.
Bazelisk، عبارة عن برنامج تغليف Bazel يقوم تلقائيًا بتنزيل إصدار Bazel المحدد في ملف .bazelversion
ويمرر بشفافية عبر كافة وسيطات سطر الأوامر إلى ثنائي Bazel الحقيقي.
Java JDK الإصدار 17 أو أحدث (على سبيل المثال، Java 17 Temurin)
قم بتعيين متغير البيئة JAVA_HOME
إلى موقع Java القابل للتنفيذ (JDK وليس JRE)
لاختبار ذلك، حاول تشغيل الأمر javac
. لن يكون هذا الأمر موجودًا إذا كان JRE مثبتًا لديك فقط. إذا وجدت قائمة من خيارات سطر الأوامر، فأنت تشير إلى JDK بشكل صحيح.
Xcode بما في ذلك أدوات سطر الأوامر. قم بتثبيت أحدث إصدار باستخدام: xcode-select --install
Rosetta لأجهزة Mac من Apple Silicon. قم بإضافة build --host_platform=//:rosetta
إلى ملف .bazelrc.local
. نحن نعمل للتأكد من أن هذا ليس مطلوبًا على المدى الطويل.
قبل عدة سنوات، نشر جيم إيفانز مقالة رائعة حول إعداد بيئة تطوير Windows لربط لغة السيلينيوم .NET؛ هذه المقالة قديمة، ولكنها تتضمن أوصافًا أكثر تفصيلاً ولقطات شاشة قد يجدها بعض الأشخاص مفيدة.
سيضمن هذا البرنامج النصي جاهزية كاملة للتنفيذ في بيئة المطور. (لم يتم تثبيت أي شيء أو تعيينه موجود بالفعل ما لم يُطلب خلاف ذلك)
افتح Powershell كمسؤول
تنفيذ: Set-ExecutionPolicy Bypass -Scope Process -Force
للسماح بتشغيل البرنامج النصي في العملية
انتقل إلى الدليل الذي تريد استنساخ السيلينيوم فيه، أو الدليل الأصلي لمستودع السيلينيوم المستنسخ بالفعل
قم بتنزيل وتنفيذ هذا البرنامج النصي في محطة بوويرشيل: [scripts/dev-environment-setup.ps1]`
السماح بتشغيل البرامج النصية في السيلينيوم بشكل عام:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
تمكين وضع المطور:
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
قم بتثبيت MSYS2، وهي بيئة Shell بديلة توفر أوامر تشبه Unix
أضف دليل bin إلى متغير بيئة PATH
(على سبيل المثال، "C:toolsmsys64usrbin"
)
أضف موقع bash.exe
كمتغير بيئة BAZEL_SH
(على سبيل المثال، "C:toolsmsys64usrbinbash.exe"
)
قم بتثبيت أحدث إصدار من مجتمع Visual Studio
استخدم مثبت الاستوديو المرئي لتعديل عبء عمل "تطوير سطح المكتب باستخدام C++" وإضافته
أضف موقع دليل تثبيت أدوات إنشاء Visual C++ إلى متغير بيئة BAZEL_VC
(على سبيل المثال "C:Program FilesMicrosoft Visual Studio2022CommunityVC"
)
أضف إصدار أدوات Visual C++ Build إلى متغير البيئة BAZEL_VC_FULL_VERSION
(يمكن اكتشاف ذلك من اسم الدليل في "$BAZEL_VCToolsMSVC
)
إضافة دعم لأسماء الملفات الطويلة (يحتوي bazel على الكثير من الدلائل المتداخلة التي يمكن أن تتجاوز الحدود الافتراضية في Windows)
reg إضافة "HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1" reg إضافة "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem" /t REG_DWORD /f /v "LongPathsEnabled" /d "1"
قم بإنشاء ملف selenium/.bazelrc.windows.local
أضف "بدء التشغيل --output_user_root=C:/tmp" إلى الملف
السماح لـ Bazel بإنشاء إصدارات ذات أسماء قصيرة لمسارات الملفات الطويلة: fsutil 8dot3name set 0
قم بتعيين إخراج bazel على C:/tmp
بدلاً من تضمينه داخل دليل المشروع:
قم بتمكين دعم المسارات الطويلة باستخدام أمري التسجيل هذين:
إذا كنت ترغب في المساهمة في المشروع، ولكنك لا ترغب في إعداد بيئة التطوير المحلية الخاصة بك، فهناك بديلان متاحان.
بدلاً من إنشاء بيئة التطوير المحلية الخاصة بك، يوفر لك GitPod بيئة جاهزة للاستخدام.
كبديل، يمكنك إنشاء Dev Container - في الأساس حاوية إرساء - مناسبة لبناء السيلينيوم واختباره باستخدام devcontainer.json في دليل .devcontainer. يجب أن يوجهك دعم IDEs مثل VS Code أو IntelliJ IDEA إلى كيفية إنشاء مثل هذه الحاوية.
يمكنك أيضًا إنشاء صورة Docker مناسبة لبناء السيلينيوم واختباره باستخدام ملف Dockerfile الموجود في دليل صور dev.
تم إنشاء السيلينيوم باستخدام أداة بناء شائعة تسمى Bazel، للسماح لنا بإدارة تنزيلات التبعية بسهولة، وإنشاء الثنائيات المطلوبة، وبناء الحزم وإصدارها، وتنفيذ الاختبارات؛ كل ذلك بطريقة سريعة وفعالة. للحصول على مناقشة أكثر تفصيلاً، اقرأ مقال سيمون ستيوارت حول بناء السيلينيوم
غالبًا ما نقوم بتغليف أوامر Bazel باستخدام غلاف Rake المخصص لدينا. يتم تشغيلها باستخدام الأمر ./go
.
أوامر Bazel الشائعة هي:
bazel build
— يقوم بتقييم التبعيات، وتجميع الملفات المصدرية، وإنشاء ملفات الإخراج للهدف المحدد. يتم استخدامه لإنشاء ثنائيات أو مكتبات أو عناصر أخرى قابلة للتنفيذ.
bazel run
— يبني الهدف ثم ينفذه. يتم استخدامه عادةً للأهداف التي تنتج ثنائيات قابلة للتنفيذ.
bazel test
— يقوم ببناء الهدف وتشغيله في سياق مزود بوظيفة اختبار إضافية
bazel query
— يحدد الأهداف المتاحة للمسار المقدم.
يتم تعريف كل وحدة يمكن بناؤها في ملف BUILD.bazel
. لتنفيذ الوحدة، عليك الرجوع إليها بدءًا من //
، ثم تضمين المسار النسبي للملف الذي يحددها، ثم :
، ثم اسم الهدف. على سبيل المثال، يُسمى الهدف لبناء الشبكة باسم executable-grid
ويتم تعريفه في ملف 'selenium/java/src/org/openqa/selenium/grid/BAZEL.build'
. لذا، لبناء الشبكة، عليك تشغيل: bazel build //java/src/org/openqa/selenium/grid:executable-grid
.
تحتوي وثائق Bazel على دليل مفيد لمختلف الاختصارات وجميع الطرق لبناء أهداف متعددة، والتي يستخدمها السيلينيوم بشكل متكرر.
لبناء كل شيء للغة معينة:
بناء بازل ///...
لإنشاء الشبكة فقط، هناك اسم مستعار لاستخدامه (سيُظهر السجل مكان وجود جرة الإخراج):
شبكة بناء بازل
لجعل الأمور أكثر بساطة، يمكنك إنشاء كل الروابط باستخدام أمر ./go
هذا
./اذهب <اللغة>:بناء
يستخدم معظم أعضاء الفريق Intellij في عمليات التحرير اليومية. إذا كنت تعمل في IntelliJ، فإننا نوصي بشدة بتثبيت البرنامج الإضافي Bazel IJ الموثق على موقعه الخاص.
لاستخدام السيلينيوم مع البرنامج المساعد IntelliJ Bazel، قم باستيراد المستودع كمشروع Bazel، وحدد ملف عرض المشروع من دليل البرامج النصية. ij.bazelproject
لنظام التشغيل Mac/Linux و ij-win.bazelproject
لنظام التشغيل Windows.
نستخدم أيضًا تنسيق Google Java لإجراء الفحص، لذا فإن استخدام Google Java Formatter Plugin مفيد؛ هناك بعض الخطوات لتشغيله، لذا اقرأ وثائق التكوين الخاصة به. يوجد أيضًا برنامج نصي للتنسيق التلقائي يمكن تشغيله: ./scripts/format.sh
على الرغم من أن السيلينيوم لم يتم إنشاؤه باستخدام Maven، يمكنك إنشاء وتثبيت أجزاء السيلينيوم ليستخدمها Maven محليًا عن طريق النشر في مستودع maven المحلي الخاص بك ( ~/.m2/repository
)، باستخدام:
./اذهب جافا:تثبيت
يتم تعريف التبعيات في الملف maven_deps.bzl. لتحديث التبعيات الجديدة وتثبيتها تلقائيًا، قم بتشغيل:
./اذهب جافا:تحديث
يمكنك تشغيل كود Python محليًا عن طريق تحديث الملفات التي تم إنشاؤها في دليل python باستخدام:
./اذهب py:update
لتثبيت السيلينيوم محليًا بناءً على التزام محدد، يمكنك استخدام:
./go py:install
بدلاً من استخدام irb
، يمكنك إنشاء REPL تفاعلي مع تحميل جميع الجواهر باستخدام: bazel run //rb:console
إذا كنت تريد تصحيح التعليمات البرمجية، فيمكنك القيام بذلك عبر debug
Gem:
أضف binding.break
إلى التعليمات البرمجية التي تريد أن يبدأ مصحح الأخطاء فيها.
قم بإجراء الاختبارات باستخدام تكوين ruby_debug
: bazel test --config ruby_debug
.
عند بدء تشغيل مصحح الأخطاء، قم بتشغيل ما يلي في محطة منفصلة للاتصال بمصحح الأخطاء:
بازل-سيلينيوم/خارجي/حزمة/bin/rdbg -A
إذا كنت تريد استخدام RubyMine للتطوير، فيمكنك تكوينه باستخدام عناصر Bazel:
افتح rb/
كدليل المشروع الرئيسي.
قم بتشغيل bundle exec rake update
عند الضرورة لإنشاء عناصر محدثة. إذا لم ينجح ذلك، قم بتشغيل ./go rb:update
من دليل selenium
(الأصل).
في الإعدادات / اللغات والأطر / يضيف Ruby SDK وGems مترجمًا جديدًا يشير إلى ../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
.
يجب أن تكون الآن قادرًا على تشغيل وتصحيح أي مواصفات. يستخدم Chrome بشكل افتراضي، ولكن يمكنك تغييره باستخدام متغيرات البيئة المحددة في قسم اختبار روبي أدناه.
للحفاظ على مزامنة Carbo.Bazel.lock
مع Cargo.lock
، قم بتشغيل:
CARGO_BAZEL_REPIN=مزامنة بازل الحقيقية --فقط=الصناديق
هناك عدد من تكوينات bazel المخصصة للاختبار.
فيما يلي أمثلة على الوسائط التي نستخدمها في اختبار كود السيلينيوم:
--pin_browsers
- تشغيل إصدارات متصفح محددة محددة في الإصدار (يتم تحديث الإصدارات بانتظام)
--headless
- تشغيل المتصفحات في وضع بدون رأس (يدعم Chrome وEdge وFirefox)
--flaky_test_attempts 3
- إعادة تشغيل الاختبارات الفاشلة حتى 3 مرات
--local_test_jobs 1
- التحكم في توازي الاختبارات
--cache_test_results=no
, -t-
- تعطيل التخزين المؤقت لنتائج الاختبار وإعادة تشغيلها جميعًا
--test_output all
- طباعة كافة المخرجات من الاختبارات، وليس الأخطاء فقط
--test_output streamed
- قم بتشغيل جميع الاختبارات واحدًا تلو الآخر وطباعة مخرجاتها على الفور
--test_env FOO=bar
- قم بتمرير متغير بيئة إضافي لاختبار العملية
--run_under="xvfb-run -a"
- البادئة التي سيتم إدراجها قبل التنفيذ
يمكن تصفية اختبارات السيلينيوم حسب الحجم:
صغيرة - عادةً ما تكون اختبارات الوحدة في حالة عدم فتح أي متصفح
كبيرة - عادةً ما تقوم باختبارات تقود المتصفح فعليًا
متوسطة - اختبارات أكثر تعقيدًا من اختبارات الوحدات البسيطة، ولكنها لا تقود المتصفح بشكل كامل
يمكن تصفيتها باستخدام وسيطة test_size_filters
مثل هذا:
اختبار بازل ///... --test_size_filters=small
يمكن أيضًا تصفية الاختبارات حسب العلامة مثل:
اختبار بازل ///... --test_tag_filters=this,-not-this
لتشغيل اختبارات الوحدة:
اختبار بازل //java/... --test_size_filters=small
لتشغيل اختبارات التكامل:
اختبار بازل //java/... --test_size_filters=medium
لتشغيل اختبارات المتصفح:
اختبار بازل //Java/... --test_size_filters=large --test_tag_filters=
لإجراء اختبار محدد:
اختبار بازل //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
لتشغيل الاختبارات قم بما يلي:
اختبار بازل //javascript/node/selenium-webdriver:tests
يمكنك استخدام --test_env
لتمرير اسم المتصفح كـ SELENIUM_BROWSER
.
اختبار بازل //javascript/node/selenium-webdriver:tests --test_env=SELENIUM_BROWSER=firefox
تشغيل اختبارات الوحدة مع:
اختبار بازل //py:unit
لإجراء الاختبارات باستخدام متصفح محدد:
اختبار بازل //py:test-
لتشغيل كافة اختبارات بايثون:
اختبار بازل //py:all
أهداف الاختبار:
يأمر | وصف |
---|---|
bazel test //rb/... | تشغيل الوحدة وجميع اختبارات التكامل والوبر |
bazel test //rb:lint | قم بتشغيل RuboCop linter |
bazel test //rb/spec/... | تشغيل اختبارات الوحدة والتكامل لجميع المتصفحات |
bazel test //rb/spec/... --test_size_filters small | تشغيل اختبارات الوحدة |
bazel test //rb/spec/unit/... | تشغيل اختبارات الوحدة |
bazel test //rb/spec/... --test_size_filters large | قم بإجراء اختبارات التكامل لجميع المتصفحات |
bazel test //rb/spec/integration/... | قم بإجراء اختبارات التكامل لجميع المتصفحات |
bazel test //rb/spec/integration/... --test_tag_filters firefox | قم بإجراء اختبارات التكامل لمتصفح Firefox المحلي فقط |
bazel test //rb/spec/integration/... --test_tag_filters firefox-remote | قم بإجراء اختبارات التكامل لمتصفح Firefox البعيد فقط |
bazel test //rb/spec/integration/... --test_tag_filters firefox,firefox-remote | قم بإجراء اختبارات التكامل لمتصفح Firefox المحلي والبعيد |
تحمل أهداف اختبار روبي نفس اسم ملف المواصفات مع إزالة _spec.rb
، لذا يمكنك تشغيلها بشكل فردي. تحتوي أهداف اختبارات التكامل أيضًا على متصفح ولاحقة عن بعد للتحكم في المتصفح الذي سيتم اختياره وما إذا كان سيتم استخدام الشبكة أم لا.
ملف الاختبار | هدف الاختبار |
---|---|
rb/spec/unit/selenium/webdriver/proxy_spec.rb | //rb/spec/unit/selenium/webdriver:proxy |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-chrome |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-chrome-remote |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-firefox |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-firefox-remote |
المتصفحات المدعومة:
chrome
edge
firefox
firefox-beta
ie
safari
safari-preview
بالإضافة إلى أمثلة الخيارات الشائعة، إليك بعض الأمثلة الإضافية المحددة لروبي:
--test_arg "-eTimeouts"
- اختبر فقط المواصفات التي يتضمن اسمها "Timeouts"
--test_arg "
- تمرير أي وسيطات RSpec إضافية (راجع bazel run @bundle//bin:rspec -- --help
)
متغيرات البيئة المدعومة للاستخدام مع --test_env
:
WD_SPEC_DRIVER
- برنامج التشغيل المطلوب اختباره؛ إما اسم المتصفح أو "جهاز التحكم عن بعد" (يتم تعيينه بواسطة Bazel)
WD_REMOTE_BROWSER
- عندما يكون WD_SPEC_DRIVER
remote
؛ اسم المتصفح المراد اختباره (يتم تعيينه بواسطة Bazel)
WD_REMOTE_URL
- عنوان URL للخادم قيد التشغيل بالفعل لاستخدامه في الاختبارات عن بعد
DOWNLOAD_SERVER
- عندما لا يتم تعيين WD_REMOTE_URL
؛ ما إذا كان سيتم تنزيل واستخدام أحدث إصدار من الخادم للاختبارات عن بعد
DEBUG
- يقوم بتشغيل التصحيح المطول
HEADLESS
- للكروم والحافة وفايرفوكس؛ يجري الاختبارات في وضع مقطوعة الرأس
DISABLE_BUILD_CHECK
- للكروم والحافة؛ ما إذا كان سيتم تجاهل عدم تطابق إصدار برنامج التشغيل والمتصفح (يسمح باختبار إصدارات Canary)
CHROME_BINARY
- المسار لاختبار متصفح Chrome محدد
CHROMEDRIVER_BINARY
- المسار لاختبار ChromeDriver محدد
EDGE_BINARY
- مسار لاختبار متصفح Edge محدد
MSEDGEDRIVER_BINARY
- المسار لاختبار msedgedriver المحدد
FIREFOX_BINARY
- مسار لاختبار متصفح Firefox محدد
GECKODRIVER_BINARY
- مسار لاختبار GeckoDriver محدد
للتشغيل باستخدام إصدار معين من Ruby، يمكنك تغيير الإصدار في rb/.ruby-version
أو من سطر الأوامر:
echo '' > rb/.Ruby-version
تعمل اختبارات .NET حاليًا فقط مع المتصفحات المثبتة، لذا تأكد من تضمين ذلك.
قم بإجراء جميع الاختبارات باستخدام:
اختبار بازل //dotnet/test/common:AllTests --pin_browsers=true
يمكنك إجراء اختبارات محددة عن طريق تحديد اسم الفئة:
اختبار بازل //dotnet/test/common:ElementFindingTest --pin_browsers=true
إذا كانت الوحدة تدعم متصفحات متعددة:
اختبار بازل //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
يتم إجراء اختبارات الصدأ باستخدام:
اختبار بازل // الصدأ/...
افتراضيًا، يقوم Bazel بإجراء هذه الاختبارات في واجهة مستخدم X-server الحالية لديك. إذا كنت تفضل ذلك، يمكنك بدلاً من ذلك تشغيلها في خادم X افتراضي أو متداخل.
قم بتشغيل خادم X Xvfb :99
أو Xnest :99
قم بتشغيل مدير النوافذ، على سبيل المثال، DISPLAY=:99 jwm
قم بإجراء الاختبارات التي تهمك:
اختبار بازل --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
إحدى الطرق السهلة لإجراء الاختبارات في خادم X افتراضي هي استخدام وظيفة Bazel --run_under
:
bazel test --run_under="xvfb-run -a" //java/...
يمكن العثور على وثائق واجهة برمجة التطبيقات هنا:
ج #
جافا سكريبت
جافا
بايثون
روبي
لتحديث وثائق واجهة برمجة التطبيقات (API) للغة معينة: ./go
لتحديث جميع الوثائق: ./go all:docs
لاحظ أن إنشاء JavaScript معطل حاليًا.
يمكن العثور على العملية الكاملة للقيام بالإصدار في الويكي
الإصدار عبارة عن مزيج من البناء والنشر، والذي غالبًا ما يتطلب تنسيق عمليات تنفيذ متعددة ومعالجة إضافية. كما تمت مناقشته في قسم البناء، فإننا نستخدم مهام Rake مع الأمر ./go
لهذه الأشياء. تتضمن أوامر ./go
هذه وسيطة --stamp
لتوفير المعلومات الضرورية حول الأصل المُنشأ.
يمكنك إنشاء كل شيء وإصداره باستخدام:
./اذهب للكل:release
لبناء وإصدار لغة معينة:
./اذهب <اللغة>:الإصدار
إذا كان لديك حق الوصول إلى مستودع Selenium EngFlow، فيمكنك إنشاء الأصول عن بعد وتنزيلها محليًا باستخدام:
./go all:release['--config', 'release']