webdriver - pestaña - cambiar de ventana selenium
¿Puede Selenium Webdriver abrir ventanas del navegador silenciosamente en el fondo? (9)
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.
Agregar esto usando
using OpenQA.Selenium.PhantomJS;
En su código abra el controlador de esta manera:
PhantomJSDriver driver = new PhantomJSDriver();
using (driver)
{
driver.Navigate().GoToUrl("http://testing-ground.scraping.pro/login");
//your code here
}
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 tengo abierta. Muy discordante mientras trabajaba en un entorno local. ¿Alguna forma de decirles al selenio o al sistema operativo (MAC) que abran las ventanas en segundo plano?
Chrome 57 tiene una opción para pasar el indicador sin cabeza, lo que hace que la ventana sea invisible.
Esta bandera es diferente de la ventana --no-startup-como la última no abre una ventana. Se usa para alojar aplicaciones en segundo plano, como dice esta página .
Código de Java para pasar la bandera a Selenium webdriver (ChromeDriver):
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);
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 tiene un rendimiento del 30,97% mejor que la versión de la 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 un 3.68% mejor que la versión de UI. Esto es una decepción ya que el modo sin cabeza de Chrome logra un tiempo> 30% mejor que el del UI. 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 en Firefox 57+
El modo sin cabeza de Mozilla Firefox funciona un 3.68% mejor que la versión de UI. Esto es una decepción ya que el modo sin cabeza de Chrome logra un tiempo> 30% mejor que el del UI. 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!
En * nix, también puede ejecutar un servidor X sin cabeza como Xvfb y señalar con él la variable DISPLAY:
En Windows puede usar 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)
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 manejarlo usando javascript que no muestra ventana:
def send_keys_without_opening_window(id_of_the_element, keys)
YourWebdriver.execute_script("document.getElementById(''" +id_of_the_element+"'').value = ''"+keys+"'';")
Hay algunas maneras, 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 complicado:
¿Cómo ocultar la ventana de Firefox (Selenium WebDriver)?
y
¿Es posible ocultar el navegador en Selenium RC?
Puedes ''supuestamente'', pasar algunos parámetros a Chrome, específicamente: --no-startup-window
Tenga en cuenta que para algunos navegadores, especialmente IE, dañará sus pruebas para que no se ejecute en foco.
También puede hackear un poco con AutoIT, para ocultar la ventana una vez que se abre.
Para ejecutar sin ningún navegador, puede ejecutarlo en modo sin cabeza .
Te muestro un ejemplo en Python que funciona 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
Si está utilizando el controlador web Selenium con Python, puede usar PyVirtualDisplay, un contenedor Python para Xvfb y Xephyr.
PyVirtualDisplay necesita Xvfb como una dependencia. En Ubuntu, primero instala Xvfb:
sudo apt-get install xvfb
luego instala PyVirtualDisplay desde Pypi:
pip install pyvirtualdisplay
Ejemplo de script de Selenium en Python en un 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. Al igual que todo lo demás, los navegadores también han avanzado. Chrome ahora tiene una versión completamente sin cabeza que elimina la necesidad de utilizar 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()
Sugiero usar Phantom Js para obtener más información que necesita para visitar el sitio web oficial de Phantom.
Por lo que sé, PhantomJS solo funciona con Firefox.
después de descargar PhantomJs.exe, debe importar a su proyecto como puede ver en la imagen siguiente Phantomjs está dentro de la biblioteca >> Biblioteca >> phantomjs.exe
Ahora todo lo que tiene que hacer dentro de su código de Selenio es cambiar la línea
browser = webdriver.Firefox()
Para 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 todo, funcionó para mí. y definitivamente él trabajará para ti, Saludos