Có thể chạy trình điều khiển web selen (Firefox) mà không cần GUI không?


113

Chúng tôi đang xem xét nâng cấp máy chủ sản xuất của mình từ Ubuntu- desktop 10.04 lên Ubuntu- server 12.04.

Chúng tôi có nhiều dịch vụ khác nhau đang chạy trên hệ điều hành máy tính để bàn hiện tại, chẳng hạn như Selenium Web Driver. Câu hỏi của tôi là Trình điều khiển Web Selenium có thể chạy từ một hệ thống dựa trên cli không?

Suy nghĩ ngay lập tức của tôi là nó không thể, bởi vì nó dựa trên Firefox, nhưng tôi muốn ai đó chứng minh tôi sai!


Câu trả lời:


102

Những gì bạn đang tìm kiếm là một .

Có, có thể chạy Selenium trên Firefox một cách dễ dàng. Đây là một bài viết bạn có thể theo dõi.

Đây là các bước tóm tắt để thiết lập 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
Điều này hoạt động và hỗ trợ ảnh chụp màn hình. Tôi sử dụng cái này. Nó cũng hoạt động với google chrome.
Isaac

Tôi không nghĩ rằng việc này nữa (ít nhất là không dễ dàng, bởi vì nó đòi hỏi một geckodriver mới giống như chrome đã làm)
Archimedes Trajano

1
@ArchimedesTrajano Điều này vẫn hoạt động. Các hướng dẫn là để tạo màn hình ảo bằng cách sử dụng Xvfb, không phải để cài đặt và cấu hình Selenium (yêu cầu phải có geckodrivertrên đường dẫn).
expz

2
Tôi thích làm điều này từ bên trong Python, bạn có thể thực hiện với subprocess.Popen('Xvfb...')hoặc os.system('Xvfb...'), nhưng hãy đảm bảo làm điều đó trước khi nhập webdriver.
wordsforthewise

4
liên kết đó bây giờ đã bị hỏng
oldboy

22

Chrome hiện có chế độ không đầu:

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

4
PhantomJS hiện không được phát triển tích cực. Kho lưu trữ Git được lưu trữ.
Wojciech Jakubas

1
Selenium cũng ngừng hỗ trợ PhantomJS với thông báo sau "Cảnh báo người dùng: Hỗ trợ Selenium cho PhantomJS đã bị mất, thay vào đó hãy sử dụng phiên bản không có đầu của Chrome hoặc Firefox"
Jörg

11

Đúng. Bạn có thể sử dụng HTMLUnitDriverthay thế FirefoxDrivertrong khi khởi động webdriver. Đây là thiết lập trình duyệt không có đầu. Thông tin chi tiết có thể xem tại đây .


1
Điều này có hỗ trợ các chức năng như save_screenshot () không? coreygoldberg.blogspot.co.uk/2011/06/…
nonshatter

Bạn chưa thử, nhưng có thể là do bạn vẫn đang tạo một giao diện người dùng một cách hiệu quả, nhưng hiển thị giao diện người dùng trên cửa sổ 'ảo'.
grahaminn

2
HTMLUnitDriver sẽ KHÔNG hỗ trợ chụp ảnh màn hình vì nội dung hoàn toàn không được hiển thị (Vấn đề 1361). Một giải pháp thay thế mà tôi có thể nghĩ đến là sử dụng getHTMLSource và hiển thị trang HTML thay vì ảnh chụp màn hình.
AJ

10

Nếu bạn muốn hỗ trợ trình duyệt không đầu thì có một cách tiếp cận khác mà bạn có thể áp dụng.

https://github.com/detro/ghostdriver

Nó đã được công bố trong Hội nghị Selenium và nó vẫn đang được phát triển. Nó sử dụng PhantomJS làm trình duyệt và tốt hơn nhiều so với HTMLUnitDriver, hiện vẫn chưa có ảnh chụp màn hình nhưng vì nó vẫn đang được phát triển tích cực.


4

Tùy chọn là sử dụng pyvirtualdisplaynhư thế này:

from pyvirtualdisplay import Display

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

#do selenium job here

display.close()

Một phiên bản ngắn hơn là:

with Display() as display:
    # selenium job here

Điều này nói chung là một con trăn bao bọc xvfb, và bằng cách nào đó tốt hơn.

Nhân tiện, mặc dù PhantomJSlà một trình duyệt không có đầu và không có cửa sổ nào sẽ mở nếu bạn sử dụng nó, nhưng có vẻ như nó PhantomJSvẫn cần một môi trường gui để hoạt động.

Tôi nhận được Mã lỗi -6 khi tôi sử dụng PhantomJS()thay vì Firefox()ở chế độ không đầu (bảng điều khiển được kết nối với putty). Tuy nhiên mọi thứ đều ổn trong môi trường máy tính để bàn.


3

CẬP NHẬT: Bạn không cần XVFB để chạy Firefox không đầu nữa. Firefox v55 + trên Linux và Firefox v56 + trên Windows / Mac hiện hỗ trợ thực thi không cần đầu.

Tôi đã thêm một số tài liệu hướng dẫn sử dụng tại đây:

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


1
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Bhargav Rao

Điều này không hiệu quả với tôi. Tôi không chắc, nhưng tôi nghĩ XVFB vẫn được yêu cầu.
Max Malysh

Tôi đã sử dụng các trình duyệt không có đầu trên Firefox và Chrome trong vài năm nay. Giao diện WebDriver cho Selenium thậm chí còn hỗ trợ tham số setHeadless ngay bây giờ.
Nicholas DiPiazza


1

Cần biết rằng webclient HtmlUnitDriver là một luồng và Ghostdriver chỉ có 40% các chức năng để trở thành một WebDriver.

Tuy nhiên, Ghostdriver chạy đúng cách để kiểm tra và tôi gặp sự cố khi kết nối nó với trung tâm WebDriver.


Điều này có cung cấp bất kỳ thông tin mới nào mà các câu trả lời khác không?
Austin Henley

0

Có, bạn có thể chạy các tập lệnh thử nghiệm mà không cần trình duyệt, nhưng bạn nên chạy chúng ở chế độ không sử dụng.


0

có thể bạn cần đặt thứ nguyên kích thước cửa sổ của mình. giống như:

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')

nếu cũng không hoạt động, hãy thử tăng thứ nguyên kích thước cửa sổ.


0

Cài đặt và chạy Firefox được chứa trong vùng:

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

Kết nối bằng webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.