Не удалось открыть соединение с шиной сообщений «session»: невозможно автоматически запустить dbus-демон без $DISPLAY для X11

#selenium #firefox #geckodriver

#selenium #firefox #geckodriver

Вопрос:

Я могу запустить скрипт в Linux, но на том же компьютере, если apache запускает скрипт, я получаю TimeoutException. Message: connection refused

Заглянув в geckodriver.log, он говорит:

 1604976847149   mozrunner::runner   INFO    Running command: "/usr/bin/firefox" "-marionette" "-headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofilehZbDYR" 

Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Running without a11y support!

*** You are running in headless mode.
  

Я думаю, что эта часть — просто предупреждение, а не ошибка? Я не уверен.

Чтобы запустить Firefox, я в основном делаю это: https://github.com/timgrossmann/InstaPy/blob/master/instapy/browser.py

Который не использует XVFB или любой виртуальный дисплей, только «-headless» и расширение Firefox.

Есть идеи, почему этот код будет работать безупречно в командной строке, но не в том случае, если он вызывается из apache?

Вот полная трассировка:

 TimeoutException: Message: connection refused

  File "django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "mainapp/views.py", line 277, in api
    send_message(message, recipient_username)
  File "scripts/browser_login.py", line 434, in send_message
    driver = browser_login(username, password)
  File "scripts/browser_login.py", line 123, in browser_login
    options=firefox_options,
  File "selenium/webdriver/firefox/webdriver.py", line 162, in __init__
    keep_alive=True)
  File "selenium/webdriver/remote/webdriver.py", line 154, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "selenium/webdriver/remote/webdriver.py", line 243, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
  

Это происходит ровно через 60 секунд после запуска скрипта. Он находится при инициализации webdriver.

Ответ №1:

Есть идеи, почему этот код будет работать безупречно в командной строке, но не в том случае, если он вызывается из apache?
Это происходит ровно через 60 секунд после запуска скрипта. Он находится при инициализации webdriver.

Это может произойти из-за geckodriver сбоя установки или несовместимости версий между geckodriver и Firefox, чтобы предотвратить это использование geckodriver-autoinstaller для автоматической загрузки и установки geckodriver , поддерживающей текущую установленную версию Firefox.

  1. Добавьте следующий модуль requirements.txt и установите его.
 geckodriver-autoinstaller==0.1.0
  
  1. Удалите свой предыдущий geckodriver установочный код browser.py и добавьте следующие строки в начале.
 import geckodriver_autoinstaller  
geckodriver_autoinstaller.install()  
  
  1. Если вы выполняете удаленное выполнение, то выполняйте необходимые настройки для запуска command pip install -r requirements.txt каждый раз перед выполнением любого файла python.
  2. Наконец, запустите скрипт browser.py .

Комментарии:

1. Firefox — 68.12.0esr, а geckodriver — 0.26.0 в моей тестовой среде.

2. В соответствии с Mozilla geckodriver поддерживаемые платформы для версии Firefox> = 60, версия geckodriver должна быть> = 0.26.0, а версия Selenium> = 3.11 с Python 3.14. Проверьте, все ли они выполнены.

3. Selenium равен 3.11, а Python равен 2.7

4. Вы можете либо перейти на Python 3, ЛИБО в строке 38 указать версию geckodriver , в противном случае будет получена последняя версия, которая не поддерживает Python 2.7. Укажите версию как gdd.download_and_install("v0.20.1") , также используйте Selenium 3.5 и версии Firefox между 55 и 62.