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.