Docker 上的 Selenium:在同一 `docker-compose` 文件中测试 Docker 图像

Selenium on Docker: Testing a Docker Image within the same `docker-compose` file

场景:

我从这个开始SeleniumHQ/docker-selenium

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/")

这个returns一个HTML页:

我尝试了不同的版本,但没有成功。

当 运行在本地 webdriver 时一切正常。

这种情况是不可能的还是我错过了什么?

这个问题很经典

由于 my-appchrome-webdriver 在两个 单独的 容器上,chrome-webdrive 无法到达 my-app 它的 本地主机(127.0.0.1)。

请记住,docker 的功能之一是使用容器的概念隔离 运行 环境。也就是说,您主机上的 localhost 与容器中的 localhost 不同,容器 A 上的 localhost 与容器 B 上的不同,它们都有自己的本地主机。

要在同一网络内连接两个容器,只需使用它们的容器名称或服务名称作为主机名。

你的情况driver.get("http://my-app:9000/")