أصبح هذا المشروع ممكنًا بفضل المساهمين المتطوعين الذين خصصوا آلاف الساعات من وقتهم الخاص، وجعلوا كود المصدر متاحًا مجانًا بموجب ترخيص Apache 2.0.
تأتي صور Docker هذه مع مجموعة من العلامات لتبسيط استخدامها، يمكنك إلقاء نظرة عليها في أحد إصداراتنا.
للحصول على إشعارات بالإصدارات الجديدة، قم بإضافة نفسك كمراقب "الإصدارات فقط".
يتم نشر هذه الصور في سجل Docker Hub في Selenium Docker Hub.
هل تحتاج إلى مساعدة لاستخدام صور Docker هذه؟ تحدث إلينا على https://www.selenium.dev/support/
--shm-size="2g"
docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
قم بتوجيه اختبارات WebDriver إلى http://localhost:4444
هذا كل شيء!
(اختياري) لمعرفة ما يحدث داخل الحاوية، توجه إلى http://localhost:7900/?autoconnect=1&resize=scale&password=secret.
لمزيد من التفاصيل حول تصور نشاط الحاوية، راجع قسم تصحيح الأخطاء.
☝️ عند تنفيذ docker run
لصورة تحتوي على متصفح، يرجى استخدام العلامة --shm-size=2g
لاستخدام الذاكرة المشتركة للمضيف.
☝️ استخدم دائمًا صورة Docker مع علامة كاملة لتثبيت متصفح معين وإصدار الشبكة. راجع اصطلاحات وضع العلامات للحصول على التفاصيل.
بدءًا من علامة الصورة المستندة إلى الإصدار 4.21.0
وما بعده، فإن البنيات التي يدعمها هذا المشروع هي كما يلي:
بنيان | متاح |
---|---|
x86_64 (المعروف أيضًا باسم AMD64) | ✅ |
aarch64 (ويعرف أيضًا باسم Arm64/armv8) | ✅ |
أرمهف (ويعرف أيضا باسم Arm32/armv7l) | ❌ |
المتصفحات التالية متوفرة في صور متعددة الأقواس:
بنيان | الكروم | الكروم | فايرفوكس | حافة |
---|---|---|---|---|
x86_64 (المعروف أيضًا باسم AMD64) | ✅ | ✅ | ✅ | ✅ |
aarch64 (ويعرف أيضًا باسم Arm64/armv8) | ❌ | ✅ | ✅ | ❌ |
أرمهف (ويعرف أيضا باسم Arm32/armv7l) | ❌ | ❌ | ❌ | ❌ |
ملحوظة:
لا تقوم Google بإنشاء Chrome ( google-chrome
) لمنصات Linux/ARM. ومن ثم، فإن صور Chrome (العقدة والمستقلة) متاحة فقط لـ AMD64. وبالمثل، لم تقم Microsoft بإنشاء Edge ( microsoft-edge
) لمنصات Linux/ARM.
لا يُنصح بتشغيل صورة AMD64 تحت المحاكاة على منصة ARM64 بسبب مشكلات الأداء والاستقرار.
بالنسبة لنظام التشغيل Linux/ARM، استخدم متصفح Chromium مفتوح المصدر. تتوفر صور Chromium (العقدة والمستقلة) بأقواس متعددة.
$ docker run --rm -it -p 4444:4444 -p 5900:5900 -p 7900:7900 --shm-size 2g selenium/standalone-chromium:latest
يتم اختبار الصور متعددة الأقواس على CircleCI بفئة الموارد Linux/ARM64. انظر الحالة أدناه.
بالنسبة لصور حاوية عامل الإرساء التجريبية، التي تعمل على منصات مثل Apple M-series أو Raspberry Pi، يوفر المستودع الموجود في seleniumhq-community/docker-seleniarm الصور التي يتم نشرها في سجل Seleniarm Docker Hub.
راجع العدد رقم 1076 لمزيد من المعلومات حول هذه الصور.
الآن، تم دمج شوكة seleniumhq-community/docker-seleniarm.
نوصي بتمكين الميزة التجريبية لمخزن الصور المعبأ في Docker Engine. تتفهم containerd
الصور متعددة المنصات، حيث يمكن أن تشير علامة صورة واحدة إلى متغيرات مختلفة تغطي نطاقًا واسعًا من أنظمة التشغيل وبنيات الأجهزة. إنه يبسط عملية إنشاء الصور وتخزينها وتوزيعها عبر منصات مختلفة.
أمر واحد لتمكين هذه الميزة في Docker Engine:
make set_containerd_image_store
لإنشاء كافة الصور لمنصات متعددة، قم بتشغيل الأمر التالي:
PLATFORMS=linux/amd64,linux/arm64 make build
لإنشاء الصور لمنصة معينة، قم بتشغيل الأمر التالي:
PLATFORMS=linux/arm64 make build
افتراضيًا، بدون تحديد متغير PLATFORMS
، يتم إنشاء الصور لمنصة linux/amd64
.
يتم إنشاء الصور الليلية أعلى البنية الليلية في مشروع السيلينيوم الأولي مع أحدث التغييرات في الفرع الرئيسي في هذا المستودع. علامة الصورة nightly
. لا ينصح باستخدام الصور في الإنتاج. إنه فقط لغرض الاختبار.
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:nightly
تحقق من إنشاء عامل الإرساء للبدء باستخدام الصور الليلية docker-compose-v3-full-grid-nightly.yml
لإجراء الاختبارات أو العمل مع متصفحات ما قبل الإصدار، تحتفظ Google وMozilla وMicrosoft بقناة إصدار Dev وBeta لأولئك الذين يحتاجون إلى رؤية ما سيتم إصداره قريبًا لعامة السكان.
فيما يلي تعليمات تشغيلها في الوضع المستقل:
كروم بيتا:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:beta
تطوير كروم:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:dev
فايرفوكس بيتا:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:beta
مطور فايرفوكس:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:dev
الحافة التجريبية:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:beta
تطوير الحافة:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:dev
docker-compose-v3-beta-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-beta-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-beta-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
docker-compose-v3-dev-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-dev-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-dev-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
لمزيد من المعلومات حول صور حاوية قنوات Dev وBeta، راجع منشور المدونة على متصفحات قنوات Dev وBeta عبر Docker Selenium.
فايرفوكس
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
الكروم
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
حافة
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
ملاحظة: يمكن تشغيل حاوية مستقلة واحدة فقط على المنفذ 4444
في نفس الوقت.
هناك طرق مختلفة لتشغيل الصور وإنشاء شبكة ذات مركز وعقد، حدد الخيارات التالية.
سيتم إنشاء المحور والعقد في نفس الشبكة وسوف يتعرفون على بعضهم البعض من خلال اسم الحاوية الخاصة بهم. يجب إنشاء شبكة Docker كخطوة أولى.
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - edge: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - firefox: 4.26 . 0 - 20241101
عند الانتهاء من استخدام الشبكة، وخروج الحاويات، يمكن إزالة الشبكة باستخدام الأمر التالي:
# Removes the grid network
$ docker network rm grid
سيتم إنشاء المحور والعقد على أجهزة/أجهزة افتراضية مختلفة، ويجب أن يعرفوا عناوين IP الخاصة ببعضهم البعض للتواصل بشكل صحيح. إذا كان سيتم تشغيل أكثر من عقدة واحدة على نفس الجهاز/الجهاز الظاهري، فيجب تكوينها لعرض منافذ مختلفة.
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 2> selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 2> ` selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 3> selenium/node-edge:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 3> ` selenium / node - edge: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> selenium/node-firefox:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` selenium / node - firefox: 4.26 . 0 - 20241101
$ docker run -d -p 5556:5556 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> -e SE_NODE_PORT=5556 selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5556 : 5556 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` - e SE_NODE_PORT = 5556 ` selenium / node - chrome: 4.26 . 0 - 20241101
يعد Docker Compose أبسط طريقة لبدء الشبكة. استخدم الموارد المرتبطة أدناه، واحفظها محليًا وتحقق من تعليمات التنفيذ أعلى كل ملف.
docker-compose-v2.yml
docker-compose-v3.yml
لإيقاف الشبكة وتنظيف الحاويات التي تم إنشاؤها، قم بتشغيل docker compose down
.
docker-compose-v3-swarm.yml
من الممكن بدء شبكة السيلينيوم مع فصل جميع مكوناتها. للتبسيط، سيتم توفير مثال فقط باستخدام عامل الإرساء. احفظ الملف محليًا، وتحقق من تعليمات التنفيذ الموجودة فوقه.
docker-compose-v3-full-grid.yml
متغير البيئة | خيار | يكتب | القيمة الافتراضية | وصف |
---|---|---|---|---|
SE_REJECT_UNSUPPORTED_CAPS | --reject-unsupported-caps | منطقية | false | السماح للموزع برفض الطلب على الفور إذا كانت الشبكة لا تدعم القدرة المطلوبة. |
SE_HEALTHCHECK_INTERVAL | --healthcheck-interval | كثافة العمليات | 120 | وهذا يضمن أن الخادم يمكنه تنفيذ الأمر ping على جميع العقد بنجاح بعد فترة زمنية. |
يمكن تسجيل تنفيذ الاختبارات باستخدام صورة selenium/video:ffmpeg-7.1-20241101
Docker. هناك حاجة إلى حاوية واحدة لكل حاوية يتم تشغيل المتصفح فيها. هذا يعني أنه إذا كنت تقوم بتشغيل 5 عقد/حاويات مستقلة، فستحتاج إلى 5 حاويات فيديو، ويكون التعيين 1-1.
حاليًا، الطريقة الوحيدة للقيام بهذا التعيين هي يدويًا (إما بدء الحاويات يدويًا أو من خلال docker compose
). نحن نكرر هذه العملية وربما سيكون هذا الإعداد أكثر بساطة في المستقبل.
تعتمد صورة Video Docker التي نقدمها على صورة ffmpeg Ubuntu المقدمة من مشروع jrottenberg/ffmpeg، شكرًا لك على تقديم هذه الصورة وتبسيط عملنا؟
بدءًا من علامة الصورة المستندة إلى 4.20.0
وما بعده، تعتمد صورة Docker للفيديو على صورة FFmpeg Ubuntu المقدمة من مشروع linuxserver/docker-ffmpeg نظرًا لأن الصورة متاحة لمنصات متعددة. نشكرك على تبسيط مشروعنا ومساعدتنا على المضي قدمًا بدعم معماري متعدد.
ملحوظات :
/videos
داخل حاوية الفيديو. قم بتعيين دليل محلي للحصول على مقاطع الفيديو.FILE_NAME
لتجنب النتائج غير المتوقعة.يوضح هذا المثال كيفية بدء تشغيل الحاويات يدويًا:
$ docker network create grid
$ docker run -d -p 4444:4444 -p 6900:5900 --net grid --name selenium --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d --net grid --name video -v /tmp/videos:/videos selenium/video:ffmpeg-7.1-20241101
# Run your tests
$ docker stop video && docker rm video
$ docker stop selenium && docker rm selenium
بعد إيقاف الحاويات وإزالتها، من المفترض أن تشاهد ملف فيديو في دليل /tmp/videos
بجهازك.
فيما يلي مثال باستخدام المحور وبعض العقد:
docker-compose-v3-video.yml
بناءً على دعم البيانات الوصفية في الاختبارات. عندما يتم نشر مسجل الفيديو الجانبي مع عقدة المتصفح مع تمكين SE_VIDEO_FILE_NAME=auto
وإضافة بيانات التعريف إلى اختباراتك، فإن اسم ملف الفيديو سوف يستخرج قيمة الإمكانية se:name
ويستخدمها كاسم ملف فيديو.
على سبيل المثال في ربط بايثون:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
سيكون اسم ملف الفيديو الناتج هو test_visit_basic_auth_secured_page_ChromeTests_
.
إذا تمت معالجة اسم الاختبار الخاص بك بواسطة إطار عمل الاختبار، وكان فريدًا بالتأكيد، فيمكنك أيضًا تعطيل معرف الجلسة الملحق باسم ملف الفيديو عن طريق تعيين SE_VIDEO_FILE_NAME_SUFFIX=false
.
سيتم اقتطاع اسم الملف إلى 255 حرفًا لتجنب أسماء الملفات الطويلة. علاوة على ذلك، سيتم استبدال حرف space
بـ _
وسيتم الاحتفاظ فقط بالأحرف الهجائية والأرقام -
(الواصلة) _
(الشرطة السفلية) في اسم الملف.
يمكن تخصيص التعبير العادي الخاص بالقطع عن طريق تعيين متغير البيئة SE_VIDEO_FILE_NAME_TRIM_REGEX
. القيمة الافتراضية هي [:alnum:]-_
. يجب أن يكون التعبير العادي متوافقًا مع الأمر tr
في bash.
على مستوى النشر، تكون حاوية المسجل في وضع التشغيل دائمًا. بالإضافة إلى ذلك، يمكنك تعطيل عملية تسجيل الفيديو عبر إمكانية الجلسة se:recordVideo
. على سبيل المثال في ربط بايثون:
options . set_capability ( 'se:recordVideo' , False )
في حاوية المسجل، سيتم إجراء استعلام GraphQL في Hub استنادًا إلى Node SessionId واستخراج قيمة se:recordVideo
في القدرات قبل اتخاذ قرار ببدء عملية تسجيل الفيديو أم لا.
ملاحظات: للوصول إلى نقطة نهاية GraphQL، تحتاج حاوية المُسجل إلى معرفة عنوان URL الخاص بـ Hub. يمكن تمرير عنوان URL الخاص بـ Hub عبر متغير البيئة SE_NODE_GRID_URL
. على سبيل المثال SE_NODE_GRID_URL
هو http://selenium-hub:4444
.
تم تثبيت RCLONE في صورة مسجل الفيديو. يمكنك استخدامه لتحميل مقاطع الفيديو إلى خدمة التخزين السحابية. إلى جانب تسجيل الفيديو المذكور أعلاه، يمكنك تمكين وظيفة التحميل عن طريق تعيين متغيرات البيئة التالية:
version : " 3 "
services :
chrome_video :
image : selenium/video:ffmpeg-7.1-20241101
depends_on :
- chrome
environment :
- DISPLAY_CONTAINER_NAME=chrome
- SE_VIDEO_FILE_NAME=auto
- SE_VIDEO_UPLOAD_ENABLED=true
- SE_UPLOAD_DESTINATION_PREFIX=s3://mybucket/path
- RCLONE_CONFIG_S3_TYPE=s3
- RCLONE_CONFIG_S3_PROVIDER=GCS
- RCLONE_CONFIG_S3_ENV_AUTH=true
- RCLONE_CONFIG_S3_REGION=asia-southeast1
- RCLONE_CONFIG_S3_LOCATION_CONSTRAINT=asia-southeast1
- RCLONE_CONFIG_S3_ACL=private
- RCLONE_CONFIG_S3_ACCESS_KEY_ID=xxx
- RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=xxx
- RCLONE_CONFIG_S3_ENDPOINT=https://storage.googleapis.com
- RCLONE_CONFIG_S3_NO_CHECK_BUCKET=true
SE_VIDEO_FILE_NAME=auto
معرف الجلسة كاسم ملف الفيديو. وهذا يضمن أن اسم ملف الفيديو فريد للتحميل. يعمل إنشاء اسم ملف الفيديو تلقائيًا استنادًا إلى نقطة نهاية /status
العقدة (ونقطة نهاية GraphQL الاختيارية) للحصول على معرف الجلسة وإمكانياتها.
SE_VIDEO_UPLOAD_ENABLED=true
سيعمل على تمكين ميزة تحميل الفيديو. في الخلفية، سيتم إنشاء ملف توجيهي يحتوي على الملف والوجهة ليقوم القائم بالتحميل باستهلاكه والمتابعة.
SE_VIDEO_INTERNAL_UPLOAD=true
سوف يستخدم RCLONE المثبت في الحاوية للتحميل. إذا كنت تريد استخدام حاوية جانبية أخرى للتحميل، فاضبطها على false
.
متغيرات ENV لكل وضع | المحور/العقد | أدوار مستقلة | الشبكة الديناميكية |
---|---|---|---|
SE_VIDEO_RECORD_STANDALONE (إلزامي) | false (افتراضي) | true | true |
DISPLAY_CONTAINER_NAME (إلزامي) | إدخال المستخدم | إدخال المستخدم | (غير مطلوب) |
SE_NODE_PORT (اختياري) | 5555 | 4444 | (غير مطلوب) |
SE_NODE_GRID_URL (اختياري) | إدخال المستخدم | (غير مطلوب) | (غير مطلوب) |
بالنسبة لمتغيرات البيئة ذات البادئة RCLONE_
يتم استخدامها لتمرير التكوين عن بعد إلى RCLONE. يمكنك العثور على مزيد من المعلومات حول تكوين RCLONE هنا. عند الاستخدام في الشبكة الديناميكية، يجب دمج هذه المتغيرات مع البادئة SE_
، على سبيل المثال SE_RCLONE_
. انظر المرجع أدناه لمزيد من التفاصيل.
تكوين تسجيل الفيديو وتحميله لـ Hub والعقد: docker-compose-v3-video-upload.yml
قم بتكوين تسجيل الفيديو وتحميله للأدوار المستقلة: docker-compose-v3-video-upload-standalone.yml
تكوين تسجيل الفيديو وتحميله لـ Dynamic Grid (node-docker): docker-compose-v3-video-upload-dynamic-grid.yml
تكوين تسجيل الفيديو وتحميله لـ Dynamic Grid المستقل (standalone-docker): الاختبارات/docker-compose-v3-test-standalone-docker.yaml
متغير البيئة | القيمة الافتراضية | وصف |
---|---|---|
SE_UPLOAD_RETAIN_LOCAL_FILE | false | احتفظ بالملف المحلي بعد التحميل بنجاح |
SE_UPLOAD_COMMAND | copy | يتم استخدام أمر RCLONE لنقل الملف. فرض move عندما يكون الاحتفاظ بالملف المحلي false |
SE_UPLOAD_OPTS | -P --cutoff-mode SOFT --metadata --inplace | يمكن تعيين خيارات أخرى تنتمي إلى أمر RCLONE. |
SE_UPLOAD_CONFIG_FILE_NAME | upload.conf | ملف التكوين للمضيف البعيد بدلاً من التعيين عبر بادئة متغير env SE_RCLONE_* |
SE_UPLOAD_CONFIG_DIRECTORY | /opt/bin | دليل ملف التكوين (قم بتغييره عند تثبيت ملف conf في دليل آخر) |
تتمتع Grid 4 بالقدرة على بدء تشغيل حاويات Docker عند الطلب، وهذا يعني أنها تبدأ حاوية Docker في الخلفية لكل طلب جلسة جديدة، ويتم تنفيذ الاختبار هناك، وعندما يكتمل الاختبار، يتم التخلص من الحاوية.
يمكن استخدام وضع التنفيذ هذا إما في الأدوار المستقلة أو العقدية. يجب إخبار وضع التنفيذ "الديناميكي" بصور Docker التي يجب استخدامها عند بدء تشغيل الحاويات. بالإضافة إلى ذلك، تحتاج الشبكة إلى معرفة URI الخاص ببرنامج Docker الخفي. يمكن وضع هذا التكوين في ملف toml
محلي.
يمكنك حفظ هذا الملف محليًا وتسميته، على سبيل المثال، config.toml
.
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , ' {"browserName": "firefox"} ' , " selenium/standalone-chrome:4.26.0-20241101 " , ' {"browserName": "chrome"} ' , " selenium/standalone-edge:4.26.0-20241101 " , ' {"browserName": "MicrosoftEdge"} ' ] host-config-keys = [ " Dns " , " DnsOptions " , " DnsSearch " , " ExtraHosts " , " Binds " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because internally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values # [server] # host =# port =
باستخدام مفتاح التكوين الاختياري host-config-keys
ضمن القسم [docker] في ملف config.toml (أو خيار CLI --docker-host-config-keys). يمكن للمستخدمين تحديد قائمة بمفاتيح تكوين مضيف عامل الإرساء التي يجب تمريرها إلى حاويات المتصفح.
يمكن العثور على أسماء المفاتيح الصالحة لتكوين مضيف Docker في وثائق Docker API أو عبر أمر docker inspect
حاوية العقدة-docker.
في حالة رغبتك في الوصول إلى دليل التنزيل في حاويات متصفح العقدة (على سبيل المثال /home/seluser/Downloads
) عبر تكوين وحدات التخزين لحاوية الشبكة الديناميكية، يمكنك إضافة التكوين التالي إلى ملف config.toml
[ docker ]
host-config-keys = [ " Binds " ]
تكوين وحدات التخزين في ملف إنشاء عامل الإرساء
services :
node-docker :
image : selenium/node-docker:latest
volumes :
- ./assets:/opt/selenium/assets
- ./config.toml:/opt/selenium/docker.toml
- ./downloads:/home/seluser/Downloads
- /var/run/docker.sock:/var/run/docker.sock
environment :
- SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
/opt/selenium/config.toml
هو المسار الافتراضي لملف التكوين في جميع الصور. بمجرد مشاركة تكوين وحدات التخزين مع حاويات متصفح العقدة، يمكن الكتابة فوق config.toml
الخاص بها بواسطة ملف تكوين حاوية Node-docker.
في هذه الحالة، قم بتثبيت ملف config.toml
الخاص بك على /opt/selenium/docker.toml
في حاوية Node-docker. وقم بتعيين متغير البيئة SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
لتحديد اسم ملف التكوين هذا للبرنامج النصي لبدء التشغيل.
ارجع إلى المثال docker-compose-v3-test-node-docker.yaml
يمكن توسيع هذا ليشمل النشر الكامل للشبكة، حيث يتم نشر جميع المكونات بشكل فردي. الفكرة العامة هي أن يكون المركز في جهاز افتراضي واحد، وكل عقدة في أجهزة افتراضية منفصلة وأكثر قوة.
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
- v ${PWD} / config.toml: / opt / selenium / config.toml `
- v ${PWD} / assets: / opt / selenium / assets `
- v / var / run / docker.sock: / var / run / docker.sock `
selenium / node - docker: 4.26 . 0 - 20241101
لحفظ الأصول على مضيفك، يرجى تركيب مسار مضيفك على /opt/selenium/assets
.
عند الانتهاء من استخدام الشبكة، وخروج الحاويات، يمكن إزالة الشبكة باستخدام الأمر التالي:
# Removes the grid network
$ docker network rm grid
docker run --rm --name selenium-docker -p 4444:4444
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1>
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker run -d -p 5555:5555 `
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1> `
-e SE_EVENT_BUS_PUBLISH_PORT=4442 `
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/node-docker:4.26.0-20241101
أكمل قسم [server]
في ملف config.toml
.
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , " { " browserName " : " firefox " } " , " selenium/standalone-chrome:4.26.0-20241101 " , " { " browserName " : " chrome " } " , " selenium/standalone-edge:4.26.0-20241101 " , " { " browserName " : " MicrosoftEdge " } " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because interally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values [ server ] host = < ip-from-node-machine> port = < port-from-node-machine>
لحفظ الأصول على مضيفك، يرجى تركيب مسار مضيفك على /opt/selenium/assets
.
فيما يلي مثال باستخدام Hub وNode:
docker-compose-v3-dynamic-grid.yml
يمكن تكوين الحاويات بشكل أكبر من خلال متغيرات البيئة، مثل SE_NODE_SESSION_TIMEOUT
و SE_OPTS
. عند إنشاء حاوية فرعية، سيتم إعادة توجيه كافة متغيرات البيئة المسبوقة بـ SE_
وتعيينها في الحاوية. يمكنك تعيين متغيرات البيئة المطلوبة في حاويات standalone-docker
أو حاويات node-docker
. يقوم المثال التالي بتعيين مهلة الجلسة إلى 700 ثانية لجميع الجلسات:
docker run --rm --name selenium-docker -p 4444:4444
-e SE_NODE_SESSION_TIMEOUT=700
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-e SE_NODE_SESSION_TIMEOUT=700 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
لتسجيل جلسة WebDriver الخاصة بك، تحتاج إلى إضافة حقل se:recordVideo
مضبوطًا على true
. يمكنك أيضًا تعيين منطقة زمنية ودقة الشاشة، على سبيل المثال:
{
"browserName" : " firefox " ,
"platformName" : " linux " ,
"se:recordVideo" : " true " ,
"se:timeZone" : " US/Pacific " ,
"se:screenResolution" : " 1920x1080 "
}
بعد إجراء الاختبار، تحقق من المسار الذي قمت بتثبيته في حاوية Docker، ( ${PWD}/assets
)، ومن المفترض أن تشاهد مقاطع الفيديو ومعلومات الجلسة.
من روابط اللغة، يمكنك ضبط إمكانية se:name
لتغيير اسم ملف الفيديو الناتج ديناميكيًا. على سبيل المثال، في ربط بايثون:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:recordVideo' , True )
options . set_capability ( 'se:screenResolution' , '1920x1080' )
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
بعد تنفيذ الاختبار، ضمن ( ${PWD}/assets
) يمكنك رؤية اسم ملف الفيديو في المسار /
سيتم اقتطاع اسم الملف إلى 255 حرفًا لتجنب أسماء الملفات الطويلة. علاوة على ذلك، سيتم استبدال حرف space
بـ _
، وسيتم الاحتفاظ فقط بالأحرف الهجائية والأرقام -
(الواصلة) _
(الشرطة السفلية) في اسم الملف. (يتوفر هذا العمل الفذ بمجرد دمج العلاقات العامة هذه)
يتم تثبيت tzdata
في الصور القائمة، ويمكنك ضبط المنطقة الزمنية في الحاوية باستخدام متغير env TZ
. بشكل افتراضي، يتم تعيين المنطقة الزمنية على UTC
. يمكن العثور على قائمة المناطق الزمنية المدعومة هنا. على سبيل المثال:
$ docker run --rm --entrypoint= " " -e TZ=Asia/Ho_Chi_Minh selenium/node-chromium:latest date +%FT%T%Z
2024-08-28T18:19:26+07
نحن نقدم مخطط Helm لنشر صور Docker هذه إلى Kubernetes. اقرأ المزيد من التفاصيل في الملف التمهيدي Helm.
يمكنك تمرير متغير SE_OPTS
بمعلمات سطر أوامر إضافية لبدء لوحة وصل أو عقدة.
$ docker run -d -p 4444:4444 -e SE_OPTS= " --log-level FINE " --name selenium-hub selenium/hub:4.26.0-20241101
يمكنك تمرير متغير البيئة SE_JAVA_OPTS
إلى عملية Java.
$ docker run -d -p 4444:4444 -e SE_JAVA_OPTS=-Xmx512m --name selenium-hub selenium/hub:4.26.0-20241101
بدلاً من إضافة الوسائط عبر خيارات المتصفح من روابط اللغة، على سبيل المثال:
options = ChromeOptions ()
options . add_argument ( '--incognito' )
options . add_argument ( '--disable-dev-shm-usage' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444/wd/hub" )
يمكنك أيضًا استباقيًا لفرض تطبيق الوسائط مباشرةً من متغيرات بيئة الحاوية (العقدة أو المستقلة أو عامل إرساء العقدة). تحديد متغير البيئة بالاسم الذي يبدأ بـ SE_BROWSER_ARGS_
والمتابعة بواسطة مفتاح التكوين أمر متروك لك (تأكد من أنها فريدة عند تحديد وسائط متعددة). على سبيل المثال:
docker run -d -p 4444:4444
-e SE_BROWSER_ARGS_INCOGNITO=--incognito
-e SE_BROWSER_ARGS_DISABLE_DSHM=--disable-dev-shm-usage
selenium/standalone-chrome:latest
قم بإدراج وسيطات سطر أوامر الكروم للرجوع إليها.
ملاحظة: ينطبق هذا حاليًا على متصفحات العقدة Chrome/Chromium وEdge.
تسجل العقد نفسها من خلال ناقل الأحداث. عند بدء تشغيل الشبكة في إعداد Hub/Node النموذجي الخاص بها، سيكون Hub هو الذي يعمل بمثابة ناقل الأحداث، وعندما يتم تشغيل الشبكة مع فصل جميع عناصرها الخمسة عن بعضها البعض، سيتم تشغيل ناقل الأحداث من تلقاء نفسه.
في كلتا الحالتين، من الضروري إخبار العقدة بمكان وجود ناقل الأحداث، حتى تتمكن من تسجيل نفسها. هذا هو الغرض من متغيرات البيئة SE_EVENT_BUS_HOST
و SE_EVENT_BUS_PUBLISH_PORT
و SE_EVENT_BUS_SUBSCRIBE_PORT
.
في بعض الحالات، على سبيل المثال، إذا كنت تريد وضع علامة على عقدة، فقد يكون من الضروري توفير صورة نمطية مخصصة لتكوين العقدة. يقوم متغير البيئة SE_NODE_STEREOTYPE
بتعيين إدخال الصورة النمطية في config.toml
الخاص بالعقدة. يمكن العثور على مثال لملف config.toml هنا: إعداد الإمكانيات المخصصة لمطابقة عقد معينة.
فيما يلي مثال بالقيم الافتراضية لمتغيرات البيئة هذه:
$ docker run -d
-e SE_EVENT_BUS_HOST= < event_bus_ip | event_bus_name >
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_STEREOTYPE= " { " browserName " : " ${SE_NODE_BROWSER_NAME} " , " browserVersion " : " ${SE_NODE_BROWSER_VERSION} " , " platformName " : " Linux " } "
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
ترحيل الأوامر إلى نقطة نهاية الخدمة التي تدعم WebDriver. من المفيد توصيل خدمة خارجية تدعم WebDriver بشبكة السيلينيوم. مثال على هذه الخدمة يمكن أن يكون مزود السحابة أو خادم Appium. بهذه الطريقة، يمكن لـ Grid تمكين المزيد من التغطية للمنصات والإصدارات غير الموجودة محليًا.
ما يلي هو مثال على أوامر ترحيل التكوين.
docker-compose-v3-test-node-relay.yml
إذا كنت تريد ترحيل الأوامر فقط، فإن selenium/node-base
مناسبة وخفيفة الوزن لهذا الغرض. في حالة رغبتك في تكوين العقدة باستخدام كل من المتصفحات وأوامر الترحيل، يمكن استخدام صور العقدة المعنية.
لاستخدام متغيرات البيئة لإنشاء تكوينات الترحيل، قم بتعيين SE_NODE_RELAY_URL
والمتغيرات الأخرى على النحو التالي
[ relay ]
url = " ${SE_NODE_RELAY_URL} "
status-endpoint = " ${SE_NODE_RELAY_STATUS_ENDPOINT} "
protocol-version = " ${SE_NODE_RELAY_PROTOCOL_VERSION} "
configs = [ ' ${SE_NODE_RELAY_MAX_SESSIONS} ' , ' {"browserName": "${SE_NODE_RELAY_BROWSER_NAME}", "platformName": "${SE_NODE_RELAY_PLATFORM_NAME}", "appium:platformVersion": "${SE_NODE_RELAY_PLATFORM_VERSION}"} ' ]
لإجراء اختبار نموذجي باستخدام العقدة المُرحّلة، يمكنك استنساخ المشروع وتجربة الأمر أدناه:
make test_node_relay
بشكل افتراضي، يمكن الوصول إلى السيلينيوم على http://127.0.0.1:4444/
. يمكن تكوين السيلينيوم لاستخدام مسار فرعي مخصص عن طريق تحديد المتغير البيئي SE_SUB_PATH
. في المثال أدناه يمكن الوصول إلى السيلينيوم على http://127.0.0.1:4444/selenium-grid/
$ docker run -d -p 4444:4444 -e SE_SUB_PATH=/selenium-grid/ --name selenium-hub selenium/hub:4.26.0-20241101
افتراضيًا، تبدأ العقد بدقة شاشة تبلغ 1920 × 1080 مع عمق ألوان يبلغ 24 بت ونقطة لكل بوصة تبلغ 96. يمكن ضبط هذه الإعدادات عن طريق تحديد المتغيرات البيئية SE_SCREEN_WIDTH
و SE_SCREEN_HEIGHT
و SE_SCREEN_DEPTH
و/أو SE_SCREEN_DPI
عند بدء تشغيل الحاوية.
docker run -d -e SE_SCREEN_WIDTH=1366 -e SE_SCREEN_HEIGHT=768 -e SE_SCREEN_DEPTH=24 -e SE_SCREEN_DPI=74 selenium/standalone-firefox:4.26.0-20241101
في بعض حالات الاستخدام، قد تحتاج إلى تعيين عنوان URL للشبكة إلى العقدة، على سبيل المثال، إذا كنت ترغب في الوصول إلى نقطة نهاية BiDi/CDP. يعد هذا مطلوبًا أيضًا عندما تريد استخدام RemoteWebDriver.builder()
أو Augmenter()
الجديد الموجود في Selenium 4 (نظرًا لأنهم يقومون بإعداد اتصال BiDi/CDP ضمنيًا). يمكنك القيام بذلك من خلال متغير البيئة SE_NODE_GRID_URL
، على سبيل المثال -e SE_NODE_GRID_URL=http://
. يلزم ضبط env var إذا كنت تريد مشاهدة العرض المباشر أثناء تنفيذ الجلسات.
لدى Grid مهلة افتراضية للجلسة تبلغ 300 ثانية، حيث يمكن أن تكون الجلسة في حالة لا معنى لها حتى يتم إيقافها. يمكنك استخدام SE_NODE_SESSION_TIMEOUT
للكتابة فوق هذه القيمة بالثواني.
يتم وضع طلب جلسة جديد في قائمة انتظار الجلسة قبل معالجته، ويظل الطلب في قائمة الانتظار حتى يتم العثور على فتحة مطابقة عبر العقد المسجلة. ومع ذلك، قد تنتهي مهلة طلب الجلسة الجديدة إذا لم يتم العثور على فتحة. افتراضيًا، سيبقى الطلب في قائمة الانتظار لمدة تصل إلى 300 ثانية قبل الوصول إلى المهلة المحددة. بالإضافة إلى ذلك، تتم محاولة معالجة الطلب كل 5 ثوانٍ (افتراضيًا).
من الممكن تجاوز هذه القيم من خلال متغيرات البيئة في Hub وSessionQueue ( SE_SESSION_REQUEST_TIMEOUT
و SE_SESSION_RETRY_INTERVAL
). على سبيل المثال، ستكون المهلة البالغة 500 ثانية هي SE_SESSION_REQUEST_TIMEOUT=500
والفاصل الزمني لإعادة المحاولة الذي يبلغ ثانيتين هو SE_SESSION_RETRY_INTERVAL=2
.
افتراضيًا، يتم تكوين جلسة واحدة فقط للتشغيل لكل حاوية من خلال متغير البيئة SE_NODE_MAX_SESSIONS
. من الممكن زيادة هذا العدد إلى الحد الأقصى من المعالجات المتاحة، وذلك لأنه يتم تحقيق المزيد من الاستقرار عندما تحتوي حاوية/متصفح واحد على وحدة معالجة مركزية واحدة لتشغيلها.
ومع ذلك، إذا قمت بقياس الأداء وبناءً على ذلك، تعتقد أنه يمكن تنفيذ المزيد من الجلسات في كل حاوية، فيمكنك تجاوز الحد الأقصى عن طريق تعيين SE_NODE_MAX_SESSIONS
على الرقم المطلوب و SE_NODE_OVERRIDE_MAX_SESSIONS
على true
. ومع ذلك، لا يُنصح بتشغيل جلسات متصفح أكثر من المعالجات المتاحة نظرًا لأنك ستزيد من تحميل الموارد.
يؤدي تجاوز هذا الإعداد إلى تأثير جانبي غير مرغوب فيه عند تمكين تسجيل الفيديو حيث قد يتم التقاط أكثر من جلسة متصفح في نفس الفيديو.
Firefox، Chrome، عند استخدام وضع مقطوعة الرأس، ليست هناك حاجة لبدء تشغيل خادم Xvfb.
لتجنب بدء تشغيل الخادم، يمكنك ضبط متغير البيئة SE_START_XVFB
على false
(أو أي قيمة أخرى غير true
)، على سبيل المثال:
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_START_XVFB=false --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
لمزيد من المعلومات، راجع مشكلة GitHub هذه.
ذُكر:
SE_START_XVFB
على القيمة true
للتشغيل في الوضع --headless=new
. في بعض البيئات، مثل Docker Swarm أو Kubernetes، من المفيد إيقاف تشغيل حاوية Node أو Standalone بعد تنفيذ اختبارات N. على سبيل المثال، يمكن استخدام هذا في Kubernetes لإنهاء الحجرة ثم توسيع نطاق جديد بعد جلسات N. قم بتعيين متغير البيئة SE_DRAIN_AFTER_SESSION_COUNT
إلى قيمة أعلى من الصفر لتمكين هذا السلوك.
$ docker run -e SE_DRAIN_AFTER_SESSION_COUNT=5 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
باستخدام الأمر السابق، سيتم إيقاف تشغيل الحاوية المستقلة بعد تنفيذ 5 جلسات.
في الحاويات التي تعمل لفترة طويلة، يمكن أن تترك المتصفحات بعض بقايا الطعام. يمكن أن تكون هذه العمليات عالقة في المتصفح للمهام التي انتهت بالفعل ولكنها فشلت في إيقاف المتصفح بالكامل، أو الملفات المؤقتة المكتوبة على نظام الملفات /tmp
(خاصة في المتصفحات المستندة إلى Chrome). لتجنب ملء هذه الموارد مثل معرفات العمليات واستخدام نظام الملفات في الحاوية، يوجد برنامج نصي للتنظيف التلقائي يعمل كل ساعة في حاويات العقدة. سيؤدي هذا إلى تنظيف العمليات القديمة والملفات المؤقتة القديمة. بشكل افتراضي، يتم تعطيل هذا. عند التمكين، سيؤدي هذا إلى تنظيف المتصفحات التي تعمل لمدة أطول من ساعتين، والملفات الأقدم من يوم واحد. يمكن تمكينها وتعديلها باستخدام متغيرات البيئة التالية:
SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
: القيمة الافتراضية false
، تم ضبطها على true
لتمكين عملية التنظيف.SE_BROWSER_LEFTOVERS_INTERVAL_SECS
: القيمة الافتراضية 3600
(ساعة واحدة)، الفاصل الزمني للتنظيف بالثواني.SE_BROWSER_LEFTOVERS_PROCESSES_SECS
: القيمة الافتراضية 7200
(ساعتان)، سيتم إيقاف المتصفحات التي تعمل لفترة أطول من هذا الوقت.SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS
: القيمة الافتراضية 1
(يوم واحد)، ستتم إزالة الملفات التي تم إنشاؤها بواسطة المتصفحات المستندة إلى Chrome في /tmp
بعد هذا العدد من الأيام (يتم تجاهلها عند استخدام Firefox). إذا كنت تستخدم السيلينيوم لجلسات طويلة الأمد وتتوقع أن تعمل المتصفحات لمدة أطول من ساعتين، فلا تقم بتعيين SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
على true
(اترك القيمة الافتراضية false
)، أو قم بتعديل SE_BROWSER_LEFTOVERS_PROCESSES_SECS
لتعيين قيمة أعلى من القيمة الطويلة المتوقعة. تشغيل عمليات المتصفح.
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
باستخدام الأمر السابق، سيتم تمكين عملية التنظيف بالتوقيت الافتراضي.
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true
-e SE_BROWSER_LEFTOVERS_INTERVAL_SECS=7200
-e SE_BROWSER_LEFTOVERS_PROCESSES_SECS=3600
-e SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS=2
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
باستخدام الأمر السابق، سيتم تمكين عملية التنظيف، ولكن سيتم تشغيلها كل ساعتين (بدلاً من ساعة واحدة)، وستؤدي إلى إيقاف المتصفحات التي تعمل لمدة أطول من ساعة واحدة (بدلاً من ساعتين)، وستزيل الملفات المؤقتة الأقدم من يومين (بدلاً من 1).
يتم إخفاء عدد قليل من المتغيرات الناتجة مثل كلمة المرور والسر وما إلى ذلك في سجلات وحدة التحكم. ولأغراض تصحيح الأخطاء، يمكنك تعطيله عن طريق تعيين SE_MASK_SECRETS
على false
أثناء إنشاء برنامج bash النصي، يمكنك إخفاء الإخراج باستخدام بناء الجملة echo "Current value is $(mask ${YOUR_VARIABLE})
SE_MASK_SECRETS_MIN_LENGTH
الافتراضي هو 3
. وهذا يعني أنه سيتم إخفاء سلسلة طويلة إلى ***
لتجنب تعريض الطول لهجوم القوة الغاشمة.
بشكل افتراضي، توجد شهادات افتراضية موقعة ذاتيًا متاحة في الصورة في الموقع /opt/selenium/secrets
الذي يتضمن
server.jks
: ملف Truststore لتكوين JVM عبر خاصية النظام javax.net.ssl.trustStore
عند بدء تشغيل الخادم.server.pass
: يحتوي الملف على كلمة مرور Truststore لـ JVM عبر خاصية النظام javax.net.ssl.trustStorePassword
.tls.crt
: تم تعيين شهادة الخادم لاتصال https على خيار Selenium --https-certificate
.tls.key
: تم تعيين المفتاح الخاص للخادم (بتنسيق PKCS8) لاتصال https على خيار Selenium --https-private-key
.هناك متغيرات البيئة لتكوين الاتصال الآمن:
متغيرات البيئة | تقصير | خيار | وصف |
---|---|---|---|
SE_ENABLE_TLS | false | تمكين الاتصال الآمن مع التكوينات الافتراضية | |
SE_JAVA_SSL_TRUST_STORE | /opt/selenium/secrets/server.jks | JVM | |
SE_JAVA_SSL_TRUST_STORE_PASSWORD | /opt/selenium/secrets/server.pass | JVM | |
SE_JAVA_DISABLE_HOSTNAME_VERIFICATION | true | JVM | قم بتعطيل عمليات فحص المضيف للمكونات داخليًا |
SE_HTTPS_CERTIFICATE | /opt/selenium/secrets/tls.crt | السيلينيوم | اضبط على خيار CLI --https-certificate |
SE_HTTPS_PRIVATE_KEY | /opt/selenium/secrets/tls.key | السيلينيوم | اضبط على خيار CLI --https-private-key |
عبر وحدة التخزين، يمكنك استبدال الشهادات الافتراضية بشهاداتك الخاصة.
تحتاج الشهادة الموقعة ذاتيًا أيضًا إلى أن يثق بها العميل (أضفها إلى حزمة النظام على نطاق واسع CA الموثوق بها) لتجنب ظهور رسالة خطأ تتعلق بمصافحة SSL عند إنشاء RemoteWebDriver.
ارجع إلى النموذج: docker-compose-v3-full-grid-secure.yml
لدى المتصفحات المختلفة طرق مختلفة لتعيين اللغة والإعدادات المحلية من الربط.
يمكن تكوين Firefox لاستخدام لغة ولغة معينة عن طريق ضبط تفضيلات ملف التعريف عند إنشاء WebDriver من الربط. بالإضافة إلى ذلك، يجب تثبيت حزمة اللغة كوظيفة إضافية حتى تدخل لغة واجهة مستخدم المتصفح حيز التنفيذ. على سبيل المثال، لتعيين لغة المتصفح والإعدادات المحلية على vi-VN
، يمكنك اتباع الخطوات التالية:
احصل على أحدث حزمة لغة Firefox للغة المطلوبة، على سبيل المثال https://download.mozilla.org/?product=firefox-langpack-latest-SSL&lang=vi. بعد ذلك، يمكنك تثبيت حزمة اللغة كوظيفة إضافية عند إنشاء مثيل RemoteWebDriver.
profile = webdriver . FirefoxProfile ()
profile . set_preference ( 'intl.accept_languages' , 'vi-VN,vi' )
profile . set_preference ( 'intl.locale.requested' , 'vi-VN,vi' )
options = FirefoxOptions ()
options . profile = profile
driver = webdriver . Remote ( options = options , command_executor = "http://selenium-hub:4444/wd/hub" )
webdriver . Firefox . install_addon ( driver , "/local/path/to/vi.xpi" )
driver . get ( 'https://google.com' )
يوجد برنامج نصي للحصول على جميع حزم اللغات المتاحة لإصدار معين من Firefox. يمكنك تشغيل البرنامج النصي لتوصيل حزم اللغات إلى المصدر الخاص بك. على سبيل المثال:
FIREFOX_VERSION= $( docker run --rm --entrypoint= " " selenium/node-firefox:latest firefox --version | awk ' {print $3} ' )
&& ./NodeFirefox/get_lang_package.sh ${FIREFOX_VERSION} /local/path/to/download
أو يمكنك تحميل دليل الحاوية /home/seluser/firefox/distribution/extensions
على الدليل المضيف للوصول إلى الحزم التي تم إنشاؤها مسبقًا في الحاوية لاستخدامها في البرنامج النصي للاختبار.
يتم استخدام المشرف لإدارة العمليات والسجلات في الحاوية. يمكن ضبط القليل من إعدادات supervisord
عبر متغيرات البيئة على النحو التالي:
متغيرات البيئة | تقصير | التكوين supervisord |
---|---|---|
SE_SUPERVISORD_LOG_LEVEL | info | admin.loglevel |
SE_SUPERVISORD_CHILD_LOG_DIR | /tmp | المشرف.childlogdir |
SE_SUPERVISORD_LOG_FILE | /tmp/supervisord.log | admin.logfile |
SE_SUPERVISORD_PID_FILE | /tmp/supervisord.pid | المشرف.pidfile |
استنساخ الريبو ومن جذر دليل المشروع يمكنك بناء كل شيء عن طريق تشغيل:
$ VERSION=local make build
إذا كنت بحاجة إلى تكوين متغيرات البيئة من أجل إنشاء الصورة (وكيل http على سبيل المثال)، فما عليك سوى تعيين متغير بيئة BUILD_ARGS
الذي يحتوي على المتغيرات الإضافية لتمريرها إلى سياق عامل الإرساء (سيعمل هذا فقط مع عامل الإرساء >= 1.9)
$ BUILD_ARGS= " --build-arg http_proxy=http://acme:3128 --build-arg https_proxy=http://acme:3128 " make build
ملاحظة: سيؤدي حذف VERSION=local
إلى إنشاء الصور بالإصدار الذي تم إصداره ولكن مع استبدال التاريخ بالإصدار الحالي.
إذا كنت تريد إنشاء الصورة باستخدام UID/GID المضيف، فما عليك سوى تعيين متغير البيئة BUILD_ARGS
$ BUILD_ARGS= " --build-arg UID= $( id -u ) --build-arg GID= $( id -g ) " make build
إذا كنت تريد إنشاء الصورة باستخدام مستخدم/كلمة مرور افتراضية مختلفة، فما عليك سوى تعيين متغير البيئة BUILD_ARGS
$ BUILD_ARGS= " --build-arg SEL_USER=yourseluser --build-arg SEL_PASSWD=welcome " make build
استنادًا إلى أحدث ملف Dockerfile (عن طريق استنساخ الريبو ومن جذر دليل المشروع)، يمكنك إنشاء الصور باستخدام مجموعة محددة من Selenium Grid وإصدارات المتصفح.
على سبيل المثال ، ترغب في إنشاء صور node-chrome
و standalone-chrome
مع الإصدار 4.17.0
، إصدارات متصفح Chrome 119
، 120
، 123
على التوالي.
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
في عام ، يأخذ البرنامج النصي الحجج التالية:
$1
(إلزامي): نسخة شبكة سيلينيوم. التفاصيل تجلب من ملف المصفوفة$2
(إلزامي): الإصدار الرئيسي للمتصفح ، قيم متعددة مفصولة بفاصلة. التفاصيل تجلب من ملف المصفوفة$3
(اختيارية): اسم المتصفح. إذا لم يتم توفيره ، فسيتم تكراره على جميع المتصفحات ( chrome
، edge
، firefox
)$4
(اختيارية): اضغط على الصورة إلى السجل. بشكل افتراضي ، إنه false
. إذا كنت ترغب في دفع الصورة إلى السجل ، فقم بتعيينها على true
(مطلوب تسجيل الدخول إلى مساحة الاسم الخاصة بك قبل تشغيل البرنامج النصي). لتعيين مساحة الاسم الخاصة بك للصور ، يمكنك تعيين NAME
متغير البيئة قبل تشغيل البرنامج النصي. على سبيل المثال:
$ export NAME=artifactory.yourcompany.com/selenium
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
بعد تشغيل البرنامج النصي ، سترى صور قائمة مع علامة كاملة لتثبيت شبكة محددة ومستعرض بعد اتفاقيات وضع العلامات
يتم تثبيت خادم السيلينيوم والمتصفح والسائق مسبقًا في الصورة. في حال كنت ترغب في البقاء على نفس إصدار السيلينيوم وترقية المتصفح وسائقه إلى أحدث إصدار. يمكنك متابعة الخطوات أدناه
استنساخ الريبو ومن جذر دليل المشروع يمكنك الترقية عن طريق التشغيل:
$ VERSION= $EXPECTED_SELENIUM_VERSION make chrome_upgrade_version
على سبيل المثال: VERSION=4.16.1 make chrome_upgrade_version
الصورة الجديدة لديها علامة $VERSION_YYYYMMDD
حيث YYYYMMDD
هو التاريخ الحالي.
$ VERSION= $SELENIUM_VERSION make firefox_upgrade_version
$ VERSION= $SELENIUM_VERSION make edge_upgrade_version
يمكنك الرجوع إلى أوامر التفاصيل في ملف MakeFile.
إنها ممارسة جيدة للتحقق أولاً مما إذا كانت الشبكة جاهزة ومستعدة لتلقي الطلبات ، يمكن القيام بذلك عن طريق التحقق من نقطة نهاية /wd/hub/status
.
شبكة جاهزة ، تتألف من محور وعقدان ، يمكن أن تبدو هكذا:
{
"value" : {
"ready" : true ,
"message" : " Selenium Grid ready. " ,
"nodes" : [
{
"id" : " 6c0a2c59-7e99-469d-bbfc-313dc638797c " ,
"uri" : " http: u002fu002f 172.19.0.3:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " firefox "
},
"count" : 4
}
],
"sessions" : [
]
},
{
"id" : " 26af3363-a0d8-4bd6-a854-2c7497ed64a4 " ,
"uri" : " http: u002fu002f 172.19.0.4:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " chrome "
},
"count" : 4
}
],
"sessions" : [
]
}
]
}
}
"ready": true
إلى أن الشبكة جاهزة لتلقي الطلبات. يمكن استطلاع هذه الحالة من خلال برنامج نصي قبل إجراء أي اختبار ، أو يمكن إضافته كحصل على صحة عند بدء تشغيل حاوية Docker.
يمكن استخدام Script Check-Grid.sh ، والذي يتم تضمينه في الصور ، لاستطلاع حالة الشبكة.
يتحقق هذا المثال من حالة الشبكة كل 15 ثانية ، ويبلغ انقضاء 30 ثانية عند الانتهاء من الفحص ، ويحدد ما يصل إلى 5 مرات حتى يتم تمييز الحاوية على أنها غير صحية. يرجى استخدام القيم المعدلة لتناسب احتياجاتك ، (إذا لزم الأمر) استبدل المعلمات --host
و --port
للمعلمات المستخدمة في بيئتك.
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub
--health-cmd= ' /opt/bin/check-grid.sh --host 0.0.0.0 --port 4444 '
--health-interval=15s --health-timeout=30s --health-retries=5
selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
ملاحظة: لن يعمل محدد line على المحطات المستندة إلى Windows ، جرب إما
^
أو backtick.
يمكن التحقق من حالة صحة الحاوية من خلال القيام بمثابة docker ps
والتحقق من الحالة (healthy)|(unhealthy)
أو عن طريق فحصها بالطريقة التالية:
$ docker inspect --format= ' {{json .State.Health.Status}} ' selenium-hub
" healthy "
المشكلة الشائعة المعروفة في Docker هي أن الحاوية الجارية لا تعني دائمًا أن التطبيق بداخله جاهز. هناك طريقة بسيطة لمعالجة ذلك هي باستخدام نص "Wait-for-it" ، يمكن رؤية مزيد من المعلومات هنا.
البرنامج النصي التالي هو مثال على كيفية القيام بذلك باستخدام Bash ، ولكن ينطبق نفس المبدأ إذا كنت ترغب في القيام بذلك مع لغة البرمجة المستخدمة لكتابة الاختبارات. في المثال أدناه ، سيقوم البرنامج النصي باستطلاع نقطة نهاية الحالة كل ثانية. إذا لم تصبح الشبكة جاهزة في غضون 30 ثانية ، فسيخرج البرنامج النصي برمز الخطأ.
#! /bin/bash
# wait-for-grid.sh
set -e
url= " http://localhost:4444/wd/hub/status "
wait_interval_in_seconds=1
max_wait_time_in_seconds=30
end_time= $(( SECONDS + max_wait_time_in_seconds ))
time_left= $max_wait_time_in_seconds
while [ $SECONDS -lt $end_time ] ; do
response= $( curl -sL " $url " | jq -r ' .value.ready ' )
if [ -n " $response " ] && [ " $response " ] ; then
echo " Selenium Grid is up - executing tests "
break
else
echo " Waiting for the Grid. Sleeping for $wait_interval_in_seconds second(s). $time_left seconds left until timeout. "
sleep $wait_interval_in_seconds
time_left= $(( time_left - wait_interval_in_seconds ))
fi
done
if [ $SECONDS -ge $end_time ] ; then
echo " Timeout: The Grid was not started within $max_wait_time_in_seconds seconds. "
exit 1
fi
سيتطلب تثبيت
jq
عبرapt-get
، وإلا فإن البرنامج النصي سيواصل طباعةWaiting
دون إكمال التنفيذ.
ملاحظة: إذا لزم الأمر ، استبدل localhost
و 4444
للقيم الصحيحة في بيئتك. أيضًا ، يتم استقصاء هذا البرنامج النصي إلى أجل غير مسمى ، قد ترغب في تعديله وإنشاء مهلة.
دعنا نقول أن الأمر العادي لتنفيذ اختباراتك هو mvn clean test
. فيما يلي طريقة لاستخدام البرنامج النصي أعلاه وتنفيذ اختباراتك:
$ ./wait-for-grid.sh && mvn clean test
مثل هذا ، سيتم استطلاع البرنامج النصي حتى تصبح الشبكة جاهزة ، ثم ستبدأ اختباراتك.
بشكل افتراضي ، يتم تثبيت الصورة المستندة إلى libnss3-tools
وتهيئة /home/seluser/.pki/nssdb
، لذلك يمكنك إضافة شهاداتك بدون جذور. إذا كنت بحاجة إلى تثبيت شهادات مخصصة أو CA أو CA الوسيطة أو شهادات العميل (على سبيل المثال ، CA Enterprise Internal CA) ، يمكنك إنشاء صورة Docker الخاصة بك من صورة عقدة Selenium. يستخدم المتصفح القائم على الكروم nssdb
كمتجر للشهادات. يمكنك بعد ذلك تثبيت جميع الشهادات الداخلية المطلوبة في Dockerfile مثل هذا:
يوجد برنامج نصي للأداة المساعدة المعبأة في الصورة يمكن استخدامها لإضافة شهاداتك إلى متجر nssdb
و Bundle CA. البرنامج النصي هو /opt/bin/add-cert-helper.sh
.
قم بإنشاء dockerfile التي تستخدم صورة عقدة السيلينيوم كقاعدة ونسخ البرنامج النصي إلى الحاوية ، وتنفيذها. على سبيل المثال ، Dockerfile
إذا كان عليك إنشاء مجموعة من الشهادات المختلفة وصور العقدة. يمكنك إنشاء برنامج نصي bootstrap للقيام بذلك في طلقة واحدة. على سبيل المثال ، bootstrap.sh
يمكن اختبار المثال أعلاه مع الأمر التالي:
make test_custom_ca_cert
# ./tests/customCACert/bootstrap.sh
يمكنك العثور على مزيد من المعلومات هنا
وبهذه الطريقة ، سيتم تثبيت الشهادات وسيبدأ العقدة تلقائيًا كما كان من قبل.
كبديل ، يمكنك إضافة ملفات الشهادة الخاصة بك إلى صور السيلينيوم الموجودة. يفترض هذا المثال العملي أن لديك صورة معروفة لاستخدامها كصورة بناء ولديك وسيلة لنشر صور جديدة إلى سجل Docker المحلي.
يستخدم هذا المثال توزيعة قائمة على Redhat كصورة بناء (Rocky Linux) ولكن يمكن أن تكون أي صورة Linux من اختيارك. يرجى ملاحظة أن تعليمات الإنشاء ستختلف بين التوزيعات. يمكنك التحقق من التعليمات الخاصة بـ Ubuntu في المثال السابق.
يفترض المثال أيضًا أن CA الداخلي الخاص بك هو في /etc/pki/ca-trust/source/anchors/your_ca.pem ، الموقع الافتراضي لـ Rocky Linux. بدلاً من ذلك ، يمكنك أيضًا توفير هذه الملفات من مضيفك ونسخها في صورة البناء.
بالنسبة لمتصفحات Chrome و Edge ، تكون الوصفة هي نفسها ، ما عليك سوى تكييف اسم الصورة (Node-Chrome أو Node-Edge):
# Get a standard image for creating nssdb file
FROM rockylinux:8.6 as build
RUN yum install -y nss-tools
RUN mkdir -p -m755 /seluser/.pki/nssdb
&& certutil -d sql:/seluser/.pki/nssdb -N --empty-password
&& certutil -d sql:/seluser/.pki/nssdb -A -t "C,," -n YOUR_CA -i /etc/pki/ca-trust/source/anchors/YOUR_CA.pem
&& chown -R 1200:1201 /seluser
# Start from Selenium image and add relevant files from build image
FROM selenium/node-chrome:4.26.0-20241101
USER root
COPY --from=build /seluser/ /home/seluser/
USER seluser
مثال على Firefox:
# Get a standard image for working on
FROM rockylinux:8.6 as build
RUN mkdir -p "/distribution" "/certs" &&
cp /etc/pki/ca-trust/source/anchors/YOUR_CA*.pem /certs/ &&
echo '{ "policies": { "Certificates": { "Install": ["/opt/firefox-latest/YOUR_CA.pem"] }} }' >"/distribution/policies.json"
# Start from Selenium image and add relevant files from build image
FROM selenium/node-firefox:4.26.0-20241101
USER root
COPY --from=build /certs /opt/firefox-latest
COPY --from=build /distribution /opt/firefox-latest/distribution
USER seluser
يستخدم هذا المشروع X11VNC كخادم VNC للسماح للمستخدمين بفحص ما يحدث داخل الحاوية. يمكن للمستخدمين الاتصال بهذا الخادم بطريقتين:
يستمع خادم VNC إلى المنفذ 5900 ، يمكنك استخدام عميل VNC والاتصال به. لا تتردد في تعيين المنفذ 5900 لأي منفذ خارجي مجاني ترغب في ذلك.
يبقى منفذ 5900 الداخلي كما هو لأن هذا المنفذ المكون لخادم VNC يعمل داخل الحاوية. يمكنك تجاوزه باستخدام متغير بيئة SE_VNC_PORT
في حالة رغبة في استخدام --net=host
.
فيما يلي مثال على الصور المستقلة ، ينطبق نفس المفهوم على صور العقدة.
$ docker run -d -p 4444:4444 -p 5900:5900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 5901:5900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 5902:5900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
بعد ذلك ، ستستخدم في عميل VNC الخاص بك:
إذا حصلت على مطالبة تطلب كلمة مرور ، فهي secret
. إذا كنت ترغب في تغيير هذا ، فيمكنك تعيين متغير البيئة SE_VNC_PASSWORD
.
إذا كنت ترغب في تشغيل VNC دون مصادقة كلمة المرور ، يمكنك تعيين متغير البيئة SE_VNC_NO_PASSWORD=1
.
إذا كنت ترغب في تشغيل VNC في وضع العرض فقط ، يمكنك تعيين متغير البيئة SE_VNC_VIEW_ONLY=1
.
إذا كنت ترغب في تعديل حد واصف الملف المفتوح لعملية خادم VNC ، فيمكنك تعيين متغير البيئة SE_VNC_ULIMIT=4096
.
يستخدم هذا المشروع NOVNC للسماح للمستخدمين بفحص نشاط الحاوية بصريًا مع متصفحهم. قد يكون هذا مفيدًا إذا لم تتمكن من تثبيت عميل VNC على جهازك. يتم استخدام المنفذ 7900 لبدء NOVNC ، لذلك ستحتاج إلى الاتصال بهذا المنفذ مع متصفحك.
على غرار القسم السابق ، لا تتردد في تعيين المنفذ 7900 إلى أي منفذ خارجي مجاني ترغب في ذلك. يمكنك أيضًا تجاوزه باستخدام متغير بيئة SE_NO_VNC_PORT
في حالة رغبة في استخدام --net=host
.
فيما يلي مثال على الصور المستقلة ، ينطبق نفس المفهوم على صور العقدة.
$ docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 7901:7900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 7902:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
ثم ، ستستخدم في متصفحك:
إذا حصلت على مطالبة تطلب كلمة مرور ، فهي secret
.
إذا كنت تعمل على انخفاض في الموارد ، أو ببساطة لا تحتاج إلى فحص جلسات الجري ، فمن الممكن عدم تشغيل VNC على الإطلاق. فقط قم بتعيين SE_START_VNC=false
على بدء الشبكة.
من أجل تمكين التتبع في حاوية شبكة السيلينيوم ، يمكن تنفيذ الأوامر التالية:
docker network create grid
docker run -d -p 16686:16686 -p 4317:4317 --net grid --name jaeger jaegertracing/all-in-one:1.54
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
يمكنك أيضًا الرجوع إلى ملفات Docker أدناه لتتمكن من بدء شبكة بسيطة (أو) شبكة ديناميكية.
يمكنك عرض واجهة المستخدم Jaeger وتتبع طلبك.
بشكل افتراضي ، يتم تمكين التتبع في مكونات الشبكة. بدون نقطة نهاية المصدر التتبع ، سوف يبحث عن مثيل محلي على سبيل المثال localhost/[0:0:0:0:0:0:0:1]:4117
. في سجلات الحاويات ، يمكنك رؤية خطوط قليلة مثل:
ERROR (ThrottlingLogger.dolog) Failed to export spans.
The request could not be executed. Error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4117
java.net.ConnectException: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:297)
at okhttp3.internal.connection. ExchangeFinder.findConnection (Exchangefinder.kt: 226)
at okhttp3.internal.connection.okhttps.internal.connection.RealConnection.connect(RealConnection.kt:207)
في هذه الحالة ، ما عليك سوى تعيين SE_ENABLE_TRACING=false
لجميع حاوية المكونات لتعطيل التتبع (يقوم كل مكون بتصدير آثاره الخاصة).
يتم إرسال جميع الإخراج إلى stdout ، بحيث يمكن تفتيشها عن طريق التشغيل:
$ docker logs -f < container-id | container-name >
يمكنك زيادة إخراج السجل عن طريق تمرير متغير البيئة إلى الحاويات:
SE_OPTS="--log-level FINE"
--shm-size="2g"
لماذا- --shm-size 2g
ضروري؟
يعد هذا حلًا معروفًا لتجنب تصادم المتصفح داخل حاوية Docker ، فإليك المشكلات الموثقة لـ Chrome و Firefox. حجم SHM البالغ 2 جيجابايت تعسفي ولكنه معروف أنه يعمل بشكل جيد ، فقد تحتاج حالة الاستخدام المحددة إلى قيمة مختلفة ، يوصى بضبط هذه القيمة وفقًا لاحتياجاتك.
إذا رأيت استثناءات السيلينيوم التالية:
Message: invalid argument: can't kill an exited process
أو
Message: unknown error: Chrome failed to start: exited abnormally
أو
[DriverServiceSessionFactory.apply] - Error while creating session with the driver service. Stopping driver service: java.util.concurrent.TimeoutException
قد يكون السبب هو أنك قمت بتعيين متغير بيئة SE_START_XVFB
إلى false
، ولكن نسيت تشغيل Firefox أو Chrome أو Edge في الوضع بدون مقطوعة الرأس.
يقوم السيناريو الشائع بتثبيت وحدة تخزين إلى حاوية المتصفح من أجل استرداد الملفات التي تم تنزيلها. هذا يعمل بشكل جيد في Windows و MacOS ولكن ليس بدون حلول في Linux. لمزيد من التفاصيل ، تحقق من هذه المشكلة الموثقة جيدًا.
على سبيل المثال ، أثناء استخدام Linux ، قد تبدأ حاوية بالطريقة التالية:
docker run -d -p 4444:4444 --shm-size= " 2g "
-v /home/ubuntu/files:/home/seluser/Downloads
selenium/standalone-chrome:4.26.0-20241101
سيؤدي ذلك إلى تثبيت دليل المضيف /home/ubuntu/files
إلى /home/seluser/Downloads
داخل الحاوية (دليل تنزيل المتصفح الافتراضي). تحدث المشكلة لأنه سيتم تركيب مستوى الصوت root
؛ لذلك ، لا يمكن للمتصفح كتابة ملف إلى هذا الدليل لأنه يعمل تحت seluser
المستخدم. يحدث هذا لأن هذه هي الطريقة التي يتصاعد بها Docker في Linux ، ومزيد من التفاصيل في هذه المشكلة.
يتمثل الحل البديل في ذلك في إنشاء دليل على المضيف وتغيير أذوناته قبل تركيب المجلد . اعتمادًا على أذونات المستخدم ، قد تحتاج إلى استخدام sudo
لبعض هذه الأوامر:
mkdir /home/ubuntu/files
chown 1200:1201 /home/ubuntu/files
بعد القيام بذلك ، يجب أن تكون قادرًا على تنزيل الملفات على الدليل المثبت. إذا كان لديك حل أفضل ، فيرجى إرسال طلب سحب لنا!
على غرار أحجام التثبيت لاسترداد الملفات التي تم تنزيلها. بالنسبة لملفات الفيديو ، قد تحتاج إلى فعل الشيء نفسه
mkdir /tmp/videos
chown 1200:1201 /tmp/videos