Czy można uruchomić sterownik sieciowy selenium (Firefox) bez GUI?


113

Rozważamy aktualizację naszego serwera produkcyjnego z Ubuntu - desktop 10.04 do Ubuntu - serwer 12.04.

Mamy różne usługi działające w naszym obecnym systemie operacyjnym, takie jak Selenium Web Driver. Moje pytanie brzmi: czy sterownik sieciowy Selenium można uruchomić z systemu opartego na CLI?

Od razu myślę, że nie może, ponieważ opiera się na Firefoksie, ale chciałbym, żeby ktoś udowodnił mi, że się mylę!


Odpowiedzi:


102

To, czego szukasz, to plik .

Tak, możliwe jest bezgłowe uruchomienie Selenium w przeglądarce Firefox. Oto post, który możesz śledzić.

Oto podsumowanie kroków konfiguracji 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
To działa i obsługuje zrzuty ekranu. Używam tego. Działa również z Google Chrome.
Izaak

Myślę, że to już nie działa (przynajmniej niełatwo, ponieważ wymaga nowego geckodrivera, podobnie jak Chrome)
Archimedes Trajano

1
@ArchimedesTrajano To nadal działa. Wskazówki dotyczą tworzenia wirtualnego wyświetlacza przy użyciu Xvfb, a nie instalacji i konfiguracji Selenium (co wymaga posiadania geckodriverna ścieżce).
expz

2
Lubię to robić z poziomu Pythona, co możesz zrobić za pomocą subprocess.Popen('Xvfb...')lub os.system('Xvfb...'), ale pamiętaj, aby zrobić to przed zaimportowaniem webdrivera.
słowa z

4
ten link jest teraz uszkodzony
oldboy

22

Chrome ma teraz tryb bezgłowy:

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

4
PhantomJS nie jest obecnie w fazie rozwoju. Repozytorium Git zostało zarchiwizowane.
Wojciech Jakubas

1
Selenium przestało również wspierać PhantomJS z następującym komunikatem „UserWarning: wsparcie Selenium dla PhantomJS zostało zdeprecjonowane. Zamiast tego używaj bezgłowych wersji Chrome lub Firefox”
Jörg

11

Tak. Możesz użyć HTMLUnitDriverzamiast tego FirefoxDriverpodczas uruchamiania webdrivera. To jest bezgłowa konfiguracja przeglądarki. Szczegóły można znaleźć tutaj .


1
Czy to obsługiwałoby funkcje takie jak save_screenshot ()? coreygoldberg.blogspot.co.uk/2011/06/…
nonshatter

Nie próbowałem, ale może to być możliwe, ponieważ nadal tworzysz interfejs użytkownika, ale pokazujesz go w „wirtualnym” oknie.
grahaminn

2
HTMLUnitDriver NIE obsługuje przechwytywania zrzutów ekranu, ponieważ zawartość w ogóle nie jest renderowana (wydanie 1361). Alternatywą, o której przychodzi mi do głowy, jest użycie getHTMLSource i wyświetlenie strony HTML zamiast zrzutu ekranu.
AJ

10

Jeśli potrzebujesz bezgłowej obsługi przeglądarki, możesz zastosować inne podejście.

https://github.com/detro/ghostdriver

Zostało ogłoszone podczas Konferencji Selenium i nadal jest w fazie rozwoju. Używa PhantomJS jako przeglądarki i jest znacznie lepszy niż HTMLUnitDriver, nie ma jeszcze zrzutów ekranu, ale jest nadal w fazie rozwoju.


4

Opcjonalne jest użycie w pyvirtualdisplayten sposób:

from pyvirtualdisplay import Display

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

#do selenium job here

display.close()

Krótsza wersja to:

with Display() as display:
    # selenium job here

Jest to generalnie zamknięta w Pythonie xvfbi jakoś bardziej wygodna.

Nawiasem mówiąc, chociaż PhantomJSjest to przeglądarka bezgłowa i żadne okno nie będzie otwarte, jeśli z niej korzystasz, wydaje się, że PhantomJSnadal potrzebuje środowiska GUI do działania.

Otrzymałem kod błędu -6, gdy używam PhantomJS()zamiast Firefox()w trybie bezgłowym (konsola podłączona do putty). Jednak wszystko jest w porządku w środowisku graficznym.


3

AKTUALIZACJA: Nie potrzebujesz już XVFB, aby uruchomić przeglądarkę Firefox bezgłową. Firefox v55 + w systemie Linux i Firefox v56 + w systemie Windows / Mac obsługuje teraz wykonywanie bezgłowe.

Dodałem tutaj dokumentację, jak używać:

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


1
Komentarze nie służą do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Bhargav Rao

To nie zadziałało dla mnie. Nie jestem pewien, ale myślę, że XVFB jest nadal wymagane.
Max Malysh

Od kilku lat korzystam z przeglądarek bezgłowych w Firefoksie i Chrome. Interfejs WebDriver dla Selenium obsługuje teraz nawet parametr setHeadless.
Nicholas DiPiazza


1

Należy pamiętać, że klient sieciowy HtmlUnitDriver jest jednowątkowy, a Ghostdriver ma tylko 40% funkcji, aby być WebDriver.

Mimo to Ghostdriver działał poprawnie do testów i mam problemy z połączeniem go z hubem WebDriver.


Czy to dostarcza nowych informacji, których nie zawierają inne odpowiedzi?
Austin Henley,

0

Tak, możesz uruchamiać skrypty testowe bez przeglądarki, ale powinieneś uruchamiać je w trybie bezgłowym.


0

być może musisz ustawić rozmiar okna. tak jak:

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

jeśli również nie działa, spróbuj zwiększyć rozmiar okna.


0

Zainstaluj i uruchom przeglądarkę Firefox w kontenerach:

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

Połącz za pomocą webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.