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?
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.
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()
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);
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!
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
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
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
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+"';")
Ce peut être dans les options. Voici le code Java identique.
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setHeadless(true);
WebDriver driver = new ChromeDriver(chromeOptions);
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.
Sur * nix, vous pouvez également exécuter un serveur X sans tête comme Xvfb et y pointer la variable DISPLAY:
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
}