Selenium Webdriver può aprire silenziosamente le finestre del browser in background?


162

Ho una suite di test al selenio che esegue molti test e ad ogni nuovo test apre una finestra del browser in cima a tutte le altre finestre che ho aperto. Molto stonante mentre si lavora in un ambiente locale. Un modo per dire al selenio o al sistema operativo (MAC) di aprire le finestre in background?


Se si sta facendo driver = webdriver.Firefox() nel codice, seguire la mia risposta qui: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert

@ StéphaneBruckert C'è qualcosa di simile per Chrome?
E.Praneeth,

stackoverflow.com/a/48775203/1207193 è la soluzione di lavoro 2020 GoogleChrome Windows
eusoubrasileiro

Risposte:


64

Ci sono alcuni modi, ma non è un semplice "impostare un valore di configurazione". A meno che tu non investa in un browser senza testa, che non soddisfa i requisiti di tutti, è un po 'un trucco:

Come nascondere la finestra di Firefox (Selenium WebDriver)?

e

È possibile nascondere il browser in Selenium RC?

Puoi 'presumibilmente', passare alcuni parametri in Chrome, in particolare: --no-startup-window

Si noti che per alcuni browser, in particolare IE, i test non danneggeranno il fatto di non averlo messo a fuoco.

Puoi anche hackerare un po 'con AutoIT, per nascondere la finestra una volta aperta.


8
"--no-startup-window" è ora deprecato
Corey Goldberg,

2
anzi, usa "--headless" invece di "--no-startup-window", ho confermato che funziona su Mac e Chrome v80
Loaderon

178

Se si utilizza il driver web Selenium con Python, è possibile utilizzare PyVirtualDisplay, un wrapper Python per Xvfb e Xephyr.

PyVirtualDisplay necessita di Xvfb come dipendenza. Su Ubuntu, prima installa Xvfb:

sudo apt-get install xvfb

quindi installare PyVirtualDisplay da Pypi:

pip install pyvirtualdisplay

Script di selenio di esempio in Python in modalità senza testa 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()

MODIFICA La risposta iniziale è stata pubblicata nel 2014 e ora siamo alla cuspide del 2018. Come ogni altra cosa, anche i browser sono avanzati. Chrome ha una versione completamente senza testa che elimina la necessità di utilizzare librerie di terze parti per nascondere la finestra dell'interfaccia utente. Il codice di esempio è il seguente:

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

Una soluzione bella e pulita. Grazie per quello Funziona come un fascino. Meritavano più +1 +
Eldamir

9
È disponibile per Mac OSX?
vanguard69,

Questo è fantastico se stai usando Ubuntu e la tua suite di test è in Python
kevzettler,


1
l'uso di chrome_options è deprecato, ora sono solo opzioni
Mojimi

40

Chrome 57 ha un'opzione per passare il flag --headless, che rende la finestra invisibile.

Questo flag è diverso dalla finestra --no-startup-come l'ultimo non avvia una finestra. Viene utilizzato per l'hosting di app in background, come dice questa pagina .

Codice Java per passare il flag al selenio webdriver (ChromeDriver):

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

Sai se è possibile fare lo stesso in lingua VBA?
Martin

@ Martin Non so se il problema è stato risolto già o no, ma dopo una rapida ricerca ho scoperto quelli: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/... Fa questo Aiutarti?
Marlies

19

Per l'esecuzione senza browser, è possibile eseguirlo in modalità senza testa .

Vi mostro un esempio in Python che sta lavorando per me in questo 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)

Ti aggiungo anche un po 'più di informazioni al riguardo nel sito Web ufficiale di Google https://developers.google.com/web/updates/2017/04/headless-chrome


La risposta più semplice di tutte!
MarcioPorto,

ha funzionato senza intoppi a partire da giugno 2020
Jonny Boy il

15

Da Chrome 57 hai l'argomento senza testa:

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

La modalità senza testa di Chrome ha prestazioni migliori del 30,97% rispetto alla versione dell'interfaccia utente. L'altro driver senza testa PhantomJS offre il 34,92% migliore della modalità senza testa di Chrome.

PhantomJSDriver

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

La modalità senza testa di Mozilla Firefox ha prestazioni migliori del 3,68% rispetto alla versione dell'interfaccia utente. Questa è una delusione poiché la modalità senza testa di Chrome raggiunge tempi> 30% migliori di quelli dell'interfaccia utente. L'altro driver senza testa PhantomJS offre il 34,92% migliore della modalità senza testa di Chrome. Sorprendentemente per me, il browser Edge li batte tutti.

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

Questo è disponibile da Firefox 57+

La modalità senza testa di Mozilla Firefox ha prestazioni migliori del 3,68% rispetto alla versione dell'interfaccia utente. Questa è una delusione poiché la modalità senza testa di Chrome raggiunge tempi> 30% migliori di quelli dell'interfaccia utente. L'altro driver senza testa PhantomJS offre il 34,92% migliore della modalità senza testa di Chrome. Sorprendentemente per me, il browser Edge li batte tutti.

Nota: PhantomJS non viene più mantenuto!


8

Ti suggerisco di usare Phantom Js per maggiori informazioni che ti servono per visitare il sito web ufficiale di Phantom

Per quanto ne so PhantomJS funziona solo con Firefox ..

dopo aver scaricato PhantomJs.exe è necessario importare al progetto, come si può vedere nella foto qui sotto Phantomjs è dentro comune >> Biblioteca >> phantomjs.exe inserisci qui la descrizione dell'immagine

Ora tutto ciò che devi fare all'interno del tuo codice Selenium è cambiare la riga

browser = webdriver.Firefox()

A qualcosa del genere

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

Il percorso di phantomjs potrebbe essere diverso ... cambia come preferisci :)

Ecco fatto, ha funzionato per me. e sicuramente lavorerà per te, Saluti


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia
slfan

8

Su Windows puoi usare 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)

Esempio:

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

Tuttavia, esiste un problema con questa soluzione: l'utilizzo del metodo send_keys fa apparire la finestra. Puoi gestirlo usando javascript che non mostra la finestra:

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

5

Ho usato questo codice per Firefox in Windows e ho ottenuto la risposta: (riferimento qui )

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

Ma non lo collaudo per altri browser.


La domanda ha già una risposta e l'autore ha già approvato la risposta.
Sariq Shaikh

4
Ho risposto per altre persone che vedranno questo post
NaabNuts il

1
Grazie per averci fornito l'alternativa di Firefox
TimDC,

Benvenuto. Se hai qualche domanda su Selenium e Django ti risponderò.
NaabNuts

Funziona anche con Chrome!
Heisenberg

3

Potrebbe essere in opzioni. Ecco lo stesso codice Java.

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

1

Questa è una semplice soluzione NodeJS che funziona nella nuova versione 4.x (forse anche 3.x) di 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')

L'intera cosa funziona solo in background. Esattamente quello che vogliamo.


1

Se stai usando il driver Chrome, puoi usare questo codice molto semplice: (ha funzionato per me)

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


0

Ecco una soluzione .net che ha funzionato per me:

Scarica PhantomJs qui http://phantomjs.org/download.html

Copia il file .exe dalla cartella bin nel download e incollalo nella cartella bin debug / release del tuo progetto Visual Studio.

Aggiungi questo usando

using OpenQA.Selenium.PhantomJS;

Nel tuo codice apri il driver in questo modo:

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

0

Se stai usando Ubuntu (Gnome), una semplice soluzione è installare la finestra di spostamento automatico dell'estensione di Gnome: https://extensions.gnome.org/extension/16/auto-move-windows/

Quindi impostare il browser (ad es. Chrome) su un'altra area di lavoro (ad es. Area di lavoro 2). Il browser verrà eseguito silenziosamente in un'altra area di lavoro e non ti disturberà più. Puoi comunque utilizzare Chrome nell'area di lavoro senza alcuna interruzione.


0

ciao ho avuto lo stesso problema con il mio chromedriver usando python e options.add_argument ("senza testa") non ha funzionato per me ma poi ho capito come risolverlo quindi lo porto nel codice qui sotto

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

spero che funzioni per te.


0

Un modo per raggiungere questo obiettivo è eseguendo il browser in modalità senza testa. Un altro vantaggio è che i test vengono eseguiti più rapidamente.

Trova il codice seguente per impostare la modalità senza testa nel browser 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();
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.