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

162

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

kevzettler
la source
Si vous faites driver = webdriver.Firefox() dans votre code, suivez ma réponse ici: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert
@ StéphaneBruckert Y a-t-il quelque chose comme ça pour Chrome?
E.Praneeth
stackoverflow.com/a/48775203/1207193 est la solution de travail 2020 GoogleChrome Windows
eusoubrasileiro

Réponses:

64

Il existe plusieurs façons, mais ce n'est pas un simple "définir une valeur de configuration". Sauf si vous investissez dans un navigateur sans tête, qui ne répond pas aux exigences de tout le monde, c'est un peu un hack:

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

et

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

Vous pouvez `` supposément '' transmettre certains paramètres dans Chrome, en particulier: --no-startup-window

Notez que pour certains navigateurs, en particulier IE, cela nuira à vos tests de ne pas l'exécuter en focus.

Vous pouvez également pirater un peu avec AutoIT, pour masquer la fenêtre une fois qu'elle est ouverte.

Arran
la source
8
"--no-startup-window" est désormais obsolète
Corey Goldberg
2
en effet, utilisez "--headless" au lieu de "--no-startup-window", j'ai confirmé que cela fonctionne sur Mac et Chrome v80
Loaderon le
178

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

puis installez PyVirtualDisplay depuis 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 maintenant à l'aube de 2018.Comme tout le reste, les navigateurs ont également avancé. Chrome a maintenant une version complètement sans tête, ce qui élimine le besoin d'utiliser des bibliothèques tierces pour masquer la fenêtre de l'interface utilisateur. Un 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()
Amistad
la source
Une belle solution propre. Merci pour ça. Fonctionne comme un charme. Mérite plus +1s
Eldamir
9
Est-il disponible pour Mac OSX?
vanguard69
C'est génial si vous utilisez Ubuntu et que votre suite de tests est en Python
kevzettler
1
l'utilisation de chrome_options est obsolète, ce n'est plus que des options
Mojimi
40

Chrome 57 a une option pour 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 d'arrière-plan, comme l' indique cette page .

Code Java pour transmettre l'indicateur à Selenium webdriver (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
Marlies
la source
Savez-vous s'il est possible de faire de même en langage VBA?
Martin
Je ne sais @ Martin pas si votre problème a déjà été résolu ou non, mais après une recherche rapide j'ai trouvé ceux -ci : github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/... Est - ce T'aider?
Marlies
19

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

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

Gonzalo Sanchez cano
la source
La réponse la plus simple de toutes!
MarcioPorto
a très bien fonctionné à partir de juin 2020
Jonny Boy
15

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 fonctionne 30,97% mieux que la version de l'interface utilisateur. 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 fonctionne 3.68% mieux que la version de l'interface utilisateur. C'est une déception, car le mode sans tête de Chrome atteint un temps> 30% meilleur 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 fonctionne 3.68% mieux que la version de l'interface utilisateur. C'est une déception, car le mode sans tête de Chrome atteint un temps> 30% meilleur 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!

Anton Angelov
la source
8

Je suggère d'utiliser Phantom Js pour plus d'informations dont vous avez besoin pour visiter le site Web officiel de Phantom

Pour autant que je sache, PhantomJS fonctionne uniquement avec Firefox.

après avoir téléchargé PhantomJs.exe, vous devez importer dans votre projet comme vous pouvez le voir dans l'image ci-dessous Phantomjs est à l'intérieur du commun >> Bibliothèque >> phantomjs.exe entrez la description de l'image ici

Maintenant, tout ce que vous avez à l'intérieur de 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 marché pour moi. et certainement il travaillera pour vous, Cheers

Ayoub
la source
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses aux liens uniquement peuvent devenir invalides si la page liée change
slfan
8

Sous Windows, vous pouvez utiliser win32gui:

import win32gui
import win32con
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, win32con.SW_MINIMIZE)
        win32gui.ShowWindow(self.hwnd, win32con.SW_HIDE)

    def show(self):
        win32gui.ShowWindow(self.hwnd, win32con.SW_SHOW)
        win32gui.ShowWindow(self.hwnd, win32con.SW_MAXIMIZE)

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

Cependant, il y a un problème avec cette solution - l'utilisation de la méthode send_keys fait apparaître la fenêtre. Vous pouvez y faire face en utilisant javascript qui n'affiche pas de fenêtre:

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

J'ai utilisé ce code pour Firefox dans 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 le teste pas pour d'autres navigateurs.

NaabNuts
la source
La question a déjà reçu une réponse et l'auteur a déjà approuvé la réponse.
Sariq Shaikh
4
J'ai répondu pour d'autres personnes qui verront cet article
NaabNuts
1
Merci de nous avoir donné l'alternative Firefox
TimDC
Bienvenue, si vous avez des questions sur Selenium et Django, je vous répondrai.
NaabNuts
Fonctionne aussi en chrome!
Heisenberg
3

Cela peut être dans les options. Voici le code java identique.

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);
Rinjan
la source
1

Il s'agit d'une solution NodeJS simple qui fonctionne dans la nouvelle version 4.x (peut-être aussi 3.x) de Selenium.

Chrome:

const { Builder } = require('selenium-webdriver')
const chrome = require('selenium-webdriver/chrome');

let driver = await new Builder().forBrowser('chrome').setChromeOptions(new chrome.Options().headless()).build()

await driver.get('https://example.com')

Firefox:

const { Builder } = require('selenium-webdriver')
const firefox = require('selenium-webdriver/firefox');

let driver = await new Builder().forBrowser('firefox').setFirefoxOptions(new firefox.Options().headless()).build()

await driver.get('https://example.com')

Le tout tourne juste en arrière-plan. Exactement ce que nous voulons.

ndsvw
la source
1

Si vous utilisez le pilote chrome, vous pouvez utiliser ce code très simple: (cela a fonctionné pour moi)

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

chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome('chromedriver2_win32/chromedriver.exe', options=chrome_options)
driver.get('https://www.anywebsite.com')
Majid A
la source
0

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

Faux serveur X pour les tests?

user2645074
la source
0

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

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

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

Ajoutez 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 
}
Jack Fairfield
la source
0

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, réglez le navigateur (par exemple Chrome) sur un autre espace de travail (par exemple Workspace 2). Le navigateur fonctionnera 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.

Bob
la source
0

salut j'ai eu le même problème avec mon chromedriver en utilisant python et options.add_argument ("headless") ne fonctionnait pas pour moi mais ensuite j'ai réalisé comment le résoudre alors je l'apporte dans le code ci-dessous

opt=webdriver.ChromeOptions()
opt.arguments.append("headless")

j'espère que cela fonctionne pour vous.

Soroush Bn
la source
0

Une façon d'y parvenir consiste à exécuter le navigateur en mode sans tête. Un autre avantage de ceci est que les tests sont exécutés plus rapidement.

Veuillez trouver le code ci-dessous pour définir le mode sans tête dans le navigateur Chrome.

package chrome;
   public class HeadlessTesting {
        public static void main(String[] args) throws IOException{
            System.setProperty("webdriver.chrome.driver",
                    "ChromeDriverPath");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("headless");
            options.addArguments("window-size=1200x600");
            WebDriver driver = new ChromeDriver(options);
            driver.get("https://contentstack.built.io");
            driver.get("https://www.google.co.in/");
            System.out.println("title is: " + driver.getTitle());
            File scrFile = ((TakesScreenshot) driver)
                    .getScreenshotAs(OutputType.FILE);
            FileUtils.copyFile(scrFile, new File("pathTOSaveFile"));
            driver.quit();
        }
    }
Navpreet Singh
la source