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