web-dev-qa-db-fra.com

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

J'ai une suite de tests Selenium qui exécute de nombreux tests et à chaque nouveau test, elle ouvre une fenêtre de navigateur au-dessus de toute autre fenêtre ouverte. Très choquant tout en travaillant dans un environnement local. Un moyen de dire à Selenium ou au système d'exploitation (MAC) d'ouvrir les fenêtres en arrière-plan?

114
kevzettler

Il y a plusieurs façons, mais ce n'est pas simple "définir une valeur de configuration". Sauf si vous investissez dans un navigateur sans tête, qui ne convient pas à tout le monde, c'est un peu un piratage:

Comment cacher une fenêtre Firefox (Selenium WebDriver)?

et

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

Vous pouvez "supposément" transmettre certains paramètres dans Chrome, notamment: --no-startup-window

Notez que pour certains navigateurs, en particulier IE, les tests ne fonctionneront pas correctement.

Vous pouvez aussi bidouiller un peu avec AutoIT, pour cacher la fenêtre une fois ouverte.

52
Arran

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

PyVirtualDisplay nécessite Xvfb comme dépendance. Sur Ubuntu, installez d’abord Xvfb:

Sudo apt-get install xvfb

puis installez PyVirtualDisplay de Pypi:

pip install pyvirtualdisplay

Exemple de script Selenium en Python en mode sans tête 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 à l'aube de 2018.Comme pour le reste, les navigateurs ont également progressé. Chrome a maintenant une version complètement sans tête qui élimine le besoin d'utiliser des bibliothèques tierces pour masquer la fenêtre de l'interface utilisateur. Voici un exemple de code:

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()
132
Amistad

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

Cet indicateur est différent de --no-startup-window car le dernier ne lance pas de fenêtre. Il est utilisé pour héberger des applications en arrière-plan, comme cette page dit.

Code Java permettant de transmettre l'indicateur à Selenium WebDriver (ChromeDriver):

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

Depuis Chrome 57, vous avez l’argument sans tête:

var options = new ChromeOptions();
options.AddArguments("headless");
using (IWebDriver driver = new ChromeDriver(options))
{
    // the rest of your test
}

Le mode sans tête de Chrome offre une performance 30,97% supérieure à celle de la version UI. L'autre pilote sans tête PhantomJS offre 34,92% de mieux que le mode sans tête de Chrome.

PhantomJSDriver

using (IWebDriver driver = new PhantomJSDriver())
{
     // the rest of your test
}

Le mode sans tête de Mozilla Firefox affiche une performance 3.68% supérieure à celle de la version UI C’est une déception, car le mode sans tête de Chrome permet d’obtenir> 30% de meilleurs temps que celui de l’interface utilisateur. L'autre pilote sans tête PhantomJS offre 34,92% de mieux que le mode sans tête de Chrome. Étonnamment pour moi, le navigateur Edge les bat tous. 

var options = new FirefoxOptions();
options.AddArguments("--headless");
{
    // the rest of your test
}

Ceci est disponible à partir de Firefox 57+

Le mode sans tête de Mozilla Firefox affiche une performance 3.68% supérieure à celle de la version UI C’est une déception, car le mode sans tête de Chrome permet d’obtenir> 30% de meilleurs temps que celui de l’interface utilisateur. L'autre pilote sans tête PhantomJS offre 34,92% de mieux que le mode sans tête de Chrome. Étonnamment pour moi, le navigateur Edge les bat tous. 

Remarque: PhantomJS n'est plus maintenu!

11
Anton Angelov

Je suggère d'utiliser Phantom Js Pour plus d'informations, vous devez visiter Phantom Official Website

Pour autant que je sache, PhantomJS ne fonctionne qu'avec Firefox .. 

après avoir téléchargé PhantomJs.exe, vous devez l'importer dans votre projet, comme vous pouvez le voir dans l'image ci-dessous. Phantomjs se trouve dans common >> Library >> phantomjs.exe enter image description here

Maintenant tout ce que vous devez dans votre code Selenium est de changer la ligne

browser = webdriver.Firefox()

À quelque chose comme

import os
path2phantom = os.getcwd() + "\common\Library\phantomjs.exe"
browser = webdriver.PhantomJS(path2phantom)

Le chemin vers phantomjs peut être différent ... changez comme vous le souhaitez :) 

Ça y est, ça a fonctionné pour moi. et certainement il travaillera pour vous, à la vôtre

8
Ayoub

Pour fonctionner sans navigateur, vous pouvez le lancer en mode headless.

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

7
Gonzalo Sanchez cano

Sur Windows, vous pouvez utiliser win32gui:

import win32gui
import subprocess

class HideFox:
    def __init__(self, exe='firefox.exe'):
        self.exe = exe
        self.get_hwnd()


    def get_hwnd(self):
      win_name = get_win_name(self.exe)
      self.hwnd = win32gui.FindWindow(0,win_name)


    def hide(self):
        win32gui.ShowWindow(self.hwnd, 6)
        win32gui.ShowWindow(self.hwnd, 0)

    def show(self):
        win32gui.ShowWindow(self.hwnd, 5)
        win32gui.ShowWindow(self.hwnd, 3)

def get_win_name(exe):
    '''simple function that gets the window name of the process with the given name'''
    info = subprocess.STARTUPINFO()
    info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    raw=subprocess.check_output('tasklist /v /fo csv', startupinfo=info).split('\n')[1:-1]
    for proc in raw:
        try:
            proc=eval('['+proc+']')
            if proc[0]==exe:
                return proc[8]             
        except:
            pass
    raise ValueError('Could not find a process with name '+exe)

Exemple:

hider=HideFox('firefox.exe')  #can be anything, eq: phantomjs.exe, notepad.exe ...
#To hide the window
hider.hide()
#To show again
hider.show()

Cette solution présente toutefois un problème: utiliser la méthode send_keys rend la fenêtre visible. Vous pouvez vous en occuper en utilisant javascript qui ne montre pas la fenêtre:

def send_keys_without_opening_window(id_of_the_element, keys)
    YourWebdriver.execute_script("document.getElementById('" +id_of_the_element+"').value = '"+keys+"';")
4
Piotr Dabkowski

Ce peut être dans les options. Voici le code Java identique.

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);
0
rinjan

Si vous utilisez Ubuntu (Gnome), une solution simple consiste à installer l'extension Gnome auto-move-window: https://extensions.gnome.org/extension/16/auto-move-windows/

Ensuite, configurez le navigateur (par exemple Chrome) sur un autre espace de travail (par exemple Workspace 2). Le navigateur s'exécutera silencieusement dans un autre espace de travail et ne vous dérangera plus. Vous pouvez toujours utiliser Chrome dans votre espace de travail sans aucune interruption.

0
Bob

Sur * nix, vous pouvez également exécuter un serveur X sans tête comme Xvfb et y pointer la variable DISPLAY:

Fake X Server pour les tests?

0
user2645074

Voici une solution .net qui a fonctionné pour moi:

Téléchargez PhantomJs ici http://phantomjs.org/download.html

Copiez le fichier .exe du dossier bin dans le téléchargement et collez-le dans le dossier bin debug/release de votre projet Visual Studio.

Ajouter ceci en utilisant 

using OpenQA.Selenium.PhantomJS;

Dans votre code, ouvrez le pilote comme ceci:

PhantomJSDriver driver = new PhantomJSDriver();
using (driver)
{
   driver.Navigate().GoToUrl("http://testing-ground.scraping.pro/login");
   //your code here 
}
0
Jack Fairfield