¿Es posible ejecutar el controlador web selenium (Firefox) sin una GUI?


113

Estamos considerando actualizar nuestro servidor de producción de Ubuntu- desktop 10.04 a Ubuntu- server 12.04.

Tenemos varios servicios que se ejecutan en nuestro sistema operativo de escritorio actual, como Selenium Web Driver. Mi pregunta es ¿se puede ejecutar el controlador web Selenium desde un sistema basado en cli?

Mi pensamiento inmediato es que no puede, porque depende de Firefox, ¡pero me gustaría que alguien me demuestre que estoy equivocado!


Respuestas:


102

Lo que estas buscando es un .

Sí, es posible ejecutar Selenium en Firefox sin cabeza. Aquí hay una publicación que puede seguir.

Aquí están los pasos resumidos para configurar Xvfb

#install Xvfb
sudo apt-get install xvfb

#set display number to :99
Xvfb :99 -ac &
export DISPLAY=:99    

#you are now having an X display by Xvfb

5
Esto funciona y admite capturas de pantalla. Yo uso esto. También funciona con google chrome.
Isaac

No creo que esto funcione más (al menos no fácilmente, porque requiere un nuevo geckodriver como lo hizo Chrome)
Archimedes Trajano

1
@ArchimedesTrajano Esto todavía funciona. Las instrucciones son para crear una pantalla virtual usando Xvfb, no para instalar y configurar Selenium (que requiere tener geckodriveren la ruta).
expz el

2
Me gusta hacer esto desde Python, lo que puede hacer con subprocess.Popen('Xvfb...')o os.system('Xvfb...'), pero asegúrese de hacerlo antes de importar el controlador web.
wordsforthewise

4
ese enlace ahora está roto
oldboy

22

Chrome ahora tiene un modo sin cabeza:

op = webdriver.ChromeOptions()
op.add_argument('headless')
driver = webdriver.Chrome(options=op)

4
PhantomJS no se encuentra actualmente en desarrollo activo. El repositorio de Git está archivado.
Wojciech Jakubas

1
Selenium también dejó de admitir PhantomJS con el siguiente mensaje "Advertencia de usuario: la compatibilidad con Selenium para PhantomJS se ha depreciado, utilice versiones sin cabeza de Chrome o Firefox en su lugar"
Jörg

11

Si. En su HTMLUnitDriverlugar, puede usar para FirefoxDrivermientras inicia webdriver. Esta es la configuración del navegador sin cabeza. Los detalles se pueden encontrar aquí .


1
¿Soportaría esto funciones como save_screenshot ()? coreygoldberg.blogspot.co.uk/2011/06/…
nonshatter

No lo he intentado, pero puede ser posible porque efectivamente todavía está creando una interfaz de usuario, pero mostrándola en una ventana 'virtual'.
grahaminn

2
HTMLUnitDriver NO admitirá la captura de pantalla ya que el contenido no se representa en absoluto (Problema 1361). Una alternativa en la que puedo pensar es usar getHTMLSource y mostrar la página HTML en lugar de la captura de pantalla.
AJ

10

Si desea compatibilidad con un navegador sin cabeza, existe otro enfoque que podría adoptar.

https://github.com/detro/ghostdriver

Fue anunciado durante la Conferencia de Selenium y todavía está en desarrollo. Utiliza PhantomJS como navegador y es mucho mejor que HTMLUnitDriver, todavía no hay capturas de pantalla, pero como todavía está en desarrollo activo.


4

Un opcional es usarlo pyvirtualdisplayasí:

from pyvirtualdisplay import Display

display = Display(visible=0, size=[800, 600])
display.start()

#do selenium job here

display.close()

Una versión más corta es:

with Display() as display:
    # selenium job here

Este es generalmente un encapsulado de Python xvfb, y de alguna manera es más conveniente.

Por cierto, aunque PhantomJSes un navegador sin cabeza y no se abrirá ninguna ventana si lo usa, parece que PhantomJStodavía necesita un entorno de interfaz gráfica de usuario para funcionar.

Obtuve el código de error -6 cuando lo uso en PhantomJS()lugar de Firefox()en modo sin cabeza (consola conectada a masilla). Sin embargo, todo está bien en el entorno de escritorio.


3

ACTUALIZACIÓN: Ya no necesitas XVFB para ejecutar Firefox sin cabeza. Firefox v55 + en Linux y Firefox v56 + en Windows / Mac ahora admite la ejecución sin cabeza.

Agregué documentación de cómo usar aquí:

https://developer.mozilla.org/en-US/Firefox/Headless_mode#Selenium_in_Java


1
Los comentarios no son para una discusión extensa; esta conversación se ha movido al chat .
Bhargav Rao

Esto no funcionó para mí. No estoy seguro, pero creo que XVFB todavía es necesario.
Max Malysh

He estado usando navegadores sin cabeza en Firefox y Chrome durante varios años. La interfaz WebDriver para Selenium incluso ahora admite un parámetro setHeadless.
Nicholas DiPiazza


1

Tenga en cuenta que el cliente web HtmlUnitDriver es de un solo subproceso y Ghostdriver tiene solo el 40% de las funcionalidades para ser un WebDriver.

No obstante, Ghostdriver se ejecuta correctamente para las pruebas y tengo problemas para conectarlo al concentrador de WebDriver.


¿Proporciona esto alguna información nueva que las otras respuestas no ofrecen?
Austin Henley

0

Sí, puede ejecutar scripts de prueba sin un navegador, pero debe ejecutarlos en modo sin cabeza.


0

tal vez necesite establecer la dimensión del tamaño de su ventana. al igual que:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920x1080');

browser = webdriver.Chrome(options=options,executable_path = './chromedriver')

si tampoco funciona, intente aumentar la dimensión del tamaño de la ventana.


0

Instale y ejecute Firefox en contenedor:

docker pull selenium/standalone-firefox
docker run --rm -d -p 4444:4444 --shm-size=2g selenium/standalone-firefox

Conéctese usando webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.