Wie laufe ich Selen in Xvfb?

Ich bin auf EC2 Instanz. Also gibt es keine GUI.

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

Dann mache ich das:

 $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 

Großartig, alles sollte jetzt funktionieren, richtig?

Wenn ich meinen Code ausführe:

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

Ich bekomme das:

 Error: cannot open display: :0 

6 Solutions collect form web for “Wie laufe ich Selen in Xvfb?”

Öffnen Sie ein Terminal und führen Sie diesen Befehl xhost + . Diese Befehle müssen bei jedem Neustart des Rechners ausgeführt werden. Wenn alles gut funktioniert, kannst du das bei Startbefehlen hinzufügen

Stellen Sie auch sicher, dass in Ihrer / etc / environment-Datei eine Zeile vorhanden ist

 export DISPLAY=:0.0 

Und dann, führen Sie Ihre Tests zu sehen, ob Ihr Problem gelöst ist.

Alle bitte beachten Sie den Kommentar von sardathrion unten, bevor Sie diese verwenden.

Sie können PyvirtualDisplay (ein Python-Wrapper für Xvfb) verwenden, um kopflose WebDriver-Tests auszuführen.

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

Mehr Infos


Sie können auch xvfbwrapper verwenden , was ein ähnliches Modul ist (hat aber keine externen Abhängigkeiten):

 from xvfbwrapper import Xvfb vdisplay = Xvfb() vdisplay.start() # launch stuff inside virtual display here vdisplay.stop() 

Oder besser noch, verwenden Sie es als Kontext Manager:

 from xvfbwrapper import Xvfb with Xvfb() as xvfb: # launch stuff inside virtual display here. # It starts/stops in this code block. 

Der einfachste Weg ist wahrscheinlich, xvfb-run zu verwenden:

 DISPLAY=:1 xvfb-run java -jar selenium-server-standalone-2.0b3.jar 

Xvfb-run tut die ganze X-Behörde für dich tanzen, probier es aus!

Dies ist das Setup, das ich verwende:

Bevor Sie die Tests durchführen, führen Sie aus:

  Exportieren DISPLAY =: 99
 /etc/init.d/xvfb starten

Und nach den Tests:

  /etc/init.d/xvfb stoppen 

Die init.d Datei, die ich verwende, sieht so aus:

  #! / Bin / bash

 XVFB = / usr / bin / Xvfb
 XVFBARGS = "$ DISPLAY -ac-Bildschirm 0 1024x768x16"
 PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
 Fall "$ 1" in
   Anfang)
     Echo -n "Starten des virtuellen X-Frame-Puffers: Xvfb"
     / Sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
     Echo "."
     ;;
   halt)
     Echo -n "Stoppen des virtuellen X-Frame-Puffers: Xvfb"
     / Sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
     Echo "."
     ;;
   Neustart)
     $ 0 stoppen
     $ 0 Start
     ;;
   *)
   Echo "Verwendung: /etc/init.d/xvfb {start | stop | restart}"
   Ausgang 1
 Esac
 Ausfahrt 0 

Wenn du Maven benutzt hast, kannst du xvfb-maven-plugin verwenden , um xvfb vor Tests zu starten, sie mit der entsprechenden DISPLAY Umgebungsvariable DISPLAY und gleichzeitig xvfb zu stoppen.

In meinem Fall auf CentOS 7:

Pakete:

 PIP_PACKAGES="selenium pyvirtualdisplay" YUM_PACKAGES="python34-pip httpd firefox xorg-x11-server-Xvfb expect python34-paramiko" 

anzeigen:

 su --command="Xvfb :22 -screen 0 1024x768x16 > /dev/null 2>&1 &" root export DISPLAY=:22 

Einfacher Test:

 #!/usr/bin/env python3 from selenium import webdriver from pyvirtualdisplay import Display browser = webdriver.Firefox() browser.get('https://google.com') if "Google" in browser.title: print(browser.title) 
  • Wie kann man problemlos ascii-art Text drucken?
  • Checkbuttons und Tasten: mit Lambda
  • Tkinter matplotlib-Diagramm kann nicht mit Schaltflächen und benutzerdefinierten Daten aktualisiert werden
  • Wie werden Widgets in Tkinter aktualisiert?
  • DestroyWindow schließt das Fenster nicht auf Mac mit Python und OpenCV
  • Cross Platform, Sprache Agnostic GUI Markup Sprache?
  • Tkinter-Schaltflächen dynamisch erzeugen
  • Erstellen einer Tabelle wie Struktur in Python
  • Halten von GUIs, die während langwieriger Aufgaben reagieren
  • Einfache GUI mit Bildern
  • Wie machen virtuelle Maschinen GUI?
  • Python ist die beste Programmiersprache der Welt.