Comment exécuter Selenium dans Xvfb?

92

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

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

Alors 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 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") 

J'ai compris:

Error: cannot open display: :0
TIMEX
la source
2
Si vous êtes sur un système sans X en cours d'exécution, l'affichage: 0 devrait être disponible. Essayez d'exécuter Xvfb: 0 - voir aussi xvfb-run comme mentionné par @ema
fijiaaron
Pour les futurs abonnés, j'ai décrit ma solution pour Ubuntu Server: namekdev.net/2016/08/…
Namek

Réponses:

35

ouvrez un terminal et exécutez cette commande xhost +. Ces commandes doivent être exécutées chaque fois que vous redémarrez votre machine. Si tout fonctionne correctement, vous pouvez l'ajouter aux commandes de démarrage

Assurez-vous également que votre fichier / etc / environment contient une ligne

export DISPLAY=:0.0 

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

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

UN J
la source
Il vous suffit d'exécuter java -jar selenium-server-standalone-2.0b3.jar à partir de la ligne de commande, puis d'exécuter vos tests
AJ
Je suis sur une instance EC2, donc il n'y a pas d'interface graphique. xhost: impossible d'ouvrir l'affichage ": 0.0"
TIMEX
@owa Vous avez également besoin de la variable d'environnement DISPLAY dans l'environnement client.
Keith
10
xhost +n'est pas sûr. S'il-vous-plait, ne l'utilisez pas. Si vous devez utiliser xhost, ajoutez la machine spécifique que vous voulez et non + (c'est-à-dire tout ce que vous voulez).
Sardathrion - contre les abus SE
170

Vous pouvez utiliser PyVirtualDisplay (un wrapper Python pour Xvfb) pour exécuter des tests WebDriver headless.

#!/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'informations


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, 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.
Corey Goldberg
la source
2
@Andrei OSX n'utilise pas X11 par défaut
sam boosalis
Utilisé cette réponse pour le faire fonctionner avec vagrant + PyCharm + Django sur OS X: stackoverflow.com/q/29343109
chachan
J'obtiens un "navigateur semble avoir quitté" lorsque j'implémente le code pyvirtualdisplay ci
gtownrower
45

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!

ema
la source
C'est exactement ce que je cherchais. Démarrer Xvfb seul ne semblait pas fonctionner pour moi, mais utiliser xvfb-run a fait l'affaire. Merci.
Reina Abolofia
9
Le DISPLAY=:1n'est pas nécessaire; xvfb-run définit la variable d'environnement DISPLAY sur autre chose (généralement :99) avant de démarrer la commande spécifiée (dans votre cas, java -jar selenium-server...)
Alex Dupuy
20

Voici 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 init.dfichier 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
    écho "."
    ;;
  Arrêtez)
    echo -n "Arrêt du tampon de trame X virtuel: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    écho "."
    ;;
  redémarrer)
    0 $ d'arrêt
    $ 0 début
    ;;
  *)
  echo "Utilisation: /etc/init.d/xvfb {start | stop | restart}"
  sortie 1
esac
sortie 0
shang
la source
J'ai fait exactement cela, puis j'ai exécuté mon script. Cependant, j'obtiens toujours ceci: Erreur: impossible d'ouvrir l'affichage:: 0. Dois-je également exécuter le serveur java sélénium? Il semble que peu importe si je l'exécute ou non ...
TIMEX
2
owalla, si vous utilisez WebDriver, vous n'avez pas besoin de Selenium Java Server.
Corey Goldberg
3

Si vous utilisez Maven, vous pouvez utiliser xvfb-maven-plugin pour démarrer xvfb avant les tests, les exécuter en utilisant DISPLAYla variable d'environnement associée et arrêter xvfb après tout.

Toilal
la source