Как я могу запустить драйвер selenium chrome в контейнере докера?

ТЛ; др

Как я могу установить все компоненты для запуска Selenium в контейнере докеров?


Вопрос

Я начинаю с этого изображения:

FROM microsoft/aspnetcore-build:2 AS builder
WORKDIR /source

COPY . .
RUN dotnet restore
RUN dotnet build
ENTRYPOINT ["dotnet", "run"]

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

ChromeOptions options = new ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--disable-gpu");
var driverPath = Path.GetFullPath(Path.Combine(environment.ContentRootPath, "bin/Debug/netcoreapp2.0"));
return new ChromeDriver(driverPath, options, TimeSpan.FromSeconds(60));

в контейнере докера?


Что я пробовал?

Установка драйвера Chrome

chromedriver через пакет Selenium.WebDriver.ChromeDriver NuGet.

Установка Chrome

На моей Mac OS X с установленным Google Chrome текущая настройка работает отлично.

Я попытался добавить эти строки:

RUN apt-get update && apt-get -y install libglib2.0-dev libxi6 libnss3-dev
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update && apt-get -y install google-chrome-stable

Вышеописанная версия Chrome:

google-chrome-stable:
  Installed: 64.0.3282.119-1
  Candidate: 64.0.3282.119-1
  Version table:
 *** 64.0.3282.119-1 500
        500 http://dl.google.com/linux/chrome/deb stable/main amd64 Packages
        100 /var/lib/dpkg/status

который совместим с версией драйвера Chrome.

которые исходят от попытки решить каждую ошибку, возникшую при попытке запустить Selenium с контейнером докера.

Если я запустил эту настройку, я получаю:

Запуск ChromeDriver 2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881) на порту 57889 Разрешены только локальные подключения. При отправке запроса произошла ошибка. Не удалось подключиться к

при запуске контейнера.

Отладка в контейнере

Если я войду в контейнер вручную и попробую запустить драйвер chrome вручную, я получаю:

Запуск ChromeDriver 2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881) на порту 9515 Разрешены только локальные подключения.

и работает curl -i http://localhost:9515/status Я получаю:

HTTP/1.1 200 OK
Content-Length:136
Content-Type:application/json; charset=utf-8
Connection:close

{"sessionId":"","status":0,"value":{"build":{"version":"alpha"},"os":{"arch":"x86_64","name":"Linux","version":"4.9.60-linuxkit-aufs"}}}

поэтому кажется, что драйвер работает отлично.

Если я запускаю хром без головы, вместо этого с помощью google-chrome-stable --headless --disable-cpu --no-sandbox я получаю:

[0125/210641.877388:WARNING:discardable_shared_memory_manager.cc(178)] Less than 64MB of free space in temporary directory for shared memory files: 63
[0125/210641.902689:ERROR:instance.cc(49)] Unable to locate service manifest for metrics
[0125/210641.902756:ERROR:service_manager.cc(890)] Failed to resolve service name: metrics
[0125/210642.031088:ERROR:instance.cc(49)] Unable to locate service manifest for metrics
[0125/210642.031119:ERROR:service_manager.cc(890)] Failed to resolve service name: metrics
[0125/210642.032934:ERROR:gpu_process_transport_factory.cc(1009)] Lost UI shared context.

Первое предупреждение можно решить, установив громкость докера в /dev/shm: /dev/shm или установив -shm-size на что-то большое (выше 64 МБ).

Остальные ошибки, если google, приводят ко многим отчетам об ошибках из репозиториев Google Chrome.

Ответ 1

Там очень аккуратная структура, построенная вокруг контейнеров Docker, используется в качестве местоположений удаленных драйверов.

http://aerokube.com/selenoid/latest/

Я еще не полностью его реализовал, но мне удалось без труда создать контейнеры для докеров с соответствующими драйверами chrome и firefox внутри.

Ответ 2

Наиболее популярными вариантами являются "докер селен" или "селеноид". Реализация отличается, но оба решения используют преимущества докера для создания тестовой среды, аналогичной сетке селена.

Я рекомендую "selenoid" и для его правильной настройки вы можете начать со следующего руководства: https://www.swtestacademy.com/selenoid-tutorial/

Если вы выберете "Docker selenium", это может быть отправной точкой: https://www.swtestacademy.com/docker-selenium-tutorial/