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

Eu tenho um conjunto de testes de selenium que executa muitos testes e em cada novo teste ele abre uma janela do navegador em cima de qualquer outra janela que eu tenha aberto. Muito chocante ao trabalhar em um ambiente local. Qualquer maneira de dizer selenium ou o sistema operacional (MAC) para abrir as janelas no fundo?

Existem algumas maneiras, mas não é um simples “definir um valor de configuração”. A menos que você invista em um navegador sem header, que não atende às necessidades de todos, é um pouco complicado:

Como esconder 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, ele prejudicará seus testes para que ele não seja executado em foco.

Você também pode hackear um pouco com o AutoIT, para ocultar a janela uma vez aberta.

Se você estiver usando o driver da web Selenium com Python, poderá usar o PyVirtualDisplay, um wrapper do 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 do Pypi:

 pip install pyvirtualdisplay 

Exemplo de script Selenium no Python em 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 tudo mais, os navegadores também avançaram. Agora, o Chrome tem uma versão totalmente sem header, o que elimina a necessidade de usar bibliotecas de terceiros para ocultar a janela da interface do usuário. O código de amostra é 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() 

O Chrome 57 tem a opção de passar o sinalizador –headless, o que torna a janela invisível.

Este sinalizador é diferente da janela –no-startup-a última vez que não inicia uma janela. Ele é usado para hospedar aplicativos em segundo plano, como esta página diz.

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

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

Sugiro usar o Phantom Js para mais informações. Você precisa visitar o site oficial do Phantom.

Tanto quanto eu sei que 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 é dentro comum >> Biblioteca >> phantomjs.exe insira a descrição da imagem aqui

Agora tudo que você tem dentro do seu código de 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 o phantomjs pode ser diferente … mude como quiser 🙂

É isso, funcionou para mim. e definitivamente ele vai trabalhar para você, Cheers

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

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 – usando o método send_keys faz a janela aparecer. Você pode lidar com isso usando o 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+"';") 

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

Eu mostro um exemplo em Python que está trabalhando 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

Desde o Chrome 57 você tem o argumento sem cabeça:

 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 é 30,97% melhor que a versão da interface do usuário. O outro driver sem cabeça PhantomJS oferece 34,92% melhor do 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 apresenta um desempenho 3,68% melhor do que a versão da interface do usuário. Isso é uma decepção, já que o modo sem cabeça do Chrome atinge> 30% melhor tempo do que o da interface do usuário. O outro driver sem cabeça PhantomJS oferece 34,92% melhor do que o modo sem cabeça do Chrome. Surpreendentemente para mim, o navegador Edge bate todos eles.

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

Isso está disponível no Firefox 57+

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

Nota: PhantomJS não é mais mantido!

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

Servidor X falso para teste?

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

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

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

Adicione isto usando

 using OpenQA.Selenium.PhantomJS; 

Em 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 }