โครงการนี้เกิดขึ้นได้โดยอาสาสมัครอาสาสมัครที่สละเวลาหลายพันชั่วโมง และทำให้ซอร์สโค้ดใช้งานได้ฟรีภายใต้ Apache License 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
เพื่อใช้หน่วยความจำที่แชร์ของโฮสต์
JP ควรใช้อิมเมจ Docker พร้อมแท็กแบบเต็มเสมอเพื่อปักหมุดเบราว์เซอร์และเวอร์ชันกริดที่ต้องการ ดูข้อตกลงการแท็กเพื่อดูรายละเอียด
ตั้งแต่แท็กรูปภาพที่ใช้ 4.21.0
เป็นต้นไป สถาปัตยกรรมที่โปรเจ็กต์นี้รองรับมีดังนี้:
สถาปัตยกรรม | มีอยู่ |
---|---|
x86_64 (หรือที่เรียกว่า amd64) | |
aarch64 (หรือที่เรียกว่า arm64/armv8) | |
armhf (หรือที่เรียกว่า arm32/armv7l) |
เบราว์เซอร์ต่อไปนี้มีอยู่ในรูปภาพหลายส่วน:
สถาปัตยกรรม | โครเมียม | โครเมียม | ไฟร์ฟอกซ์ | ขอบ |
---|---|---|---|---|
x86_64 (หรือที่เรียกว่า amd64) | ||||
aarch64 (หรือที่เรียกว่า arm64/armv8) | ||||
armhf (หรือที่เรียกว่า 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 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับภาพเหล่านี้
ตอนนี้ fork 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 ที่สร้างบนโปรเจ็กต์อัปสตรีม Selenium พร้อมการเปลี่ยนแปลงล่าสุดในสาขาหลักในพื้นที่เก็บข้อมูลนี้ แท็กรูปภาพคือ nightly
ไม่แนะนำให้ใช้รูปภาพในการผลิต มันมีไว้สำหรับการทดสอบเท่านั้น
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:nightly
ลองใช้งาน docker compose เพื่อเริ่มต้นใช้งาน Nightly image docker-compose-v3-full-grid-nightly.yml
ในการทำการทดสอบหรือทำงานร่วมกับเบราว์เซอร์รุ่นก่อนเผยแพร่ Google, Mozilla และ Microsoft จะคงช่องทางการเผยแพร่เวอร์ชัน Dev และ Beta สำหรับผู้ที่ต้องการดูว่าจะมีการเผยแพร่รายการใดบ้างในเร็วๆ นี้แก่ประชาชนทั่วไป
คำแนะนำในการรันในโหมดสแตนด์อโลนมีดังนี้:
Chrome เบต้า:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:beta
นักพัฒนา Chrome:
$ 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
นักพัฒนา Firefox:
$ 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
นักเทียบท่า-เขียน-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 "
นักเทียบท่าเขียน-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
เมื่อคุณใช้ Grid เสร็จแล้ว และออกจากคอนเทนเนอร์แล้ว เครือข่ายสามารถลบออกได้โดยใช้คำสั่งต่อไปนี้:
# Removes the grid network
$ docker network rm grid
ฮับและโหนดจะถูกสร้างขึ้นบนเครื่อง/VM ที่แตกต่างกัน โดยจำเป็นต้องรู้ IP ของกันและกันเพื่อสื่อสารได้อย่างถูกต้อง หากมีมากกว่าหนึ่งโหนดที่ทำงานบนเครื่อง/VM เดียวกัน จะต้องกำหนดค่าให้แสดงพอร์ตที่แตกต่างกัน
$ 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 เป็นวิธีที่ง่ายที่สุดในการเริ่ม Grid ใช้แหล่งข้อมูลที่ลิงก์ด้านล่าง บันทึกไว้ในเครื่อง และตรวจสอบคำแนะนำการดำเนินการที่ด้านบนของแต่ละไฟล์
docker-compose-v2.yml
docker-compose-v3.yml
หากต้องการหยุด Grid และล้างคอนเทนเนอร์ที่สร้างขึ้น ให้เรียกใช้ docker compose down
docker-compose-v3-swarm.yml
คุณสามารถเริ่ม Selenium Grid โดยแยกส่วนประกอบทั้งหมดออกจากกัน เพื่อความง่าย เราจะจัดเตรียมเฉพาะตัวอย่างที่มีการเขียนนักเทียบท่าเท่านั้น บันทึกไฟล์ในเครื่อง และตรวจสอบคำแนะนำการดำเนินการที่อยู่ด้านบนสุด
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
ก็ตาม) เรากำลังทำซ้ำกระบวนการนี้ และการตั้งค่านี้อาจง่ายขึ้นในอนาคต
อิมเมจวิดีโอ 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
ขึ้นอยู่กับการสนับสนุนของ Metadata ในการทดสอบ เมื่อเครื่องบันทึกวิดีโอถูกใช้งานไซด์คาร์กับโหนดเบราว์เซอร์โดยเปิดใช้งาน SE_VIDEO_FILE_NAME=auto
และเพิ่มข้อมูลเมตาให้กับการทดสอบของคุณ ชื่อไฟล์วิดีโอจะดึงค่าของความสามารถ se:name
และใช้เป็นชื่อไฟล์วิดีโอ
ตัวอย่างเช่นในการผูก Python:
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
วรรคจะถูกแทนที่ด้วย _
และมีเพียงอักขระตัวอักษร ตัวเลข -
(ยัติภังค์) _
(ขีดล่าง) เท่านั้นที่จะยังคงอยู่ในชื่อไฟล์
คุณสามารถปรับแต่ง Trim regex ได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม SE_VIDEO_FILE_NAME_TRIM_REGEX
ค่าเริ่มต้นคือ [:alnum:]-_
regex ควรเข้ากันได้กับคำสั่ง tr
ใน bash
ที่ระดับการใช้งาน คอนเทนเนอร์ตัวบันทึกจะทำงานอยู่เสมอ นอกจากนี้ คุณยังสามารถปิดใช้งานกระบวนการบันทึกวิดีโอผ่านความสามารถเซสชัน se:recordVideo
ตัวอย่างเช่นในการผูก Python:
options . set_capability ( 'se:recordVideo' , False )
ในคอนเทนเนอร์ตัวบันทึกจะดำเนินการค้นหา GraphQL ใน Hub ตาม Node SessionId และแยกค่าของ se:recordVideo
ในความสามารถก่อนที่จะตัดสินใจเริ่มกระบวนการบันทึกวิดีโอหรือไม่
หมายเหตุ: หากต้องการเข้าถึงตำแหน่งข้อมูล GraphQL คอนเทนเนอร์ตัวบันทึกจำเป็นต้องทราบ Hub URL Hub URL สามารถส่งผ่านตัวแปรสภาพแวดล้อม 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 ที่เป็นตัวเลือก) เพื่อรับ ID เซสชันและความสามารถ
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 ได้ที่นี่ เมื่อใช้ใน Dynamic Grid ตัวแปรเหล่านั้นควรรวมกับคำนำหน้า SE_
เช่น SE_RCLONE_
ดูข้อมูลอ้างอิงด้านล่างสำหรับรายละเอียดเพิ่มเติม
กำหนดค่าการบันทึกวิดีโอและการอัพโหลดสำหรับ Hub และ Nodes: 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): tests/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 ใดเมื่อคอนเทนเนอร์เริ่มต้น นอกจากนี้ Grid จำเป็นต้องทราบ URI ของ Docker daemon การกำหนดค่านี้สามารถวางไว้ในไฟล์ 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
คอนเทนเนอร์ node-docker
ในกรณีที่คุณต้องการเข้าถึงไดเรกทอรีดาวน์โหลดในคอนเทนเนอร์ของเบราว์เซอร์โหนด (เช่น /home/seluser/Downloads
) ผ่านการกำหนดค่าวอลุ่มของคอนเทนเนอร์ Dynamic Grid คุณสามารถเพิ่มการกำหนดค่าต่อไปนี้ลงในไฟล์ 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
เมื่อคุณใช้ Grid เสร็จแล้ว และออกจากคอนเทนเนอร์แล้ว เครือข่ายสามารถลบออกได้โดยใช้คำสั่งต่อไปนี้:
# 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
นี่คือตัวอย่างการใช้ฮับและโหนด:
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
เพื่อเปลี่ยนชื่อไฟล์วิดีโอเอาต์พุตแบบไดนามิกได้ ตัวอย่างเช่นในการผูก Python:
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
จะถูกแทนที่ด้วย _
และมีเพียงอักขระตัวอักษร ตัวเลข -
(ยัติภังค์) และ _
(ขีดล่าง) เท่านั้นที่จะยังคงอยู่ในชื่อไฟล์ (ความสำเร็จนี้จะใช้ได้เมื่อรวม PR นี้เข้าด้วยกัน)
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 readme
คุณสามารถส่งผ่านตัวแปร 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" )
คุณยังสามารถบังคับใช้อาร์กิวเมนต์ได้โดยตรงจากตัวแปรสภาพแวดล้อมคอนเทนเนอร์ (โหนด สแตนด์อโลน หรือ node-docker) กำหนดตัวแปรสภาพแวดล้อมด้วยชื่อที่ขึ้นต้นด้วย SE_BROWSER_ARGS_
และตามด้วยคีย์ config ขึ้นอยู่กับคุณ (ตรวจสอบให้แน่ใจว่าตัวแปรเหล่านั้นไม่ซ้ำกันเมื่อคุณกำหนดอาร์กิวเมนต์หลายรายการ) ตัวอย่างเช่น:
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
แสดงรายการอาร์กิวเมนต์บรรทัดคำสั่งของ Chromium สำหรับการอ้างอิงของคุณ
หมายเหตุ: ปัจจุบันสิ่งนี้ใช้ได้กับเบราว์เซอร์โหนด Chrome/Chromium, Edge
โหนดจะลงทะเบียนตัวเองผ่าน Event Bus เมื่อกริดเริ่มต้นในการตั้งค่าฮับ/โหนดทั่วไป ฮับจะทำหน้าที่เป็นบัสเหตุการณ์ และเมื่อกริดเริ่มต้นด้วยองค์ประกอบทั้งห้าแยกจากกัน บัสเหตุการณ์จะทำงานด้วยตัวมันเอง
ในทั้งสองกรณี จำเป็นต้องบอก Node ว่า Event Bus อยู่ที่ไหน เพื่อให้สามารถลงทะเบียนได้เอง นั่นคือจุดประสงค์ของตัวแปรสภาพแวดล้อม 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 กับ Selenium Grid จะมีประโยชน์ ตัวอย่างของบริการดังกล่าวอาจเป็นผู้ให้บริการระบบคลาวด์หรือเซิร์ฟเวอร์ Appium ด้วยวิธีนี้ Grid จึงสามารถเพิ่มความครอบคลุมให้กับแพลตฟอร์มและเวอร์ชันที่ไม่มีอยู่ในเครื่องได้มากขึ้น
ต่อไปนี้เป็นตัวอย่างคำสั่งรีเลย์การกำหนดค่า
นักเทียบท่าเขียน-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
ตามค่าเริ่มต้น Selenium สามารถเข้าถึงได้ที่ http://127.0.0.1:4444/
ซีลีเนียมสามารถกำหนดค่าให้ใช้เส้นทางย่อยที่กำหนดเองได้โดยการระบุตัวแปรสภาพแวดล้อม SE_SUB_PATH
ในตัวอย่างด้านล่าง Selenium สามารถเข้าถึงได้ที่ 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 x 1080 โดยมีความลึกของสี 24 บิตและ dpi ที่ 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
ในบางกรณี คุณอาจต้องตั้งค่า Grid 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
และช่วงเวลาการลองใหม่ 2 วินาทีจะเป็น SE_SESSION_RETRY_INTERVAL=2
ตามค่าเริ่มต้น จะมีการกำหนดค่าเพียงเซสชันเดียวเท่านั้นให้ทำงานต่อคอนเทนเนอร์ผ่านตัวแปรสภาพแวดล้อม SE_NODE_MAX_SESSIONS
เป็นไปได้ที่จะเพิ่มจำนวนดังกล่าวจนถึงจำนวนโปรเซสเซอร์สูงสุดที่มีอยู่ เนื่องจากมีเสถียรภาพมากขึ้นเมื่อคอนเทนเนอร์/เบราว์เซอร์ตัวหนึ่งมี 1 CPU ในการทำงาน
อย่างไรก็ตาม หากคุณได้วัดประสิทธิภาพแล้ว และเมื่อพิจารณาจากสิ่งนั้นแล้ว คุณคิดว่าสามารถดำเนินการเซสชันได้มากขึ้นในแต่ละคอนเทนเนอร์ คุณสามารถแทนที่ขีดจำกัดสูงสุดได้โดยการตั้งค่าทั้ง SE_NODE_MAX_SESSIONS
เป็นหมายเลขที่ต้องการ และ SE_NODE_OVERRIDE_MAX_SESSIONS
เป็น true
อย่างไรก็ตาม ไม่แนะนำให้ใช้งานเซสชันเบราว์เซอร์มากกว่าโปรเซสเซอร์ที่มีอยู่ เนื่องจากคุณจะใช้ทรัพยากรมากเกินไป
การเอาชนะการตั้งค่านี้ทำให้เกิดผลข้างเคียงที่ไม่พึงประสงค์เมื่อเปิดใช้งานการบันทึกวิดีโอ เนื่องจากอาจมีการบันทึกเซสชันของเบราว์เซอร์มากกว่าหนึ่งเซสชันในวิดีโอเดียวกัน
Firefox, Chrome, เมื่อใช้โหมด headless ไม่จำเป็นต้องเริ่มต้นเซิร์ฟเวอร์ 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 จะมีประโยชน์ในการปิดโหนดหรือคอนเทนเนอร์แบบสแตนด์อโลนหลังจากดำเนินการทดสอบ 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) เพื่อหลีกเลี่ยงการเติมทรัพยากรเหล่านี้ เช่น ID กระบวนการและการใช้งานระบบไฟล์ในคอนเทนเนอร์ จะมีสคริปต์การล้างข้อมูลอัตโนมัติที่ทำงานทุกชั่วโมงในคอนเทนเนอร์โหนด วิธีนี้จะล้างกระบวนการเก่าและไฟล์ชั่วคราวเก่า โดยค่าเริ่มต้น สิ่งนี้จะถูกปิดใช้งาน เมื่อเปิดใช้งาน จะล้างเบราว์เซอร์ที่ทำงานนานกว่า 2 ชั่วโมง และไฟล์ที่เก่ากว่า 1 วัน สิ่งเหล่านี้สามารถเปิดใช้งานและปรับแต่งด้วยตัวแปรสภาพแวดล้อมต่อไปนี้:
SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
: ค่าเริ่มต้น false
ตั้งค่าเป็น true
เพื่อเปิดใช้งานการล้างข้อมูลSE_BROWSER_LEFTOVERS_INTERVAL_SECS
: ค่าเริ่มต้น 3600
(1 ชั่วโมง) ช่วงเวลาการล้างข้อมูลเป็นวินาทีSE_BROWSER_LEFTOVERS_PROCESSES_SECS
: ค่าเริ่มต้น 7200
(2 ชั่วโมง) เบราว์เซอร์ที่ทำงานนานกว่าเวลานี้จะถูกปิดSE_BROWSER_LEFTOVERS_TEMPFILES_DAYS
: ค่าเริ่มต้น 1
(1 วัน) ไฟล์ที่สร้างโดยเบราว์เซอร์ที่ใช้ Chrome ใน /tmp
จะถูกลบออกหลังจากจำนวนวันเหล่านี้ (จะไม่สนใจเมื่อใช้ Firefox) หากคุณใช้ Selenium สำหรับเซสชันที่ใช้เวลานานและคาดว่าเบราว์เซอร์จะทำงานนานกว่า 2 ชั่วโมง อย่าตั้งค่า 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
ด้วยคำสั่งก่อนหน้านี้ การล้างข้อมูลจะถูกเปิดใช้งาน แต่จะทำงานทุกๆ 2 ชั่วโมง (แทนที่จะเป็น 1 ชั่วโมง) จะฆ่าเบราว์เซอร์ที่ทำงานนานกว่า 1 ชั่วโมง (แทนที่จะเป็น 2 ชั่วโมง) และจะลบไฟล์ชั่วคราวที่เก่ากว่า 2 วัน (แทน 1)
เอาต์พุตตัวแปรบางตัว เช่น รหัสผ่าน ข้อมูลลับ ฯลฯ จะถูกปกปิดในบันทึกของคอนโซล เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่อง คุณสามารถปิดใช้งานได้โดยตั้งค่า SE_MASK_SECRETS
เป็น false
ขณะสร้างสคริปต์ทุบตี คุณสามารถปกปิดเอาต์พุตได้โดยใช้ไวยากรณ์ echo "Current value is $(mask ${YOUR_VARIABLE})
ค่าเริ่มต้น SE_MASK_SECRETS_MIN_LENGTH
คือ 3
หมายความว่าสตริงที่ยาวจะถูกมาสก์เป็น ***
เพื่อหลีกเลี่ยงการเปิดเผยความยาวสำหรับการโจมตีแบบเดรัจฉาน
ตามค่าเริ่มต้น จะมีใบรับรองที่ลงนามด้วยตนเองเริ่มต้นอยู่ในรูปภาพในตำแหน่ง /opt/selenium/secrets
include
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 | เจวีเอ็ม | |
SE_JAVA_SSL_TRUST_STORE_PASSWORD | /opt/selenium/secrets/server.pass | เจวีเอ็ม | |
SE_JAVA_DISABLE_HOSTNAME_VERIFICATION | true | เจวีเอ็ม | ปิดใช้การตรวจสอบโฮสต์สำหรับส่วนประกอบภายใน |
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 จากการเชื่อมโยง นอกจากนี้ จำเป็นต้องติดตั้งชุดภาษาเป็นส่วนเสริมเพื่อให้ภาษา UI ของเบราว์เซอร์มีผลใช้งาน ตัวอย่างเช่น หากต้องการตั้งค่าภาษาและโลแคลของเบราว์เซอร์เป็น 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 | supervisord.loglevel |
SE_SUPERVISORD_CHILD_LOG_DIR | /tmp | supervisord.childlogdir |
SE_SUPERVISORD_LOG_FILE | /tmp/supervisord.log | supervisord.logfile |
SE_SUPERVISORD_PID_FILE | /tmp/supervisord.pid | supervisord.pidfile |
โคลน repo และจากรูทไดเร็กทอรีโปรเจ็กต์ คุณสามารถสร้างทุกอย่างได้โดยการรัน:
$ 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 ล่าสุด (โดยการโคลน repo และจากรูทไดเร็กทอรีโปรเจ็กต์) คุณสามารถสร้างอิมเมจด้วยการผสมผสานเฉพาะของ 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
หลังจากเรียกใช้สคริปต์แล้วคุณจะเห็นภาพรายการที่มีแท็กเต็มรูปแบบสำหรับ Pin Grid และเบราว์เซอร์เฉพาะ
เซิร์ฟเวอร์เซิร์ฟเวอร์เบราว์เซอร์และไดรเวอร์ติดตั้งไว้ล่วงหน้าในภาพ ในกรณีที่คุณต้องการที่จะอยู่ในรุ่นซีลีเนียมเดียวกันและเพิ่งอัพเกรดเบราว์เซอร์และไดรเวอร์เป็นรุ่นล่าสุด คุณสามารถทำตามขั้นตอนด้านล่าง
โคลน repo และจากรูทไดเรกทอรีโครงการที่คุณสามารถอัพเกรดได้ด้วยการรัน:
$ 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
ระบุว่ากริดพร้อมที่จะรับคำขอ สถานะนี้สามารถสำรวจได้ผ่านสคริปต์ก่อนที่จะทำการทดสอบใด ๆ หรือสามารถเพิ่มเป็น HealthCheck เมื่อเริ่มต้นคอนเทนเนอร์ 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 คือคอนเทนเนอร์ที่กำลังทำงานไม่ได้หมายความว่าแอปพลิเคชันภายในพร้อมเสมอไป วิธีง่ายๆในการจัดการกับสิ่งนี้คือการใช้สคริปต์ "รอ-สำหรับมัน" ข้อมูลเพิ่มเติมสามารถดูได้ที่นี่
สคริปต์ต่อไปนี้เป็นตัวอย่างของวิธีที่สามารถทำได้โดยใช้ 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
ดังนั้นคุณจึงสามารถเพิ่มใบรับรองของคุณด้วย Rootless หากคุณต้องการติดตั้งใบรับรองที่กำหนดเอง, CA, Intermediate CA หรือใบรับรองไคลเอนต์ (ตัวอย่างเช่น Enterprise Internal CA) คุณสามารถสร้างอิมเมจนักเทียบท่าของคุณเองจากภาพโหนดซีลีเนียม เบราว์เซอร์ที่ใช้โครเมียมใช้ 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
คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่
วิธีนี้จะมีการติดตั้งใบรับรองและโหนดจะเริ่มโดยอัตโนมัติเหมือนก่อน
อีกทางเลือกหนึ่งคุณสามารถเพิ่มไฟล์ใบรับรองของคุณในภาพซีลีเนียมที่มีอยู่ ตัวอย่างที่ใช้งานได้จริงนี้จะถือว่าคุณมีภาพที่รู้จักในการใช้เป็นภาพบิลด์และมีวิธีเผยแพร่ภาพใหม่ไปยังรีจิสทรีนักเทียบท่าในพื้นที่ของคุณ
ตัวอย่างนี้ใช้ distro ที่ใช้ 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
ในการเริ่มต้นกริด
เพื่อเปิดใช้งานการติดตามในคอนเทนเนอร์ Selenium Grid สามารถดำเนินการคำสั่งต่อไปนี้ได้:
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 ด้านล่างเขียนไฟล์ YAML เพื่อให้สามารถเริ่มกริดแบบง่าย (หรือ) กริดแบบไดนามิก
คุณสามารถดู Jaeger UI และติดตามคำขอของคุณ
โดยค่าเริ่มต้นการติดตามจะเปิดใช้งานในส่วนประกอบกริด หากไม่มีจุดสิ้นสุดของผู้ส่งออกติดตามมันจะค้นหาอินสแตนซ์ท้องถิ่นเช่น 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 ของ 2GB นั้นเป็นไปตามอำเภอใจ แต่เป็นที่รู้จักกันว่าทำงานได้ดีกรณีการใช้งานเฉพาะของคุณอาจต้องการค่าที่แตกต่างกันขอแนะนำให้ปรับค่านี้ตามความต้องการของคุณ
หากคุณเห็นข้อยกเว้นของซีลีเนียมต่อไปนี้:
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 ในโหมด Headless
สถานการณ์ทั่วไปคือการติดตั้งระดับเสียงไปยังคอนเทนเนอร์เบราว์เซอร์เพื่อดึงไฟล์ที่ดาวน์โหลดมา วิธีนี้ใช้งานได้ดีใน 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