Est-il possible d'exécuter le pilote Web Selenium (Firefox) sans interface graphique?

113

Nous envisageons de mettre à niveau notre serveur de production d'Ubuntu- desktop 10.04 vers Ubuntu server 12.04.

Nous avons divers services fonctionnant sur notre système d'exploitation de bureau actuel, comme Selenium Web Driver. Ma question est la suivante: le pilote Web Selenium peut-il être exécuté à partir d'un système basé sur cli?

Ma pensée immédiate est que ce n'est pas possible, car il repose sur Firefox, mais j'aimerais que quelqu'un me prouve le contraire!

sans éclat
la source

Réponses:

102

Ce que vous recherchez est un .

Oui, il est possible d'exécuter Selenium sur Firefox sans tête. Voici un article que vous pouvez suivre.

Voici les étapes récapitulatives pour configurer 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
la source
5
Cela fonctionne et prend en charge les captures d'écran. J'utilise ça. Cela fonctionne également avec Google Chrome.
Isaac
Je ne pense pas que cela fonctionne plus (du moins pas facilement, car cela nécessite un nouveau geckodriver un peu comme Chrome)
Archimedes Trajano
1
@ArchimedesTrajano Cela fonctionne toujours. Les instructions sont pour créer un affichage virtuel en utilisant Xvfb, pas pour installer et configurer Selenium (qui nécessite d'avoir geckodriversur le chemin).
expz
2
J'aime faire cela depuis Python, ce que vous pouvez faire avec subprocess.Popen('Xvfb...')ou os.system('Xvfb...'), mais assurez-vous de le faire avant d'importer le pilote Web.
wordsforthewise
4
ce lien est maintenant rompu
oldboy
22

Chrome dispose désormais d'un mode sans tête:

op = webdriver.ChromeOptions()
op.add_argument('headless')
driver = webdriver.Chrome(options=op)
Stéphane Bruckert
la source
4
PhantomJS n'est actuellement pas en développement actif. Le dépôt Git est archivé.
Wojciech Jakubas
1
Selenium a également cessé de prendre en charge PhantomJS avec le message suivant "UserWarning: la prise en charge de Selenium pour PhantomJS a été dépréciée, veuillez utiliser les versions headless de Chrome ou Firefox à la place"
Jörg
11

Oui. Vous pouvez utiliser à la HTMLUnitDriverplace pour FirefoxDriverlors du démarrage de Webdriver. Il s'agit d'une configuration de navigateur sans tête. Les détails peuvent être trouvés ici .

UN J
la source
1
Cela prendrait-il en charge des fonctions telles que save_screenshot ()? coreygoldberg.blogspot.co.uk/2011/06/…
nonshatter
Je n'ai pas essayé, mais cela peut être possible parce que vous créez toujours une interface utilisateur, mais que vous l'affichez dans une fenêtre `` virtuelle ''.
grahaminn
2
HTMLUnitDriver ne prendra PAS en charge la capture d'écran car le contenu n'est pas du tout rendu (problème 1361). Une alternative à laquelle je peux penser est d'utiliser getHTMLSource et d'afficher la page HTML plutôt que la capture d'écran.
AJ
10

Si vous voulez une prise en charge du navigateur sans tête, vous pouvez adopter une autre approche.

https://github.com/detro/ghostdriver

Il a été annoncé lors de la conférence Selenium et est toujours en développement. Il utilise PhantomJS comme navigateur et est bien meilleur que HTMLUnitDriver, il n'y a pas encore de captures d'écran, mais comme il est toujours en développement actif.

haroonzone
la source
4

Une option est à utiliser pyvirtualdisplaycomme ceci:

from pyvirtualdisplay import Display

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

#do selenium job here

display.close()

Une version plus courte est:

with Display() as display:
    # selenium job here

Il s'agit généralement d'un encapsulation de python xvfb, et plus pratique en quelque sorte.

À propos, bien qu'il s'agisse d' PhantomJSun navigateur sans tête et qu'aucune fenêtre ne soit ouverte si vous l'utilisez, il semble qu'il ait PhantomJSencore besoin d' un environnement d'interface graphique pour fonctionner.

J'ai le code d'erreur -6 lorsque j'utilise PhantomJS()au lieu de Firefox()mode sans tête (console connectée au mastic). Cependant, tout va bien dans l'environnement de bureau.

郑文勋
la source
3

MISE À JOUR: Vous n'avez plus besoin de XVFB pour exécuter Firefox sans tête. Firefox v55 + sous Linux et Firefox v56 + sous Windows / Mac prend désormais en charge l'exécution sans tête.

J'ai ajouté une documentation comment utiliser ici:

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

Nicolas DiPiazza
la source
1
Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacée vers le chat .
Bhargav Rao
Cela n'a pas fonctionné pour moi. Je ne suis pas sûr, mais je pense que XVFB est toujours nécessaire.
Max Malysh le
J'utilise des navigateurs sans tête sur Firefox et Chrome depuis plusieurs années maintenant. L'interface WebDriver pour Selenium prend même désormais en charge un paramètre setHeadless.
Nicholas DiPiazza le
1

Sachez que le client Web HtmlUnitDriver est mono-thread et que Ghostdriver ne représente que 40% des fonctionnalités pour être un WebDriver.

Néanmoins, Ghostdriver fonctionne correctement pour les tests et j'ai des problèmes pour le connecter au hub WebDriver.

guillemhs
la source
Cela fournit-il de nouvelles informations que les autres réponses ne fournissent pas?
Austin Henley le
0

Oui, vous pouvez exécuter des scripts de test sans navigateur, mais vous devez les exécuter en mode sans tête.

Vinee-the-Pooh
la source
0

peut-être que vous devez définir la dimension de votre fenêtre. juste comme:

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

si cela ne fonctionne pas non plus, essayez d'augmenter la taille de la fenêtre.

U2647
la source
0

Installez et exécutez Firefox en conteneur:

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

Connectez-vous en utilisant 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
la source