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ę!

nonshatter
źródło

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
grahaminn
źródło
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)
Stéphane Bruckert
źródło
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 .

AJ
źródło
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.

haroonzone
źródło
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.

郑文勋
źródło
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

Nicholas DiPiazza
źródło
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.

guillemhs
źródło
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.

Vinee-the-Pooh
źródło
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.

U2647
źródło
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')
Max Malysh
źródło