È possibile eseguire il driver web selenium (Firefox) senza una GUI?


113

Stiamo valutando di aggiornare il nostro server di produzione da Ubuntu desktop 10.04 a Ubuntu server 12.04.

Abbiamo vari servizi in esecuzione sul nostro attuale sistema operativo desktop come Selenium Web Driver. La mia domanda è: il Selenium Web Driver può essere eseguito da un sistema basato su cli?

Il mio pensiero immediato è che non può, perché si basa su Firefox, ma mi piacerebbe che qualcuno mi dimostrasse che ho torto!


Risposte:


102

Quello che stai cercando è un file .

Sì, è possibile eseguire Selenium su Firefox senza testa. Ecco un post che puoi seguire.

Ecco i passaggi di riepilogo per configurare 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
Funziona e supporta gli screenshot. Io uso questo. Funziona anche con Google Chrome.
Isaac

Non penso che funzioni più (almeno non facilmente, perché richiede un nuovo geckodriver proprio come ha fatto Chrome)
Archimedes Trajano

1
@ArchimedesTrajano Funziona ancora. Le istruzioni sono per creare un display virtuale utilizzando Xvfb, non per installare e configurare Selenium (che richiede di avere geckodriversul percorso).
expz

2
Mi piace farlo da Python, cosa che puoi fare con subprocess.Popen('Xvfb...')o os.system('Xvfb...'), ma assicurati di farlo prima di importare il webdriver.
parole per l'

4
quel collegamento è ora interrotto
oldboy

22

Chrome ora ha una modalità senza testa:

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

4
PhantomJS non è attualmente in fase di sviluppo attivo. Il repository Git viene archiviato.
Wojciech Jakubas

1
Selenium ha anche smesso di supportare PhantomJS con il seguente messaggio "Avvertenza utente: il supporto Selenium per PhantomJS è stato deprezzato, si prega di utilizzare versioni headless di Chrome o Firefox"
Jörg

11

Sì. Puoi usare HTMLUnitDriverinvece per l' FirefoxDriveravvio di webdriver. Questa è la configurazione del browser senza testa. I dettagli possono essere trovati qui .


1
Questo supporterebbe funzioni come save_screenshot ()? coreygoldberg.blogspot.co.uk/2011/06/...
nonshatter

Non ho provato, ma potrebbe essere possibile perché in realtà stai ancora creando un'interfaccia utente, ma mostrandola su una finestra "virtuale".
grahaminn

2
HTMLUnitDriver NON supporterà l'acquisizione di screenshot poiché il contenuto non viene visualizzato affatto (problema 1361). Un'alternativa a cui posso pensare è usare getHTMLSource e mostrare la pagina HTML invece dello screenshot.
AJ

10

Se desideri il supporto del browser headless, esiste un altro approccio che potresti adottare.

https://github.com/detro/ghostdriver

È stato annunciato durante la Selenium Conference ed è ancora in fase di sviluppo. Usa PhantomJS come browser ed è molto meglio di HTMLUnitDriver, non ci sono ancora screenshot, ma è ancora in fase di sviluppo attivo.


4

Un optional è usare in pyvirtualdisplayquesto modo:

from pyvirtualdisplay import Display

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

#do selenium job here

display.close()

Una versione più breve è:

with Display() as display:
    # selenium job here

Questo è generalmente un incapsulamento di Python xvfbe in qualche modo più conveniente.

A proposito, sebbene PhantomJSsia un browser headless e nessuna finestra sarà aperta se lo usi, sembra che abbia PhantomJSancora bisogno di un ambiente gui per funzionare.

Ho ricevuto il codice di errore -6 quando uso PhantomJS()invece che Firefox()in modalità headless (console collegata a mastice). Comunque tutto è ok nell'ambiente desktop.


3

AGGIORNAMENTO: non è più necessario XVFB per eseguire Firefox senza testa. Firefox v55 + su Linux e Firefox v56 + su Windows / Mac ora supporta l'esecuzione senza testa.

Ho aggiunto un po 'di documentazione su come usare qui:

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


1
I commenti non sono per discussioni estese; questa conversazione è stata spostata nella chat .
Bhargav Rao

Questo non ha funzionato per me. Non ne sono sicuro, ma penso che XVFB sia ancora necessario.
Max Malysh

Uso browser headless su Firefox e Chrome da diversi anni. L'interfaccia WebDriver per Selenium ora supporta anche un parametro setHeadless.
Nicholas DiPiazza


1

Tieni presente che HtmlUnitDriver webclient è a thread singolo e Ghostdriver è solo al 40% delle funzionalità per essere un WebDriver.

Tuttavia, Ghostdriver funziona correttamente per i test e ho problemi a collegarlo all'hub WebDriver.


Ciò fornisce nuove informazioni che le altre risposte non forniscono?
Austin Henley,

0

Sì, puoi eseguire script di test senza browser, ma dovresti eseguirli in modalità headless.


0

forse devi impostare la dimensione della finestra. proprio come:

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

se anche non funziona, prova ad aumentare la dimensione della finestra.


0

Installa ed esegui Firefox containerizzato:

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

Connetti usando webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.