Selenium на Docker: тестирование образа Docker в том же файле `docker-compose`

Сценарий:

  • Docker Image, на котором работает мое приложение localhost:9000
  • Изображения Docker с помощью Selenium Webdriver
  • Селеновые тесты, с которыми я хочу работать.

Я начал с этого SeleniumHQ / Docker-Селен

Докер Составьте:

version: "3.1"
services:    

  my-app:
    image: pame/play-binding-form-server
    networks:
      - mynet
    ...
    ports:
      - "9000:9000"

  chrome-webdriver:
    image: selenium/standalone-chrome:3.141.59-europium
    networks:
      - mynet
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "4444:4444"
    depends_on:
      - my-app

networks:
  mynet:

docker ps:

CONTAINER ID        IMAGE                                          COMMAND                  CREATED             STATUS              PORTS                              NAMES
53ac65c2babd        selenium/standalone-chrome:3.141.59-europium   "/opt/bin/entry_poin…"   13 minutes ago      Up 13 minutes       0.0.0.0:4444->4444/tcp             e2e_chrome-webdriver_1
fc0ca2af3148        pame/play-binding-form-server                  "/pme123/conf/docker…"   17 minutes ago      Up 17 minutes       0.0.0.0:9000->9000/tcp, 9443/tcp   pme123-forms
d

Мой тест выглядит так:

  import org.openqa.selenium.remote.DesiredCapabilities
  import org.openqa.selenium.remote.RemoteWebDriver

  val driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),
    DesiredCapabilities.chrome())
  driver.get("http://localhost:9000/")

Это возвращает страницу HTML:

Я пробовал разные версии, но безуспешно.

При запуске webdriver локально все работает.

Этот сценарий невозможен или я что-то пропустил?

1 ответ

Решение

Это очень классический вопрос.

поскольку my-app а также chrome-webdriver находятся на двух отдельных контейнерах, chrome-webdrive не может достичь my-app на своем локальном хосте (127.0.0.1).

Имейте в виду, что одной из функций докера является изоляция работающих сред с концепцией контейнера. То есть, localhost на вашем хост-компьютере не совпадает с контейнером, и localhost на контейнере А не совпадает с контейнером на В, у них всех есть свой локальный хост.

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

В твоем случае driver.get("http://my-app:9000/"),

Другие вопросы по тегам