Ist es möglich, einen Selenium (Firefox) Web-Treiber ohne GUI auszuführen?


113

Wir erwägen, unseren Produktionsserver von Ubuntu- Desktop 10.04 auf Ubuntu- Server 12.04 zu aktualisieren .

Auf unserem aktuellen Desktop-Betriebssystem werden verschiedene Dienste ausgeführt, z. B. Selenium Web Driver. Meine Frage ist, ob der Selenium Web Driver von einem Cli-basierten System aus ausgeführt werden kann.

Mein unmittelbarer Gedanke ist, dass dies nicht möglich ist, da es auf Firefox beruht, aber ich möchte, dass jemand mir das Gegenteil beweist!


Antworten:


102

Was Sie suchen, ist ein .

Ja, es ist möglich, Selenium auf Firefox kopflos auszuführen. Hier ist ein Beitrag, dem du folgen kannst.

Hier sind die zusammenfassenden Schritte zum Einrichten von Xvfb

#install Xvfb
sudo apt-get install xvfb

#set display number to :99
Xvfb :99 -ac &
export DISPLAY=:99    

#you are now having an X display by Xvfb

5
Dies funktioniert und unterstützt Screenshots. Ich benutze das. Es funktioniert auch mit Google Chrome.
Isaac

Ich denke nicht, dass dies mehr funktioniert (zumindest nicht einfach, weil es einen neuen Geckodriver erfordert, ähnlich wie Chrom)
Archimedes Trajano

1
@ArchimedesTrajano Das funktioniert immer noch. Die Anweisungen dienen zum Erstellen einer virtuellen Anzeige mit Xvfbund nicht zum Installieren und Konfigurieren von Selen (für das geckodriverder Pfad erforderlich ist ).
Expz

2
Ich mache das gerne in Python, was Sie mit subprocess.Popen('Xvfb...')oder os.system('Xvfb...')machen können , aber stellen Sie sicher, dass Sie es tun, bevor Sie den Webdriver importieren.
Worte für den

4
Diese

22

Chrome hat jetzt einen Headless-Modus:

op = webdriver.ChromeOptions()
op.add_argument('headless')
driver = webdriver.Chrome(options=op)

4
PhantomJS befindet sich derzeit nicht in der aktiven Entwicklung. Das Git-Repository wird archiviert.
Wojciech Jakubas

1
Selenium hat auch die Unterstützung von PhantomJS mit der folgenden Meldung eingestellt: "UserWarning: Die Selenium-Unterstützung für PhantomJS wurde abgeschrieben. Verwenden Sie stattdessen kopflose Versionen von Chrome oder Firefox"
Jörg,

11

Ja. Sie können HTMLUnitDriverstattdessen für das FirefoxDriverStarten von Webdriver verwenden. Dies ist ein Headless-Browser-Setup. Details finden Sie hier .


1
Würde dies Funktionen wie save_screenshot () unterstützen? coreygoldberg.blogspot.co.uk/2011/06/…
zerbrechen

Ich habe es nicht versucht, aber es ist möglicherweise möglich, weil Sie effektiv noch eine Benutzeroberfläche erstellen, diese aber in einem "virtuellen" Fenster anzeigen.
Grahaminn

2
HTMLUnitDriver unterstützt KEINEN Screenshot, da der Inhalt überhaupt nicht gerendert wird (Ausgabe 1361). Eine Alternative, die ich mir vorstellen kann, ist die Verwendung von getHTMLSource und die Anzeige der HTML-Seite anstelle eines Screenshots.
AJ

10

Wenn Sie eine Headless-Browser-Unterstützung wünschen, können Sie einen anderen Ansatz wählen.

https://github.com/detro/ghostdriver

Es wurde während der Selenium-Konferenz angekündigt und befindet sich noch in der Entwicklung. Es verwendet PhantomJS als Browser und ist viel besser als HTMLUnitDriver. Es gibt noch keine Screenshots, aber es befindet sich noch in der aktiven Entwicklung.


4

Eine optionale Verwendung ist pyvirtualdisplaywie folgt :

from pyvirtualdisplay import Display

display = Display(visible=0, size=[800, 600])
display.start()

#do selenium job here

display.close()

Eine kürzere Version ist:

with Display() as display:
    # selenium job here

Dies ist im Allgemeinen eine Python-Kapselung xvfbund irgendwie praktischer.

Übrigens, obwohl PhantomJSes sich um einen kopflosen Browser handelt und kein Fenster geöffnet wird, wenn Sie ihn verwenden, scheint es, dass Sie PhantomJSimmer noch eine GUI-Umgebung benötigen, um zu funktionieren.

Ich habe den Fehlercode -6 erhalten, wenn ich ihn PhantomJS()anstelle des Firefox()Headless-Modus (Kitt-Konsole) verwende. In der Desktop-Umgebung ist jedoch alles in Ordnung.


3

UPDATE: Sie benötigen XVFB nicht mehr, um Headfox ohne Kopf auszuführen. Firefox v55 + unter Linux und Firefox v56 + unter Windows / Mac unterstützen jetzt die kopflose Ausführung.

Ich habe hier einige Anleitungen zur Verwendung hinzugefügt:

https://developer.mozilla.org/en-US/Firefox/Headless_mode#Selenium_in_Java


1
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Bhargav Rao

Das hat bei mir nicht funktioniert. Ich bin mir nicht sicher, aber ich denke, XVFB ist immer noch erforderlich.
Max Malysh

Ich verwende seit einigen Jahren kopflose Browser in Firefox und Chrome. Die WebDriver-Oberfläche für Selenium unterstützt jetzt sogar einen setHeadless-Parameter.
Nicholas DiPiazza


1

Beachten Sie, dass der HtmlUnitDriver-Webclient Single-Threaded ist und Ghostdriver nur 40% der Funktionen eines WebDrivers bietet.

Trotzdem läuft Ghostdriver für Tests ordnungsgemäß und ich habe Probleme, es mit dem WebDriver-Hub zu verbinden.


Bietet dies neue Informationen, die die anderen Antworten nicht liefern?
Austin Henley

0

Ja, Sie können Testskripte ohne Browser ausführen. Sie sollten sie jedoch im Headless-Modus ausführen.


0

Möglicherweise müssen Sie Ihre Fenstergröße festlegen. so wie:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920x1080');

browser = webdriver.Chrome(options=options,executable_path = './chromedriver')

Wenn dies auch nicht funktioniert, versuchen Sie, die Fenstergröße zu vergrößern.


0

Installieren und Ausführen von containerisiertem Firefox:

docker pull selenium/standalone-firefox
docker run --rm -d -p 4444:4444 --shm-size=2g selenium/standalone-firefox

Verbinden Sie mit webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.