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!

Nicht zerbrechen
quelle

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
Grahaminn
quelle
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)
Stéphane Bruckert
quelle
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 .

AJ
quelle
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.

Haroonzone
quelle
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.

郑文勋
quelle
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

Nicholas DiPiazza
quelle
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.

Guillemhs
quelle
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.

Vinee-the-Pooh
quelle
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.

U2647
quelle
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')
Max Malysh
quelle