93 votes

Comment faire fonctionner Selenium dans Xvfb ?

Je suis sur une instance EC2. Il n'y a donc pas d'interface graphique.

$pip install selenium
$sudo apt-get install firefox xvfb

Alors je fais ça :

$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

Super, tout devrait fonctionner maintenant, non ?

Quand j'exécute 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") 

Je comprends :

Error: cannot open display: :0

3 votes

Si vous êtes sur un système sans X, l'affichage :0 devrait être disponible. Essayez d'exécuter Xvfb :0 -- voyez aussi xvfb-run comme mentionné par @ema.

1 votes

Pour les futurs adeptes, j'ai décrit ma solution pour Ubuntu Server : namekdev.net/2016/08/

171voto

Corey Goldberg Points 15625

Vous pouvez utiliser PyVirtualDisplay (un wrapper 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 qui 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, l'utiliser 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.

2 votes

@Andrei OSX n'utilise pas X11 par défaut

0 votes

J'ai utilisé cette réponse pour le faire fonctionner avec vagrant + PyCharm + Django sur OS X : stackoverflow.com/q/29343109

0 votes

J'obtiens un "browser appears to have exited" lorsque j'implémente le code pyvirtualdisplay ci-dessus.

45voto

ema Points 606

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 toute la danse de l'autorité X pour vous, essayez-le !

0 votes

C'est exactement ce que je cherchais. Lancer Xvfb seul ne semblait pas fonctionner pour moi, mais utiliser xvfb-run a fait l'affaire. Merci.

9 votes

Le site DISPLAY=:1 n'est pas nécessaire ; xvfb-run définit la variable d'environnement DISPLAY à quelque chose d'autre (généralement :99 ) avant de lancer la commande spécifiée (dans votre cas, java -jar selenium-server... )

36voto

A.J Points 3363

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

Assurez-vous également que dans votre fichier /etc/environnement il y a une ligne

export DISPLAY=:0.0 

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

Veuillez tous prendre note du commentaire de sardathrion ci-dessous avant d'utiliser ceci.

0 votes

Il vous suffit d'exécuter java -jar selenium-server-standalone-2.0b3.jar à partir de la ligne de commande, puis de lancer vos tests.

0 votes

Je suis sur une instance EC2, il n'y a donc pas d'interface graphique. xhost : unable to open display ":0.0" (impossible d'ouvrir l'affichage)

0 votes

@owa Vous avez également besoin de la variable d'environnement DISPLAY dans l'environnement du client.

20voto

shang Points 13051

C'est la configuration que j'utilise :

Avant de lancer les tests, exécutez :

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

Et après les tests :

/etc/init.d/xvfb stop

Le site 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
case "$1" in
  start)
    echo -n "Starting virtual X frame buffer: Xvfb"
    /sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
    echo "."
    ;;
  stop)
    echo -n "Stopping virtual X frame buffer: Xvfb"
    /sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE
    echo "."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  \*)
  echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
  exit 1
esac
exit 0

0 votes

J'ai fait exactement cela et j'ai ensuite exécuté mon script. Cependant, j'obtiens toujours ceci : Erreur : ne peut pas ouvrir l'affichage : :0. De plus, dois-je exécuter le serveur java de Selenium ? Il semble que cela n'ait pas d'importance si je l'exécute ou non....

2 votes

Owalla, si vous utilisez WebDriver, alors vous n'avez pas besoin du Selenium Java Server.

3voto

Toilal Points 822

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X