web-dev-qa-db-fra.com

Comment puis-je exécuter Selenium dans Xvfb?

Je suis sur l'instance EC2. Donc, il n'y a pas d'interface graphique.

$pip install Selenium
$Sudo apt-get install firefox xvfb

Puis je fais ceci:

$Xvfb :1 -screen 0 1024x768x24 2>&1 >/dev/null &

$DISPLAY=:1 Java -jar Selenium-server-standalone-2.0b3.jar
05:08:31.227 INFO - Java: Sun Microsystems Inc. 19.0-b09
05:08:31.229 INFO - OS: Linux 2.6.32-305-ec2 i386
05:08:31.233 INFO - v2.0 [b3], with Core v2.0 [b3]
05:08:32.121 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
05:08:32.122 INFO - Version Jetty/5.1.x
05:08:32.123 INFO - Started HttpContext[/Selenium-server/driver,/Selenium-server/driver]
05:08:32.124 INFO - Started HttpContext[/Selenium-server,/Selenium-server]
05:08:32.124 INFO - Started HttpContext[/,/]
05:08:32.291 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@1186fab
05:08:32.292 INFO - Started HttpContext[/wd,/wd]
05:08:32.295 INFO - Started SocketListener on 0.0.0.0:4444
05:08:32.295 INFO - Started org.openqa.jetty.jetty.Server@1ffb8dc

Génial, tout devrait fonctionner maintenant, non?

Quand je lance mon code:

from Selenium import webdriver
from Selenium.common.exceptions import NoSuchElementException
from Selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox() 
browser.get("http://www.yahoo.com") 

J'ai compris:

Error: cannot open display: :0
87
TIMEX

ouvrez un terminal et exécutez cette commande xhost +. Cette commande doit être exécutée chaque fois que vous redémarrez votre ordinateur. Si tout fonctionne bien, vous pouvez ajouter ceci aux commandes de démarrage.

Assurez-vous également qu'il y a une ligne dans votre fichier/etc/environment

export DISPLAY=:0.0 

Et ensuite, lancez vos tests pour voir si votre problème est résolu.

Veuillez noter le commentaire de sardathrion ci-dessous avant de l'utiliser.

33
A.J

Vous pouvez utiliser PyVirtualDisplay (a Python pour Xvfb)) pour exécuter des tests WebDriver sans tête.

#!/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()

plus d'infos


Vous pouvez également utiliser xvfbwrapper , qui est un module similaire (mais n'a pas de dépendances externes):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

ou mieux encore, utilisez-le comme gestionnaire de contexte:

from xvfbwrapper import Xvfb

with Xvfb() as xvfb:
    # launch stuff inside virtual display here.
    # It starts/stops in this code block.
162
Corey Goldberg

Le moyen le plus simple est probablement d'utiliser xvfb-run:

DISPLAY=:1 xvfb-run Java -jar Selenium-server-standalone-2.0b3.jar

xvfb-run fait danser toute l'autorité de X pour vous, essayez-le!

44
ema

C'est la configuration que j'utilise:

Avant d'exécuter les tests, exécutez:

export DISPLAY =: 99 
/etc/init.d/xvfb start 

Et après les tests:

/etc/init.d/xvfb stop

Le fichier init.d Que j'utilise ressemble à ceci:

#!/bin/bash 
 
 XVFB =/usr/bin/Xvfb 
 XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16" 
 PIDFILE = $ { HOME}/xvfb _ $ {DISPLAY: 1} .pid 
 Cas "$ 1" dans 
 Début) 
 Echo -n "Démarrage du tampon de trame X virtuel: Xvfb" 
/sbin/start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS 
 echo "." 
 ;; 
 stop) 
 echo -n "Arrêt du tampon de trame X virtuel: Xvfb" 
/sbin/start-stop-daemon --stop --quiet --pidfile $ PIDFILE 
 Echo "." 
 ;; 
 Recommencer) 
 $ 0 stop 
 $ 0 démarrer 
 ;; 
 *) 
 echo "Utilisation: /etc/init.d/xvfb {start | stop | restart}" 
 exit 1 
 esac 
 exit 0
20
shang

Si vous utilisez Maven, vous pouvez utiliser xvfb-maven-plugin pour démarrer xvfb avant les tests, exécutez-les à l'aide de la variable d'environnement DISPLAY associée et arrêtez xvfb après tout.

3
Toilal