เป็นไปได้หรือไม่ที่จะเรียกใช้โปรแกรมควบคุมเว็บซีลีเนียม (Firefox) โดยไม่ใช้ GUI


113

เรากำลังพิจารณาอัปเกรดเซิร์ฟเวอร์การผลิตของเราจาก Ubuntu- เดสก์ท็อป 10.04 เป็น Ubuntu- เซิร์ฟเวอร์ 12.04

เรามีบริการต่างๆที่ทำงานบนระบบปฏิบัติการเดสก์ท็อปปัจจุบันของเราเช่น Selenium Web Driver คำถามของฉันคือ Selenium Web Driver สามารถเรียกใช้จากระบบที่ใช้ cli ได้หรือไม่?

ความคิดทันทีของฉันคือมันทำไม่ได้เพราะมันขึ้นอยู่กับ Firefox แต่ฉันต้องการให้ใครสักคนพิสูจน์ว่าฉันคิดผิด!


ที่เกี่ยวข้อง: ใช้งาน Headless Selenium ด้วย Chrome
jfs

คำตอบ:


102

สิ่งที่คุณกำลังมองหาคือไฟล์ .

ใช่มันเป็นไปได้ที่จะเรียกใช้ Selenium บน Firefox โดยไม่สนใจ นี่คือโพสต์ที่คุณสามารถติดตามได้

นี่คือขั้นตอนสรุปในการตั้งค่า Xvfb

#install Xvfb
sudo apt-get install xvfb

#set display number to :99
Xvfb :99 -ac &
export DISPLAY=:99    

#you are now having an X display by Xvfb

5
ใช้งานได้และรองรับภาพหน้าจอ ฉันใช้สิ่งนี้ นอกจากนี้ยังใช้งานได้กับ Google Chrome
Isaac

ฉันไม่คิดว่ามันจะได้ผลอีกต่อไป (อย่างน้อยก็ไม่ใช่เรื่องง่ายเพราะมันต้องใช้ geckodriver ใหม่เหมือนกับที่โครเมี่ยมทำ)
Archimedes Trajano

1
@ArchimedesTrajano นี่ยังใช้งานได้ คำแนะนำสำหรับการสร้างจอแสดงผลเสมือนโดยใช้Xvfbไม่ใช่สำหรับการติดตั้งและกำหนดค่า Selenium (ซึ่งจำเป็นต้องมีgeckodriverบนเส้นทาง)
expz

2
ฉันชอบทำสิ่งนี้จากภายใน Python ซึ่งคุณสามารถทำได้ด้วยsubprocess.Popen('Xvfb...')หรือos.system('Xvfb...')แต่อย่าลืมทำก่อนนำเข้า webdriver
พรุ่งนี้

4
ลิงค์นั้นเสียแล้ว
oldboy

22

ตอนนี้ Chrome มีโหมด headless:

op = webdriver.ChromeOptions()
op.add_argument('headless')
driver = webdriver.Chrome(options=op)

4
PhantomJS ไม่ได้อยู่ในระหว่างการพัฒนา ที่เก็บ Git ถูกเก็บถาวร
Wojciech Jakubas

1
ซีลีเนียมยังหยุดการสนับสนุน PhantomJS กับข้อความต่อไปนี้ "UserWarning สนับสนุนซีลีเนียมสำหรับ PhantomJS ได้รับการตัดค่าเสื่อมราคากรุณาใช้หัวขาดรุ่นของ Chrome หรือ Firefox แทน"
Jörg

11

ใช่. คุณสามารถใช้HTMLUnitDriverแทนได้FirefoxDriverในขณะที่เริ่ม webdriver นี่คือการตั้งค่าเบราว์เซอร์ที่ไม่มีหัว รายละเอียดสามารถพบได้ที่นี่


1
สิ่งนี้รองรับฟังก์ชันเช่น save_sc screenshot () หรือไม่ coreygoldberg.blogspot.co.uk/2011/06/...
nonshatter

ยังไม่ได้ลอง แต่อาจเป็นไปได้เพราะคุณยังสร้าง UI ได้อย่างมีประสิทธิภาพ แต่แสดงบนหน้าต่าง 'เสมือน'
grahaminn

2
HTMLUnitDriver จะไม่รองรับการจับภาพหน้าจอเนื่องจากไม่มีการแสดงเนื้อหาเลย (ฉบับที่ 1361) อีกทางเลือกหนึ่งที่ฉันคิดได้คือใช้ getHTMLSource และแสดงหน้า HTML แทนภาพหน้าจอ
AJ

10

หากคุณต้องการการสนับสนุนเบราว์เซอร์ที่ไม่มีหัวมีอีกวิธีหนึ่งที่คุณอาจนำมาใช้

https://github.com/detro/ghostdriver

มีการประกาศในระหว่างการประชุม Selenium และยังอยู่ในระหว่างการพัฒนา มันใช้ PhantomJS เป็นเบราว์เซอร์และดีกว่า HTMLUnitDriver มากยังไม่มีภาพหน้าจอ แต่เนื่องจากยังอยู่ในระหว่างการพัฒนา


4

ทางเลือกคือการใช้pyvirtualdisplayดังนี้:

from pyvirtualdisplay import Display

display = Display(visible=0, size=[800, 600])
display.start()

#do selenium job here

display.close()

เวอร์ชันที่สั้นกว่าคือ:

with Display() as display:
    # selenium job here

โดยทั่วไปเป็นงูหลามที่ห่อหุ้มxvfbและมีความน่าเชื่อถือมากกว่า

อย่างไรก็ตามแม้ว่าPhantomJSจะเป็นเบราว์เซอร์ที่ไม่มีหัวและจะไม่มีหน้าต่างใดเปิดขึ้นหากคุณใช้งาน แต่ดูเหมือนว่าPhantomJSยังต้องการสภาพแวดล้อมแบบ gui ในการทำงาน

ฉันได้รับรหัสข้อผิดพลาด -6 เมื่อใช้PhantomJS()แทนFirefox()ในโหมด headless (คอนโซลที่เชื่อมต่อกับผงสำหรับอุดรู) อย่างไรก็ตามทุกอย่างก็โอเคในสภาพแวดล้อมเดสก์ท็อป


3

UPDATE: คุณไม่จำเป็นต้องใช้ XVFB เพื่อเรียกใช้ Firefox แบบไร้หัวอีกต่อไป Firefox v55 + บน Linux และ Firefox v56 + บน Windows / Mac รองรับการทำงานแบบไร้หัวแล้ว

ฉันได้เพิ่มเอกสารวิธีการใช้งานที่นี่:

https://developer.mozilla.org/en-US/Firefox/Headless_mode#Selenium_in_Java


1
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Bhargav Rao

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันไม่แน่ใจ แต่ฉันคิดว่ายังต้องใช้ XVFB
Max Malysh

ฉันใช้เบราว์เซอร์ headless บน Firefox และ Chrome มาหลายปีแล้ว อินเทอร์เฟซ WebDriver สำหรับ Selenium ยังสนับสนุนพารามิเตอร์ setHeadless ในขณะนี้
Nicholas DiPiazza


1

โปรดทราบว่าเว็บไคลเอ็นต์ HtmlUnitDriver เป็นเธรดเดียวและ Ghostdriver มีฟังก์ชันเพียง 40% เท่านั้นที่จะเป็น WebDriver

อย่างไรก็ตาม Ghostdriver ทำงานอย่างถูกต้องสำหรับการทดสอบและฉันมีปัญหาในการเชื่อมต่อกับฮับ WebDriver


สิ่งนี้ให้ข้อมูลใหม่ที่คำตอบอื่นไม่มีหรือไม่?
Austin Henley

0

ใช่คุณสามารถเรียกใช้สคริปต์ทดสอบได้โดยไม่ต้องใช้เบราว์เซอร์ แต่คุณควรเรียกใช้ในโหมดโง่


0

บางทีคุณอาจต้องตั้งค่ามิติข้อมูลขนาดหน้าต่าง เหมือนกับ:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920x1080');

browser = webdriver.Chrome(options=options,executable_path = './chromedriver')

หากยังไม่ได้ผลให้ลองเพิ่มมิติข้อมูลขนาดหน้าต่าง


0

ติดตั้งและเรียกใช้ Firefox ที่มีคอนเทนเนอร์:

docker pull selenium/standalone-firefox
docker run --rm -d -p 4444:4444 --shm-size=2g selenium/standalone-firefox

เชื่อมต่อโดยใช้webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.