È 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.