O Selenium Webdriver pode abrir janelas do navegador silenciosamente em segundo plano?

160

Eu tenho um conjunto de testes de selênio que executa muitos testes e, a cada novo teste, ele abre uma janela do navegador sobre qualquer outra janela que eu abra. Muito chocante enquanto trabalha em um ambiente local. Alguma maneira de dizer ao selênio ou ao sistema operacional (MAC) para abrir as janelas em segundo plano?

kevzettler
fonte
Se você está fazendo driver = webdriver.Firefox() em seu código, siga a minha resposta aqui: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert
@ StéphaneBruckert Existe algo parecido no Chrome?
E.Praneeth
stackoverflow.com/a/48775203/1207193 é a solução funcional 2020 GoogleChrome Windows
eusoubrasileiro

Respostas:

64

Existem algumas maneiras, mas não é um simples "definir um valor de configuração". A menos que você invista em um navegador sem cabeça, que não atende aos requisitos de todos, é um pouco complicado:

Como ocultar a janela do Firefox (Selenium WebDriver)?

e

É possível ocultar o navegador no Selenium RC?

Você pode "supostamente" passar alguns parâmetros para o Chrome, especificamente: --no-startup-window

Observe que para alguns navegadores, especialmente o IE, os testes serão prejudicados por não serem executados em foco.

Você também pode invadir um pouco com o AutoIT, para ocultar a janela quando ela for aberta.

Arran
fonte
8
"-inicialização --no-window" está agora obsoleta
Corey Goldberg
2
de fato, use "--headless" em vez de "--no-startup-window", confirmei que funciona no Mac e no Chrome v80
Loaderon
178

Se você estiver usando o driver da web Selenium com Python, poderá usar o PyVirtualDisplay, um wrapper Python para Xvfb e Xephyr.

O PyVirtualDisplay precisa do Xvfb como uma dependência. No Ubuntu, primeiro instale o Xvfb:

sudo apt-get install xvfb

em seguida, instale o PyVirtualDisplay a partir do Pypi:

pip install pyvirtualdisplay

Exemplo de script Selenium em Python no modo sem cabeça com 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 A resposta inicial foi publicada em 2014 e agora estamos no auge de 2018. Como todo o resto, os navegadores também avançaram. Agora, o Chrome tem uma versão completamente decapitada que elimina a necessidade de usar bibliotecas de terceiros para ocultar a janela da interface do usuário. O código de exemplo é o seguinte:

    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
fonte
Uma solução bonita e limpa. Obrigado por isso. Funciona como um encanto. Mais + 1s
merecidos
9
Está disponível para Mac OSX?
vanguard69
Isso é ótimo se você estiver usando o Ubuntu e sua suíte de testes é em Python
kevzettler
1
o uso de chrome_options está obsoleto, agora são apenas opções
Mojimi 11/03
38

O Chrome 57 tem uma opção para passar a bandeira --headless, o que torna a janela invisível.

Esse sinalizador é diferente da --no-startup-window, pois o último não inicia uma janela. É usado para hospedar aplicativos em segundo plano, como diz esta página .

Código Java para passar o sinalizador para o Selenium webdriver (ChromeDriver):

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
Marlies
fonte
Você sabe se é possível fazer o mesmo na linguagem VBA?
Martin
@ Martin Eu não sei se o seu problema já foi corrigido ou não, mas depois de uma rápida pesquisa eu encontrei aqueles: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/... Será que este ajudar você?
Marlies 23/08
19

Para executar sem nenhum navegador, você pode executá-lo no modo sem cabeça .

Eu mostro um exemplo em Python que está funcionando para mim agora

from selenium import webdriver


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

Também adiciono um pouco mais de informações sobre isso no site oficial do Google https://developers.google.com/web/updates/2017/04//headless-chrome

Gonzalo Sanchez cano
fonte
Resposta mais simples de todas!
MarcioPorto
funcionou muito bem em junho de 2020
Jonny Boy
15

Desde o Chrome 57, você tem o argumento decapitado:

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

O modo sem cabeça do Chrome executa 30,97% melhor que a versão da interface do usuário. O outro driver sem cabeça PhantomJS oferece 34,92% melhor que o modo sem cabeça do Chrome.

PhantomJSDriver

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

O modo sem cabeça do Mozilla Firefox executa 3,68% melhor que a versão da interface do usuário. Isso é uma decepção, já que o modo sem cabeça do Chrome alcança um tempo> 30% melhor que o da interface do usuário. O outro driver sem cabeça PhantomJS oferece 34,92% melhor que o modo sem cabeça do Chrome. Surpreendentemente para mim, o navegador Edge supera todos eles.

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

Está disponível no Firefox 57+

O modo sem cabeça do Mozilla Firefox executa 3,68% melhor que a versão da interface do usuário. Isso é uma decepção, já que o modo sem cabeça do Chrome alcança um tempo> 30% melhor que o da interface do usuário. O outro driver sem cabeça PhantomJS oferece 34,92% melhor que o modo sem cabeça do Chrome. Surpreendentemente para mim, o navegador Edge supera todos eles.

Nota: O PhantomJS não é mais mantido!

Anton Angelov
fonte
8

Sugiro usar o Phantom Js para obter mais informações que você precisa visitar o site oficial do Phantom

Tanto quanto eu sei, o PhantomJS funciona apenas com o Firefox ..

depois de baixar PhantomJs.exe você precisa importar para o seu projeto como você pode ver na imagem abaixo PhantomJS está dentro comum >> Biblioteca >> phantomjs.exe insira a descrição da imagem aqui

Agora tudo que você precisa dentro do seu código Selenium é mudar a linha

browser = webdriver.Firefox()

Para algo como

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

O caminho para os phantomjs pode ser diferente ... mude como quiser :)

É isso, funcionou para mim. e definitivamente ele trabalhará para você, Saúde

Ayoub
fonte
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. Respostas só-Link pode se tornar inválido se as mudanças de páginas ligadas
slfan
7

No Windows, você pode usar o 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)

Exemplo:

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

No entanto, há um problema com esta solução - o uso do método send_keys faz a janela aparecer. Você pode lidar com isso usando javascript, que não mostra a janela:

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

Eu usei esse código para o Firefox no Windows e obtive a resposta: (referência aqui )

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

Mas não testo para outros navegadores.

NaabNuts
fonte
A pergunta já está respondida e o autor já a aprovou.
Sariq Shaikh
4
Eu respondi por outras pessoas que verão este post
NaabNuts
1
Obrigado por nos dar a alternativa do Firefox
TimDC
Se você tiver alguma dúvida sobre o Selenium e o Django, eu responderei.
NaabNuts
Funciona em cromo também!
Heisenberg
2

Pode estar em opções. Aqui está o código java idêntico.

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

Esta é uma solução simples do NodeJS que funciona na nova versão 4.x (talvez também 3.x) do Selenium.

Cromada:

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

Raposa de fogo:

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

A coisa toda é executada em segundo plano. Exatamente o que queremos.

ndsvw
fonte
1

Se você estiver usando o driver chrome, poderá usar este código muito simples: (funcionou para mim)

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

No * nix, você também pode executar um servidor X sem cabeça como o Xvfb e apontar a variável DISPLAY para ele:

Servidor X falso para teste?

user2645074
fonte
0

Aqui está uma solução .net que funcionou para mim:

Faça o download do PhantomJs aqui http://phantomjs.org/download.html

Copie o .exe da pasta bin no download e cole na pasta bin debug / release do seu projeto do Visual Studio.

Adicione isso usando

using OpenQA.Selenium.PhantomJS;

No seu código, abra o driver assim:

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

Se você estiver usando o Ubuntu (Gnome), uma solução alternativa simples é instalar a extensão auto-move-window da extensão Gnome: https://extensions.gnome.org/extension/16/auto-move-windows/

Em seguida, defina o navegador (por exemplo, Chrome) para outro espaço de trabalho (por exemplo, espaço de trabalho 2). O navegador será executado silenciosamente em outro espaço de trabalho e não o incomodará mais. Você ainda pode usar o Chrome no seu espaço de trabalho sem interrupção.

Prumo
fonte
0

oi eu tive o mesmo problema com meu chromedriver usando python e options.add_argument ("headless") não funcionou para mim, mas então eu percebi como corrigi-lo, então eu o trago no código abaixo

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

Espero que funcione para você.

Soroush Bn
fonte
0

Uma maneira de conseguir isso é executando o navegador no modo sem cabeça. Outra vantagem disso é que os testes são executados mais rapidamente.

Encontre o código abaixo para definir o modo sem cabeça no 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
fonte