Jak programowo uczynić Firefoksa bezgłowym w Selenium z Pythonem?

124

Uruchamiam ten kod z pythonem, selenem i firefoxem, ale nadal otrzymuję `` główną '' wersję programu Firefox:

binary = FirefoxBinary('C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe', log_file=sys.stdout)
binary.add_command_line_options('-headless')
self.driver = webdriver.Firefox(firefox_binary=binary)

Wypróbowałem też kilka odmian binarnych:

binary = FirefoxBinary('C:\\Program Files\\Nightly\\firefox.exe', log_file=sys.stdout)
        binary.add_command_line_options("--headless")
Tintinabulator Zea
źródło
2
Chciałem tylko dodać, że twoja wersja Firefoksa powinna być 56+, aby to zadziałało. Zajęło mi trochę czasu, zanim zrozumiałem, dlaczego którekolwiek z opublikowanych rozwiązań nie działa w moim. developer.mozilla.org/en-US/Firefox/Headless_mode
Bora Lee

Odpowiedzi:

223

Aby bezgłośnie wywołać przeglądarkę Firefox, możesz ustawić headlesswłaściwość za pomocą Options()klasy w następujący sposób:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.headless = True
driver = webdriver.Firefox(options=options, executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
driver.get("http://google.com/")
print ("Headless Firefox Initialized")
driver.quit()

Jest inny sposób na osiągnięcie trybu bezgłowego. Jeśli chcesz wyłączyć lub włączyć tryb headless w Firefoksie, bez zmiany kodu, możesz ustawić zmienną środowiskową MOZ_HEADLESSna dowolną, jeśli chcesz, aby Firefox działał bezgłowy, lub w ogóle go nie ustawiać.

Jest to bardzo przydatne, gdy korzystasz na przykład z ciągłej integracji i chcesz przeprowadzić testy funkcjonalne na serwerze, ale nadal mieć możliwość uruchamiania testów w normalnym trybie na swoim komputerze.

$ MOZ_HEADLESS=1 python manage.py test # testing example in Django with headless Firefox

lub

$ export MOZ_HEADLESS=1   # this way you only have to set it once
$ python manage.py test functional/tests/directory
$ unset MOZ_HEADLESS      # if you want to disable headless mode

Outro

Jak skonfigurować ChromeDriver, aby zainicjował przeglądarkę Chrome w trybie Headless przez Selenium?

DebanjanB
źródło
4
Ulepszony Selenium (3.14.1) i PhantomJS są teraz przestarzałe, więc żaden z moich testów nie zadziałał. Musiałem przejść na Firefoksa - w pośpiechu bez głowy. Dzięki za to wspaniałe podsumowanie
MortenB
5
MOZ_HEADLESS = 1 test Pythona manage.py załatwił sprawę! Nie ma już potrzeby prowadzenia xvfb-run (:
Nicky Kouffeld
23

Pierwsza odpowiedź już nie działa.

To zadziałało dla mnie:

from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium import webdriver

options = FirefoxOptions()
options.add_argument("--headless")
driver = webdriver.Firefox(options=options)
driver.get("http://google.com")
Philippe Delteil
źródło
Python 3.8.2 / selenium .__ version__ == '3.141.0' działa świetnie!
hirnwunde
1
dodaj from selenium import webdriverdo wywołaniawebdriver.Firefox()
Snow
2
Zaakceptowana odpowiedź nadal działa w najnowszej wersji Firefoxigeckodriver
CONvid19
2

Tylko uwaga dla osób, które mogły to znaleźć później (i chcą osiągnąć to w Javie); FirefoxOptionsjest również w stanie włączyć tryb bezgłowy:

FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setHeadless(true);
Tłuc
źródło
6
To pytanie dotyczy Pythona, a nie Javy.
Mapio
0
Used below code to set driver type based on need of Headless / Head for both Firefox and chrome:

// Can pass browser type 

if brower.lower() == 'chrome':
    driver = webdriver.Chrome('..\drivers\chromedriver')
elif brower.lower() == 'headless chrome':
    ch_Options = Options()
    ch_Options.add_argument('--headless')
    ch_Options.add_argument("--disable-gpu")
    driver = webdriver.Chrome('..\drivers\chromedriver',options=ch_Options)
elif brower.lower() == 'firefox':
    driver = webdriver.Firefox(executable_path=r'..\drivers\geckodriver.exe')
elif brower.lower() == 'headless firefox':
    ff_option = FFOption()
    ff_option.add_argument('--headless')
    ff_option.add_argument("--disable-gpu")
    driver = webdriver.Firefox(executable_path=r'..\drivers\geckodriver.exe', options=ff_option)
elif brower.lower() == 'ie':
    driver = webdriver.Ie('..\drivers\IEDriverServer')
else:
    raise Exception('Invalid Browser Type')
rahul rai
źródło