2

设想:

  • 运行我的应用程序的 Docker 映像localhost:9000
  • 使用 Selenium Webdriver 的 Docker 映像
  • 我想要运行的 Selenium 测试。

我从这个开始SeleniumHQ/docker-selenium开始

码头工人组成:

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本地运行时,一切正常。

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

4

1 回答 1

2

这是一个非常经典的问题。

由于my-appchrome-webdriver位于两个单独的容器上,chrome-webdrive因此无法访问my-applocalhost (127.0.0.1)。

请记住,docker 的功能之一是用容器的概念隔离运行环境。也就是说,localhost在你的宿主机上和一个容器localhost的不一样,在容器A上和在容器B上的不一样,它们都有自己的本地主机。

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

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

于 2019-01-21T15:56:33.603 回答