Перейти к содержимому

Фотография

Вызов FirefoxDriver из вэб-приложения

firefox selenium docker

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 Fruzenshtein

Fruzenshtein

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 01 декабря 2019 - 14:14

Добрй день

 

Я использую Selenium WebDriver не для целей тестирования, а как часть бизнес логики в вэб-приложении — когда приходит запрос на сервер (GET /run-selenium), то по его параметрам формируется некий адрес, который открывается с помощью FirefoxDriver'a. 

 

Вот часть кода, которая грубо говоря передает то, что происходит с вэбрайвером

 

val firefoxBinary = new FirefoxBinary()
firefoxBinary.addCommandLineOptions("--headless")

val firefoxOptions = new FirefoxOptions()
firefoxOptions.setBinary(firefoxBinary)

val webDriver = new FirefoxDriver(firefoxOptions)
webDriver.get(s"https://google.com")
webDriver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS)
logger.info(s"Title: ${webDriver.getTitle}")
webDriver.close()

 

Локально все отрабатывает, как надо. Но когда я запаковываю приложение в докер, то я получаю такую ошибку:

 

Error servicing request: GET /run-selenium from 172.17.0.1 {{ org.openqa.selenium.WebDriverException: java.net.ConnectException: Failed to connect to localhost/127.0.0.1:9340

Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'

System info: host: '4fb27eff9adc', ip: '172.17.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '4.9.184-linuxkit', java.version: '1.8.0_212'

Driver info: driver.version: FirefoxDriver }}

org.openqa.selenium.WebDriverException: java.net.ConnectException: Failed to connect to localhost/127.0.0.1:9340

Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'

System info: host: '4fb27eff9adc', ip: '172.17.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '4.9.184-linuxkit', java.version: '1.8.0_212'

Driver info: driver.version: FirefoxDriver

at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:92)

at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)

at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)

at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)

at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:147)

at com.vidiq.seleniumkill.http.PublicRouter$$anonfun$httpService$1.applyOrElse(Router.scala:25)

at com.vidiq.seleniumkill.http.PublicRouter$$anonfun$httpService$1.applyOrElse(Router.scala:17)

at scala.PartialFunction$Lifted.apply(PartialFunction.scala:228)

at scala.PartialFunction$Lifted.apply(PartialFunction.scala:224)

at org.http4s.HttpRoutes$.$anonfun$of$2(HttpRoutes.scala:64)

at zio.RIO$.$anonfun$effectSuspend$1(RIO.scala:207)

at zio.internal.FiberContext.liftedTree1$1(FiberContext.scala:486)

at zio.internal.FiberContext.evaluateNow(FiberContext.scala:486)

at zio.internal.FiberContext.$anonfun$fork$1(FiberContext.scala:596)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

В качестве базового докер имэдажа я использую:

 

FROM openjdk:8-jre-alpine3.9
ARG firefox_ver=70.0
ARG geckodriver_ver=0.26.0

# Download and install deps
RUN apk update && apk add curl curl-dev

RUN mkdir /opt/docker && chmod a=rwX /opt/docker

# Download and install Firefox
RUN curl -fL -o /tmp/firefox.tar.bz2 https://ftp.mozilla....refox/releases/${firefox_ver}/linux-x86_64/en-GB/firefox-${firefox_ver}.tar.bz2 \
&& tar -xjf /tmp/firefox.tar.bz2 -C /tmp/ && mv /tmp/firefox /opt/docker

# Download and install geckodriver
RUN curl -fL -o /tmp/geckodriver.tar.gz \
https://github.com/m...ases/download/v${geckodriver_ver}/geckodriver-v${geckodriver_ver}-linux64.tar.gz \
&& tar -xzf /tmp/geckodriver.tar.gz -C /tmp/ && chmod +x /tmp/geckodriver && mv /tmp/geckodriver /opt/docker

ENV PATH="/opt/docker/firefox:${PATH}"

 

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

 

Я уже убедился, что linux user, из-под которого бежит докер имеет все права на выполнение фаерфокса и гекодрайвера, читал про совместимость версий селениума, вебрайвера и гекодрайвера и т д


  • 0

#2 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 01 декабря 2019 - 14:38

Не придумывайте велосипед. Используйте официальные докеры:

https://github.com/S...docker-selenium

https://hub.docker.com/u/selenium


  • 0

#3 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 01 декабря 2019 - 14:38

как запускаете docker run -p 9340:9340 

 

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

 

Failed to connect to localhost/127.0.0.1:9340 

 

посмотрел внимательнее действительно делайте как посоветовал 

BabyRoot  

 

у вас нет комады которую докер в демоне запустит а команда по умолчанию вам не подойдет

ну и  X нужен тоже без него думею никак.


  • 0

#4 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 01 декабря 2019 - 16:38

BabyRoot 
 я так думаю что @

Fruzenshtein

хочет  headless FF в докер посадить (я тоже хочу) но в таком случае неясно как запустить geckodrier как сервис / daemon чтобы контейнер продолжал работать и ждал теста -  не подскажете как это делается ? 


  • 0

#5 Fruzenshtein

Fruzenshtein

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 01 декабря 2019 - 17:55

Запускаю я собраный докер через кубернетис. Грубо говоря, для этого все сводится к команде docker run -p 80:8080

>
Failed to connect to localhost/127.0.0.1:9340 

Эта строка говорит о том, что JVM процес стартует фаерфокс и не может подключится к его динамическому порту 9340 (для каждого нового запуска этот порт будет новым). Каждая вкладка фаерфокса имееть отдельный порт

 

Вопрос:

 

А разве гекодрайвер должегн бежать к сервис?

Или достаточно того, чтобы были его бинарники в ОС и на уровне JVM была указана проперти с его локацией


  • 0

#6 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 01 декабря 2019 - 18:07

Fruzenshtein 
докер нич не стартует

 

 

кроме того что в CMD https://blog.codeshi...t-instructions/

я так думаю...

так что в вашем случае там java -verison (вероятно унаследованный из базового альпин жре

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


  • 0

#7 Fruzenshtein

Fruzenshtein

    Новый участник

  • Members
  • Pip
  • 11 сообщений

Отправлено 01 декабря 2019 - 18:17

Fruzenshtein 
докер нич не стартует

 

 

кроме того что в CMD https://blog.codeshi...t-instructions/

я так думаю...

так что в вашем случае там java -verison (вероятно унаследованный из базового альпин жре

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

 

В моем финальном докере стартуется именно вэб-приложение. А в самом докер имедже есть все необходимые пре-установленные компоненты для селениума — фаерфокс (70) и гекодрайвер (0.26). 

Я не вижу логики в том, чтобы гекодрайвер бежал как сервис. Аргументом для этого служит рабочая версия аппки у меня локально на ноуте и в этом случае у меня гекодрайвер просто лежит в определенной папке и я к ней указываю путь


  • 0

#8 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 01 декабря 2019 - 18:35

 думаю конструктор FirefoxDriver его запускает локально а в докере (или в вагранте суть та же  удаленно запустить не может и пробует порт который какой то процесс должен слушать 


  • 0

#9 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 03 декабря 2019 - 15:04

Fruzenshtein

я кстати таки попробовал ваш пример доделать и обнаружи что во первых мозила 70 для запуска хоть и в headless вре равно требует  libgtk-3-0 libdbus-glib-1-2 libxt6 и все остальные 300 MB зависимостей  (и это для дебиан openjdk:8 - для основанного apline будет еще больше

и gecko слушает протокол https://w3c.github.i...rocessing-model
 

FROM openjdk:8
ARG firefox_ver="70.0"
# This version of Mozilla Firefox when healess was introduced
ARG geckodriver_ver=0.26.0
RUN mkdir /opt/docker && chmod a=rwX /opt/docker


RUN curl -fL -o /tmp/firefox.tar.bz2 https://ftp.mozilla.org/pub/firefox/releases/${firefox_ver}/linux-x86_64/en-GB/firefox-${firefox_ver}.tar.bz2 \
&& tar -xjf /tmp/firefox.tar.bz2 -C /tmp/ && mv /tmp/firefox /opt/docker


RUN curl -fL -o /tmp/geckodriver.tar.gz \
https://github.com/mozilla/geckodriver/releases/download/v${geckodriver_ver}/geckodriver-v${geckodriver_ver}-linux64.tar.gz \
&& tar -xzf /tmp/geckodriver.tar.gz -C /tmp/ && chmod +x /tmp/geckodriver && mv /tmp/geckodriver /opt/docker


ENV PATH="/opt/docker:/opt/docker/firefox/${PATH}"
EXPOSE 4444
CMD [ "geckodriver", "--host", "0.0.0.0", "--binary" , "/opt/docker/firefox/firefox" ]


docker run -p 4444:4444 -d firefox-example
curl -X POST http://localhost:4444/session -H "Content-Type:application/json" -d "{}" 2>/dev/null | jq '.' -
{
  "value": {
    "sessionId": "7281fd1e-ccc2-4da6-841f-1c7e6374bd52",
    "capabilities": {
      "acceptInsecureCerts": false,
      "browserName": "firefox",
      "browserVersion": "70.0",
      "moz:accessibilityChecks": false,
      "moz:geckodriverVersion": "0.26.0",
      "moz:headless": true,
      "moz:processID": 1575,
      "moz:profile": "/tmp/rust_mozprofile.yiTwTSUTdMjc",
      "moz:shutdownTimeout": 60000,
      "moz:useNonSpecCompliantPointerOrigin": false,
      "moz:webdriverClick": true,
      "pageLoadStrategy": "normal",
      "platformName": "linux",
      "rotatable": false,
      "setWindowRect": true,
      "strictFileInteractability": false,
      "timeouts": {
        "implicit": 0,
        "pageLoad": 300000,
        "script": 30000
      },
      "unhandledPromptBehavior": "dismiss and notify"
    }
  }
}

так что работавшие через Selenium тесты придется переписывать - из-за небольщих различий между низко-уровневом selenium и marionette


  • 0



Темы с аналогичным тегами firefox, selenium, docker

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных