Xvfb: соединение отказано при запуске тестового скрипта

У меня есть сценарий Python, который будет запускаться только при вызове my.ip.address/test, Это работает нормально, если я запускаю код PHP через командную строку.

Однако, если я получаю доступ к автоматизации тестирования через браузер, используя указанный URL-адрес, это дает мне эту ошибку:

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

Ошибка в 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

Уже установлено Xvfb и запустить его:

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

Запустить фрагмент кода PHP для /test конечная точка:

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

Ссылка на код 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()

Я сейчас застрял и очень ценю чью-то помощь!

Подробности:

  • Firefox 53.0
  • Geckodriver 0.16.1
  • Fedora 22 x86_64

Спасибо!
— ск

1

Решение

Вы смешиваете два разных метода использования Xvfb: запускаете его из командной строки и запускаете из pyvirtualdisplay. Причина, по которой подход командной строки не работает, заключается в том, что вы не подключаете свой новый экземпляр Xvfb к системному дисплею, а причина, по которой подход pyvirtualdisplay не работает, заключается в том, что вы пытаетесь создать экземпляр браузера до того, как pyvirtualdisplay создаст виртуальный фрейм-буфер для вашего экземпляра браузера для запуска. Выберите один подход, но не делайте оба.

Если вы хотите запустить его из командной строки, вы также должны экспортировать ваш DISPLAY в соответствии с заданным вами портом:

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

python yourscript.py

Или, лучший способ — позволить pyvirtualdisplay управлять всем этим программно, как вы почти делаете:

#!/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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]