2017-05-20 3 views
1

J'ai un script python qui ne sera déclenché qu'en appelant my.ip.address/test. Cela fonctionne bien si je lance le code PHP via la ligne de commande.Xvfb: connexion refusée lors de l'exécution du script de test via le navigateur sur Fedora

Cependant, si j'accéder au automatisation des tests via un navigateur en utilisant l'URL spécifiée, il me donne cette erreur:

Traceback (most recent call last): File "scripts/crawler.py", 
line 10, in driver = webdriver.Firefox(capabilities={"marionette":True}) File "/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.py", 
line 152, in __init__ keep_alive=True) File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", 
line 98, in __init__ self.start_session(desired_capabilities, browser_profile) File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", 
line 188, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", 
line 252, in execute self.error_handler.check_response(response) File "/usr/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py",  
line 194, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: connection refused 

Erreur dans geckodriver.log:

1495299180874 geckodriver::marionette INFO Starting browser /usr/lib/firefox/firefox with args ["-marionette"] 
Unable to init server: Could not connect: Connection refused 
Error: cannot open display: :99 

Déjà installé Xvfb et exécutez it:

$ whoami 
    codekaizer #with root privileges 
$ Xvfb :99 -screen 0 1024x768x24 -ac -fbdir /tmp/.X11-unix/X99 & 

Exécutez l'extrait de code PHP pour /test point final:

$cmd = 'xvfb-run -a python scripts/crawler.py' 
return shell_exec($cmd); 

Référence pour le code Python:

#!/usr/bin/env python2 

from pyvirtualdisplay import Display 
from selenium import webdriver 
import time 
import sys 

driver = webdriver.Firefox(capabilities={"marionette":True}) 

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

driver.get('https://www.google.com') 
print driver.title 
driver.close() 
display.stop() 

Je suis tout à fait bloqué en ce moment et vraiment apprécier l'aide de quelqu'un!

Détails:

  • Firefox 53,0
  • Geckodriver 0.16.1
  • Fedora 22 x86_64

Merci! - ck

+0

Vous devez instancier l'affichage avant d'instancier le navigateur. Changez ces lignes et faites-moi savoir si cela fonctionne. –

+0

Salut @LeviNoecker, merci. J'ai déjà mis à jour mon post. J'ai d'abord couru Xvfb puis couru le navigateur. Ça ne marche pas encore. Dans l'attente de vos pensées. – codekaizer

Répondre

0

Vous mélangez deux méthodes différentes pour utiliser Xvfb: l'exécuter à partir de la ligne de commande et l'exécuter à partir de pyvirtualdisplay. La raison pour laquelle l'approche en ligne de commande ne fonctionne pas est que vous ne connectez pas votre nouvelle instance Xvfb à votre affichage système et que l'approche pyvirtualdisplay ne fonctionne pas parce que vous tentez d'instancier le navigateur avant que pyvirtualdisplay ne crée un tampon d'image virtuelle pour l'exécution de votre instance de navigateur. Choisissez une approche, mais ne faites pas les deux.

Si vous voulez l'exécuter à partir de la ligne de commande, vous devez également exporter votre écran pour correspondre au port que vous définissez:

Xvfb :99 -screen 0 1024x768x24 -ac -fbdir /tmp/.X11-unix/X99 & 
export DISPLAY=:99 

python yourscript.py 

Ou, la meilleure façon est de laisser pyvirtualdisplay gérer tout cela programatically, comme vous le faites presque:

#!/usr/bin/env python2 

from pyvirtualdisplay import Display 
from selenium import webdriver 
import time 
import sys 

# Use an context manager to handle the start() and stop() 
# Instantiate Display BEFORE you try to instantiate the driver 
with Display(visible=0, size=(800,600)): 
    driver = webdriver.Firefox(capabilities={"marionette":True}) 

    try: 
     driver.get('https://www.google.com') 
     print driver.title 
    finally: 
     # A try/finally block like this insures the driver is closed even if an exception is thrown 
     driver.close() 
+0

merci Levi, ça marche. – codekaizer