227 votes

Selenium WebDriver peut-il ouvrir des fenêtres de navigateur en silence en arrière-plan ?

J'ai une suite de tests Selenium qui exécute de nombreux tests et à chaque nouveau test, une fenêtre de navigateur s'ouvre au-dessus de toutes les autres fenêtres que j'ai ouvertes. C'est très gênant lorsque l'on travaille dans un environnement local. Existe-t-il un moyen d'indiquer à Selenium ou au système d'exploitation (Mac) d'ouvrir les fenêtres en arrière-plan ?

231voto

Amistad Points 2590

Si vous utilisez le pilote web Selenium avec Python, vous pouvez utiliser PyVirtualDisplay, un wrapper Python pour Xvfb et Xephyr.

PyVirtualDisplay a besoin de Xvfb comme dépendance. Sur Ubuntu installez d'abord Xvfb :

sudo apt-get install xvfb

Ensuite, installez PyVirtualDisplay à partir de PyPI :

pip install pyvirtualdisplay

Exemple de Selenium script en Python en mode headless avec PyVirtualDisplay :

    #!/usr/bin/env python

    from pyvirtualdisplay import Display
    from selenium import webdriver

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

    # Now Firefox will run in a virtual display.
    # You will not see the browser.
    browser = webdriver.Firefox()
    browser.get('http://www.google.com')
    print browser.title
    browser.quit()

    display.stop()

EDIT

La réponse initiale a été publiée en 2014 et nous sommes maintenant à l'aube de 2018. Comme tout le reste, les navigateurs ont également progressé. Chrome a maintenant une version complètement headless qui élimine le besoin d'utiliser des bibliothèques tierces pour cacher la fenêtre de l'interface utilisateur. L'exemple de code est le suivant :

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options

    CHROME_PATH = '/usr/bin/google-chrome'
    CHROMEDRIVER_PATH = '/usr/bin/chromedriver'
    WINDOW_SIZE = "1920,1080"

    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
    chrome_options.binary_location = CHROME_PATH

    driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,
                              chrome_options=chrome_options
                             )
    driver.get("https://www.google.com")
    driver.get_screenshot_as_file("capture.png")
    driver.close()

74voto

Arran Points 11357

Il existe quelques moyens, mais il ne s'agit pas d'un simple "définir une valeur de configuration". À moins d'investir dans un navigateur sans tête, ce qui ne convient pas à tout le monde, c'est un peu du bidouillage :

Comment masquer la fenêtre de Firefox (Selenium WebDriver) ?

et

Est-il possible de masquer le navigateur dans Selenium RC ?

Vous pouvez "soi-disant" passer des paramètres dans Chrome, en particulier : --no-startup-window

Notez que pour certains navigateurs, en particulier Internet Explorer, il est préférable de ne pas exécuter les tests en mode focus.

Vous pouvez aussi faire un peu de bricolage avec AutoIt pour cacher la fenêtre une fois qu'elle est ouverte.

51voto

in016hoe Points 478

Chrome 57 dispose d'une option permettant de passer le drapeau --headless, qui rend la fenêtre invisible.

Ce drapeau est différent de --no-startup-window car ce dernier ne lance pas de fenêtre. Il est utilisé pour héberger des applications d'arrière-plan comme cette page dit.

Code Java pour passer le drapeau à Selenium webdriver (ChromeDriver) :

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);

35voto

Pour une exécution sans navigateur, vous pouvez l'exécuter dans sans tête mode.

Je vous montre un exemple en Python qui fonctionne pour moi en ce moment.

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("headless")
self.driver = webdriver.Chrome(executable_path='/Users/${userName}/Drivers/chromedriver', chrome_options=options)

Je vous ajoute également un peu plus d'informations à ce sujet sur le site officiel de Google. https://developers.google.com/web/updates/2017/04/headless-chrome

24voto

PouriaDiesel Points 344

J'ai utilisé ce code pour Firefox sous Windows et j'ai obtenu la réponse (référence) ici ):

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

Options = Options()
Options.headless = True

Driver = webdriver.Firefox(options=Options, executable_path='geckodriver.exe')
Driver.get(...)
...

Mais je ne l'ai pas testé pour d'autres navigateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X