Не находит Chromedriver при запуске теста (Selene + Python)

Решил перейти на xvfb и при попытке запуска не находит Chromedriver

Получаю ошибку:

WebDriverException: Message: Can not connect to the Service /root/.wdm/chromedriver/2.33/chromedriver

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/common/service.py:88: WebDriverException
------------------------------ Captured stdout call ------------------------------

Checking for linux64 chromedriver:2.33 in cache
Driver found in /root/.wdm/chromedriver/2.33/chromedriver

Код

from selenium import webdriver
from selene.api import *
from selene.browsers import BrowserName
config.browser_name = BrowserName.CHROME

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


class Test_simple:

    def test_1(self):
        browser.open_url('http://www.google.com')
        print browser.driver().title
        browser.quit()
        display.stop()

root@autotest:/home/autotesting2# chromium-browser -version
Chromium 62.0.3202.94 Built on Ubuntu , running on Ubuntu 16.04

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

Здесь описан подход:

Ставлю на то, что
chmod a+x на файл chromedriver должен решить проблему

Спасибо, но данный подход уже пробовал, проблема все та же. Еще нашел варианты махинации с файлом host. Пока без результата

host не помог. После некоторых махинация начал выводить вот такое

"> simple.py:13: in

class Test_simple:

simple.py:15: in Test_simple
driver = webdriver.Chrome()
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/webdriver.py:67: in init
desired_capabilities=desired_capabilities)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:91: in init
self.start_session(desired_capabilities, browser_profile)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:173: in start_session
‘desiredCapabilities’: desired_capabilities,
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:233: in execute
self.error_handler.check_response(response)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py:194: in check_response
raise exception_class(message, screen, stacktrace)
E WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
E (Driver info: chromedriver=2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4),platform=Linux 2.6.32-042stab120.11 x86_64)
"

А есть уверенность в том, что xvfb запускается и Chrome корректно в нем работает?
Как запускается все это?

Python -m pytest simple.ру где simple.py - название файла
На локальной машине этот код работает, а вот на сервере нет

не сталкивался с Selene, но по-моему, на сервере должна быть команда, вроде:

DISPLAY=:99 xvfb-run -a -s "-screen 0, 1366x768x24" *здесь хромдрайвер или seleniumserver*

У меня, по крайней мере, так работает. Т.е. либо хромдрайвер напрямую слушает запросы к нему, либо через сервер, но запускается это внутри xvfb
*Буду рад услышать более простые способы запуска, если такие есть. Просто у меня так работает с прошлого года и лишний раз пересматривать я не стал.

Спасибо, завтра попробую, отпишу

При запуске получил:
root@autotest:/home/autotesting2# DISPLAY=:99 xvfb-run -a -s “-screen 0, 1366x768x24” & python -m pytest simple.py
[2] 23014
xvfb-run: usage error: need a command to run
Usage: xvfb-run [OPTION …] COMMAND
Run COMMAND (usually an X client) in a virtual X server environment.
Options:
-a --auto-servernum try to get a free server number, starting at
–server-num
-e FILE --error-file=FILE file used to store xauth errors and Xvfb
output (default: /dev/null)
-f FILE --auth-file=FILE file used to store auth cookie
(default: ./.Xauthority)
-h --help display this usage message and exit
-n NUM --server-num=NUM server number to use (default: 100)
-l --listen-tcp enable TCP port listening in the X server
-p PROTO --xauth-protocol=PROTO X authority protocol name to use
(default: xauth command’s default)
-s ARGS --server-args=ARGS arguments (other than server number and
“-nolisten tcp”) to pass to the Xvfb server
(default: “-screen 0, 1366x768x24”)
============================= test session starts ==============================
platform linux2 – Python 2.7.12, pytest-3.2.1, py-1.4.34, pluggy-0.4.0
metadata: {‘Python’: ‘2.7.12’, ‘Platform’: ‘Linux-2.6.32-042stab120.11-x86_64-with-Ubuntu-16.04-xenial’, ‘Packages’: {‘py’: ‘1.4.34’, ‘pytest’: ‘3.2.1’, ‘pluggy’: ‘0.4.0’}, ‘Plugins’: {‘html’: ‘1.15.1’, ‘allure-pytest’: ‘2.2.2b2’, ‘metadata’: ‘1.5.0’}}
rootdir: /home/autotesting2, inifile:
plugins: metadata-1.5.0, html-1.15.1, allure-pytest-2.2.2b2
collected 0 items / 1 errors

===================================== ERRORS =====================================
___________________________ ERROR collecting simple.py ___________________________
simple.py:13: in
class Test_simple:
simple.py:15: in Test_simple
driver = webdriver.Chrome()
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/webdriver.py:67: in init
desired_capabilities=desired_capabilities)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:91: in init
self.start_session(desired_capabilities, browser_profile)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:173: in start_session
‘desiredCapabilities’: desired_capabilities,
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:233: in execute
self.error_handler.check_response(response)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py:194: in check_response
raise exception_class(message, screen, stacktrace)
E WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
E (Driver info: chromedriver=2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4),platform=Linux 2.6.32-042stab120.11 x86_64)
!!! Interrupted: 1 errors during collection !!!
============================ 1 error in 61.19 seconds ============================
[2]+ Exit 2 DISPLAY=:99 xvfb-run -a -s “-screen 0, 1366x768x24”
root@autotest:/home/autotesting2#

Может подскажите причину?

Не знаю подойдет вам такой подход, но все же попробуйте использовать докер (docker-compose)
будет что то типо одного файла docker-compose.yml

version: "3"
services:
  selenium-hub:
    image: selenium/hub:3.7.1
    container_name: selenium-hub
    ports:
      - "4444:4444"
  chrome:
    image: selenium/node-chrome:3.7.1
    depends_on:
      - selenium-hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium-hub
      - HUB_PORT_4444_TCP_PORT=4444
  firefox:
    image: selenium/node-firefox:3.7.1
    depends_on:
      - selenium-hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium-hub
      - HUB_PORT_4444_TCP_PORT=4444

Стартовать одной командой docker-compose up или при необходимости sudo docker-compose up(должен предупредить что могут возникнуть некоторые подводные камни)
Сами тесты будете крутить в нужном вам браузере

Спасибо, но в докере пока слабоват. Хотя если не решу проблему своими силами, попробую.

Смысл в том, что там не pytest должен быть, а запускаться хромдрайвер или селениум сервер
Конкретно в моем случае вся строка выглядит так:

xvfb-run -a -s "-screen 0, 1366x768x24" java -jar selenium-server-standalone-3.8.0.jar 1>/dev/null 2>/dev/null &

Возможно, пути надо будет прописать полностью.
После этого запускается xvfb и внутри него запускается selenium-server-standalone, который прослушивает порт 4444 (по дефолту). Тест должен обращаться к этому удаленному серверу. Т.е. в коде в качестве драйвера что-то вроде:

driver = webdriver.Remote("http://'IP того компьютера, на котором запущен xvfb':4444/wd/hub", webdriver.ChromeOptions().to_capabilities())

Чтоб это все работало, на сервере с xvfb должна быть java. Если планируется использовать только один chromedriver, то с некоторых пор запускать “java -jar selenium-server-standalone-3.8.0.jar” уже необязательно, вместо этого можно запустить chromedriver непосредственно и посмотреть на каком порту он будет прослушивать. Соответственно 4444 за менить на этот порт (9515 вроде). Как-то так:

xvfb-run -a -s "-screen 0, 1366x768x24" chromedriver 1>/dev/null 2>/dev/null &

У меня настроен первый вариант и я не проверял вариант 2, но все вроде так и должно работать.
Вот это вот:

1>/dev/null 2>/dev/null &

можно не писать, это для подавления вывода на экран.

Простите, может глупые вопросы, запустил команду :

vadim:~ user$ xvfb-run -a -s “-screen 0, 1366x768x24” java -jar selenium-server-standalone-3.8.0.jar 1>/dev/null 2>/dev/null &
[1] 5657
Это есть запуск xvfb ? Теперь надо давать команду запуска скрипта ?

Нормальные вопросы, все Ok. Да, xvfb работает, номер процесса в данном случае 5657.

Убедиться, что xvfb работает можно задав команду:

ps -f

В результате отобразится список процессов, среди которых будут присутствовать Xvfb и java
Если не задан номер порта (используется порт по умолчанию), то можно ввести команду

lsof -i:4444

и убедиться, что запущенный selenium server standalone этот порт прослушивает. (4444 заменить на соответствующие цифры, если используется другой порт).

Кстати, если набрать команду без 1>/dev/null 2>/dev/null &, то можно увидеть, что сервер запустился и готов работать, будет отображаться примерно следующее:

00:12:12.226 INFO - Selenium build info: version: ‘3.8.0’, revision: ‘unknown’
00:12:12.227 INFO - Launching a standalone Selenium Server
2017-12-16 00:12:12.240:INFO::main: Logging initialized @170ms to org.seleniumhq.jetty9.util.log.StdErrLog
00:12:12.277 INFO - Driver provider org.openqa.selenium.ie.InternetExplorerDriver registration is skipped:
registration capabilities Capabilities [{ensureCleanSession=true, browserName=internet explorer, version=, platform=WINDOWS}] does not match the current platform LINUX
00:12:12.278 INFO - Driver provider org.openqa.selenium.edge.EdgeDriver registration is skipped:
registration capabilities Capabilities [{browserName=MicrosoftEdge, version=, platform=WINDOWS}] does not match the current platform LINUX
00:12:12.278 INFO - Driver class not found: com.opera.core.systems.OperaDriver
00:12:12.278 INFO - Driver provider com.opera.core.systems.OperaDriver registration is skipped:
Unable to create new instances on this machine.
00:12:12.278 INFO - Driver class not found: com.opera.core.systems.OperaDriver
00:12:12.278 INFO - Driver provider com.opera.core.systems.OperaDriver is not registered
00:12:12.279 INFO - Driver provider org.openqa.selenium.safari.SafariDriver registration is skipped:
registration capabilities Capabilities [{browserName=safari, version=, platform=MAC}] does not match the current platform LINUX
2017-12-16 00:12:12.310:INFO:osjs.Server:main: jetty-9.4.3.v20170317
2017-12-16 00:12:12.336:INFO:osjsh.ContextHandler:main: Started o.s.j.s.ServletContextHandler@c038203{/,null,AVAILABLE}
2017-12-16 00:12:12.347:INFO:osjs.AbstractConnector:main: Started ServerConnector@7d9d1a19{HTTP/1.1,[http/1.1]}{0.0.0.0:4444}
2017-12-16 00:12:12.347:INFO:osjs.Server:main: Started @277ms
00:12:12.347 INFO - Selenium Server is up and running

При этом, запустив тест в другом окне терминала, можно наблюдать как selenium server выполняет команды.

00:12:33.353 INFO - Executing: [new session: Capabilities [{goog:chromeOptions={args=[start-maximized, disable-infobars], extensions=[], prefs={profile.managed_default_content_settings.notifications=1, credentials_enable_service=false, hardware.audio_capture_allowed_urls=[https:// адрес тестируемого сайта], profile.password_manager_enabled=false, hardware.video_capture_allowed_urls=[https:// адрес тестируемого сайта]}}, browserName=chrome, version=, platform=ANY}]])
00:12:33.367 INFO - Creating a new session for Capabilities [{goog:chromeOptions={args=[start-maximized, disable-infobars], extensions=[], prefs={profile.managed_default_content_settings.notifications=1, credentials_enable_service=false, hardware.audio_capture_allowed_urls=[https:// адрес тестируемого сайта], profile.password_manager_enabled=false, hardware.video_capture_allowed_urls=[https:// адрес тестируемого сайта]}}, browserName=chrome, version=, platform=ANY}]
Starting ChromeDriver 2.29.461571 (8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5) on port 24961
Only local connections are allowed.
00:12:33.869 INFO - Detected dialect: OSS
00:12:33.883 INFO - Done: [new session: Capabilities [{goog:chromeOptions={args=[start-maximized, disable-infobars], extensions=[], prefs={profile.managed_default_content_settings.notifications=1, credentials_enable_service=false, hardware.audio_capture_allowed_urls=[https:// адрес тестируемого сайта], profile.password_manager_enabled=false, hardware.video_capture_allowed_urls=[https:// адрес тестируемого сайта]}}, browserName=chrome, version=, platform=ANY}]]
00:12:34.041 INFO - Executing: [set window size])
00:12:34.171 INFO - Done: [set window size]
и так далее

В данном тесте первая команда устанавливает размер окна - [set window size]

Selenium server запускать в xfvb-run не требуется, запускайте ваш тест через него.

xvfb-run -a python test_simple.py

И вообще, можно без xvfb, достаточно использовать headless-режим в chrome, добавив параметр headless в desired capabilities

Не очень понятно как при этом xvfb найдет сервер. Изначально вопрос о запуске на сервере: [quote=“Mastaforka, post:6, topic:17862”]
На локальной машине этот код работает, а вот на сервере нет
[/quote]

Selenium server не нужен. Chromedriver сразу запускается менеджером, встроенном в Selene,
и в свою очередь запускает Chrome.
Указывать размер экрана для xvfb тоже не обязательно, главное размер окна установить.

В качестве лучшего варианта рекомендую Selenoid

где все уже настроено, и xvfb и vnc. И даже запись видео.

В свою очередь запускает Chrome на локальной машине? Не на удаленном сервере? Когда речь идет о запуске на сервере - не стоит путать это с запуском посредством Selenium server.
Или Selene умеет работать с удаленным сервером? Просто я не пользуюсь Selene, потому не знаю.

Selene безусловно умеет работать с Remote webdriver, по ссылке что я приводил как раз в примере он.
ТС имеет ввиду запуск теста на удалённой машине без дисплея. CI сервер или что-то подобное.
Цели использовать remote driver и Selenim Server нет.