¿Selenium Webdriver puede abrir ventanas del navegador silenciosamente en segundo plano?

162

Tengo un conjunto de pruebas de selenio que ejecuta muchas pruebas y en cada nueva prueba abre una ventana del navegador encima de cualquier otra ventana que haya abierto. Muy discordante mientras trabajaba en un entorno local. ¿Alguna forma de decirle al selenio o al sistema operativo (MAC) que abra las ventanas en segundo plano?

kevzettler
fuente
Si está haciendo driver = webdriver.Firefox() su código, siga mi respuesta aquí: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert
@ StéphaneBruckert ¿Hay algo así para Chrome?
E.Praneeth
stackoverflow.com/a/48775203/1207193 es la solución de trabajo 2020 GoogleChrome Windows
eusoubrasileiro

Respuestas:

64

Hay algunas formas, pero no es un simple "establecer un valor de configuración". A menos que invierta en un navegador sin cabeza, que no se ajusta a los requisitos de todos, es un poco hack:

¿Cómo ocultar la ventana de Firefox (Selenium WebDriver)?

y

¿Es posible ocultar el navegador en Selenium RC?

Puede 'supuestamente' pasar algunos parámetros a Chrome, específicamente: --no-startup-window

Tenga en cuenta que para algunos navegadores, especialmente IE, perjudicará sus pruebas para que no se ejecute en foco.

También puedes hackear un poco con AutoIT, para ocultar la ventana una vez que se abre.

Arran
fuente
8
"--no-startup-window" ahora está en desuso
Corey Goldberg
2
de hecho, use "--headhead" en lugar de "--no-startup-window", he confirmado que funciona en Mac y Chrome v80
Loaderon
178

Si está utilizando el controlador web Selenium con Python, puede usar PyVirtualDisplay, un contenedor de Python para Xvfb y Xephyr.

PyVirtualDisplay necesita Xvfb como dependencia. En Ubuntu, primero instale Xvfb:

sudo apt-get install xvfb

luego instale PyVirtualDisplay desde Pypi:

pip install pyvirtualdisplay

Ejemplo de secuencia de comandos Selenium en Python en modo sin cabeza con 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()

EDITAR La respuesta inicial se publicó en 2014 y ahora estamos en la cúspide de 2018. Como todo lo demás, los navegadores también han avanzado. Chrome tiene ahora una versión completamente sin cabeza que elimina la necesidad de usar bibliotecas de terceros para ocultar la ventana de la interfaz de usuario. El código de muestra es el siguiente:

    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
fuente
Una solución hermosa y limpia. Gracias por eso. Funciona de maravilla. Merecido más + 1s
Eldamir
9
¿Está disponible para Mac OSX?
vanguard69
Esto es genial si estás usando Ubuntu y tu suite de prueba está en Python
kevzettler
1
el uso de chrome_options está en desuso, ahora solo son opciones
Mojimi
40

Chrome 57 tiene una opción para pasar el indicador --headhead, que hace que la ventana sea invisible.

Esta bandera es diferente de la ventana --no-startup-ya que la última no abre una ventana. Se usa para alojar aplicaciones en segundo plano, como dice esta página .

Código Java para pasar la bandera a Selenium webdriver (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
Marlies
fuente
¿Sabes si es posible hacer lo mismo en lenguaje VBA?
Martin
@ Martin No sé si su problema ya se ha solucionado o no, pero después de una búsqueda rápida encontré estos: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/… ¿Esto ¿ayudarte?
Marlies
19

Para ejecutar sin ningún navegador, puede ejecutarlo en modo sin cabeza .

Te muestro un ejemplo en Python que está funcionando para mí en este momento

from selenium import webdriver


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

También le agrego un poco más de información sobre esto en el sitio web oficial de Google https://developers.google.com/web/updates/2017/04/headless-chrome

Gonzalo Sanchez cano
fuente
¡La respuesta más simple de todas!
MarcioPorto
funcionó muy bien a partir de junio de 2020
Jonny Boy
15

Desde Chrome 57 tienes el argumento sin cabeza:

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

El modo sin cabeza de Chrome funciona un 30,97% mejor que la versión de interfaz de usuario. El otro controlador sin cabeza PhantomJS ofrece un 34,92% mejor que el modo sin cabeza de Chrome.

PhantomJSDriver

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

El modo sin cabeza de Mozilla Firefox funciona 3.68% mejor que la versión de la interfaz de usuario. Esto es una decepción ya que el modo sin cabeza de Chrome logra un tiempo> 30% mejor que el de la interfaz de usuario. El otro controlador sin cabeza PhantomJS ofrece un 34,92% mejor que el modo sin cabeza de Chrome. Sorprendentemente para mí, el navegador Edge los supera a todos.

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

Esto está disponible desde Firefox 57+

El modo sin cabeza de Mozilla Firefox funciona 3.68% mejor que la versión de la interfaz de usuario. Esto es una decepción ya que el modo sin cabeza de Chrome logra un tiempo> 30% mejor que el de la interfaz de usuario. El otro controlador sin cabeza PhantomJS ofrece un 34,92% mejor que el modo sin cabeza de Chrome. Sorprendentemente para mí, el navegador Edge los supera a todos.

Nota: ¡PhantomJS ya no se mantiene!

Anton Angelov
fuente
8

Sugiero usar Phantom Js para obtener más información que necesita para visitar el sitio web oficial de Phantom

Que yo sepa, PhantomJS solo funciona con Firefox.

después de descargar PhantomJs.exe, debe importar a su proyecto, como puede ver en la imagen a continuación. Phantomjs está dentro de lo común >> Biblioteca >> phantomjs.exe ingrese la descripción de la imagen aquí

Ahora todo lo que tiene que hacer dentro de su código Selenium es cambiar la línea

browser = webdriver.Firefox()

A algo como

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

El camino a phantomjs puede ser diferente ... cambia como quieras :)

Eso es, funcionó para mí. y definitivamente él trabajará para ti, Cheers

Ayoub
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia
slfan
8

En Windows puedes usar 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)

Ejemplo:

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

Sin embargo, hay un problema con esta solución: el uso del método send_keys hace que aparezca la ventana. Puede lidiar con él usando javascript que no muestra la ventana:

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

Usé este código para Firefox en Windows y obtuve respuesta: (referencia aquí )

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

Pero no lo pruebo para otros navegadores.

NaabNuts
fuente
La pregunta ya está respondida y el autor ya ha aprobado la respuesta.
Sariq Shaikh
44
Respondí por otras personas que verán esta publicación
NaabNuts
1
Gracias por darnos la alternativa de Firefox
TimDC
De nada. Si tiene alguna pregunta sobre Selenium y Django, le responderé.
NaabNuts
Funciona en cromo también!
Heisenberg
3

Puede estar en opciones. Aquí está el código Java idéntico.

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

Esta es una solución simple de NodeJS que funciona en la nueva versión 4.x (quizás también 3.x) de Selenium.

Cromo:

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

Todo se ejecuta en segundo plano. Exactamente lo que queremos.

ndsvw
fuente
1

Si está utilizando el controlador de Chrome, puede utilizar este código muy simple: (funcionó para mí)

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
fuente
0

Aquí hay una solución .net que funcionó para mí:

Descargue PhantomJs aquí http://phantomjs.org/download.html

Copie el archivo .exe de la carpeta bin en la descarga y péguelo en la carpeta bin debug / release de su proyecto de Visual Studio.

Agregue esto usando

using OpenQA.Selenium.PhantomJS;

En su código, abra el controlador así:

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

Si está usando Ubuntu (Gnome), una solución simple es instalar la extensión de Gnome auto-move-window: https://extensions.gnome.org/extension/16/auto-move-windows/

Luego configure el navegador (por ejemplo, Chrome) en otro espacio de trabajo (por ejemplo, Espacio de trabajo 2). El navegador se ejecutará silenciosamente en otro espacio de trabajo y ya no te molestará. Todavía puede usar Chrome en su espacio de trabajo sin interrupción.

Beto
fuente
0

hola tuve el mismo problema con mi chromedriver usando python y options.add_argument ("sin cabeza") no funcionó para mí, pero luego me di cuenta de cómo solucionarlo, así que lo incluí en el código a continuación

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

Espero que funcione para ti.

Soroush Bn
fuente
0

Una forma de lograr esto es ejecutando el navegador en modo sin cabeza. Otra ventaja de esto es que las pruebas se ejecutan más rápido.

Encuentre el código a continuación para configurar el modo sin cabeza en el navegador 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
fuente