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

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.


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.

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!


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.