Как использовать официальные изображения докера селена? - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь настроить консольное приложение .NET Core, которое использует Selenium Webdriver с Firefox в Docker, но мне трудно понять, как на самом деле использовать официальные образы док-станции Selenium .

На данный момент консольное приложение - это просто приложение, которое пытается зайти на Google.com и отчитаться успешно.

Я последовательно получаю следующее сообщение об ошибке при попытке создать новый FirefoxDriver:

Ожидаемое двоичное расположение браузера, но не удается найти двоичный файл в расположении по умолчанию, не предусмотрена возможность 'moz: firefoxOptions.binary' и не задан двоичный флаг в командной строке (SessionNotCreated)

Вот файл Docker (сгенерированный расширением VSCode Docker + одна строка, добавленная мной, закомментирована сейчас):

FROM microsoft/dotnet:2.1-runtime AS base
WORKDIR /app

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["MyAppName.csproj", "./"]
RUN dotnet restore "./MyAppName.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyAppName.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "MyAppName.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .

# FROM selenium/standalone-firefox-debug ## where does this go?

ENTRYPOINT ["dotnet", "MyAppName.dll"]

Я пытался вставить автономное изображение селена на различныхточки, попытка начать с точки входа '/ bin / bash /', чтобы попытаться выяснить, действительно ли Firefox находится на изображении (чего он не сделалвроде бы не на штатных местах).Он по-прежнему выдает исключение.

На самом деле все, что я хочу, - это установить Firefox в моем контейнере, чтобы я мог запустить свое консольное приложение .NET Core, но, согласно некоторым поискам Google, самый простой способ сделать это должен бытьчерез изображения селена.

Как правильно использовать образ докера селена?

1 Ответ

0 голосов
/ 10 декабря 2018

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

Я понял это.

Лучший способ сделать это с помощью docker-compose для запуска 3 разных сервисов: мой C # скрипт, сервис селена хаба и узел селена firefox.(Вы можете сделать это с просто скриптом и автономным изображением селеного firefox, но я просто публикую первое, что сработало для меня. Попробую другие вещи позже)

Я удалил оператор FROM selenium/standalone-firefox-debug из Dockerfile приложения .NET Core Console, а затем поместил следующий файл docker-compose.yml в ту же папку, что и мой Dockerfile (большая часть его взята из этого ответа stackoverflow ):

version: '2'
services:
  seltest:
    build:
      context: .
    volumes:
      - ./temp:/usr/src/app/target
    environment:
        - HUB_PORT_4444_TCP_ADDR=seleniumhub
        - HUB_PORT_4444_TCP_PORT=4444
    depends_on:
        - seleniumhub
  seleniumhub:
    image: selenium/hub
    ports:
      - 4444:4444
  firefoxnode:
    image: selenium/node-firefox-debug
    ports:
      - 5900
    environment:
        - HUB_PORT_4444_TCP_ADDR=seleniumhub
        - HUB_PORT_4444_TCP_PORT=4444

В моем скрипте C # мне теперь пришлось внести некоторые изменения.Мне пришлось подключить мой удаленный веб-драйвер к правильному URI:

IWebDriver driver = new RemoteWebDriver(new Uri("http://seleniumhub:4444/wd/hub"), firefoxOptions);

( seleniumhub : 4444, потому что имя службы, которую я создаю в docker-compose.yml, равно seleniumhub и 4444 - это порт, открытый для этой службы)

И поскольку depends_on в docker-compose ожидает только запуска служб, а не до тех пор, пока они не будут «готовы» , Я прибег к хакерскому способу обеспечения готовности концентратора selenium и сервиса firefox, прежде чем пытаться их использовать, и просто выполнил:

Thread.Sleep(10000);

перед вызовом удаленного веб-драйвера.Если я не сделать это, то я получаю следующую ошибку при попытке вызвать веб-драйвер:

Необработанное исключение: OpenQA.Selenium.WebDriverException: исключение с нулевым ответом быловыбросил отправку HTTP-запроса на удаленный сервер WebDriver для URL http://seleniumhub:4444/wd/hub/session. Состояние исключения было UnknownError, и сообщение было: Соединение отказано Соединение отказано ---> System.Net.WebException: Соединение отказано Соединение отказано --> System.Net.Http.HttpRequestException: соединение отклонено ---> System.Net.Sockets.SocketException: соединение отклонено

Затем я просто запускаю docker compose up из командной строки, чтобы запуститьи я могу убедиться, что мой C # скрипт успешно достиг https://www.google.com.

Похоже, что в целом его можно оптимизировать разными способами, но для меня доказательство концепции сделано!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...