Как запустить селен-сайд-раннер в docker? - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно запустить Selen-Side-Runner в docker. Я написал в файле Docker, чтобы установить Google Chrome и googledrive. Но когда код выполняется, ошибка выглядит следующим образом:

 WebDriverError: unknown error: Chrome failed to start: exited abnormally.
 (unknown error: DevToolsActivePort file doesn't exist)
 (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
 at Object.throwDecodedError (../../usr/lib/node_modules/selenium-side-runner/node_modules/selenium-webdriver/lib/error.js:550:15)
 at parseHttpResponse (../../usr/lib/node_modules/selenium-side-runner/node_modules/selenium-webdriver/lib/http.js:560:13)
 at Executor.execute (../../usr/lib/node_modules/selenium-side-runner/node_modules/selenium-webdriver/lib/http.js:486:26)

это мой dockerfile

FROM python:3.6-stretch

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> 
/etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS 
chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# set display port to avoid crash
ENV DISPLAY=:99

RUN apt-get update
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash
RUN apt-get install -y nodejs
RUN apt-get install -y npm
RUN npm install -g selenium-side-runner

WORKDIR /app

ENTRYPOINT ["/entrypoint.sh"]

это мой код:

for ind, file in enumerate(test_file_list):
    file_path = os.path.join(self.save_path, file)
    start_time = timezone.now()
    result = subprocess.run(
        ['selenium-side-runner', '-c', "goog:chromeOptions.args=[--headless,--nogpu] 
         browserName=chrome",file_path])
    end_time = timezone.now()
    result_code = result.returncode

1 Ответ

1 голос
/ 29 апреля 2020

Взлом

Вместо ручной установки браузера, я бы рекомендовал использовать уже имеющиеся изображения, такие как https://github.com/SeleniumHQ/docker-selenium.

Решение (рекомендуется)

С архитектурной точки зрения каждый Docker контейнер должен иметь только одну цель. В вашем случае контейнер отвечает за запуск браузера и тестов. Вот почему я предлагаю разделить решение на два контейнера:

  • первый контейнер с файлами selenium-side-runner и .side, которые будут запускать тесты
  • , второй контейнер запускает браузер

Исходя из документы , selenium-side-runner могут работать с сеткой селена.

Итак, решение будет выглядеть как

  1. Подготовьте Dockerfile, который установит selenium-side-runner, добавит .side файлов и настроит ENTRYPOINT. Здесь вы также можете установить URL по умолчанию для Selenium Grid, например selenium-side-runner -w 10 --server http://selenium-browsers:4444/wd/hub, где selenium-browsers будет именем контейнера с браузером или Selenium Grid.
  2. Создайте свой собственный Docker image
  3. Создание Docker сети с docker network create selenium-tests
  4. Запуск браузера или Selenium Grid
    • Вариант 1: браузер. docker run -id --shm-size=2g --network selenium-tests --name selenium-browsers selenium/standalone-chrome:3.141.59-2020040 на основе SeleniumHQ / docker -селен
    • Вариант 2: Selenium Grid. SeleniumHQ / docker -селен содержит инструкции, как это сделать. Кроме того, вы можете посмотреть Zalenium или Selenoid , которые предоставляют дополнительные функции, такие как видеозапись, предварительный просмотр теста и т. Д. c.
  5. Запустите ваш контейнер с docker run -it --network selenium-tests --name my-tests <your custom image>

Поскольку оба контейнера находятся в одной пользовательской сети selenium-tests, оба контейнера могут связываться через имена контейнеров. Таким образом, контейнер my-tests может отправлять запросы в контейнер selenium-browsers (см. Параметр # 1 и --server).

При необходимости вы можете создать docker -compose.yaml файл позже, чтобы упростить использование решения.

...