Docker Selenium/standalone-chrome 无法连接到 Docker Web 服务器

5

我将尝试使用Codeception来运行测试,对于使用Docker容器开发的PHP网站。我在Web容器中创建了一个测试文件夹,并将codecept.phar放置在其中。

以下是该项目的设置:

  • docker-compose.yml:

    version: '3'
      services:
        db:
          image: mariadb
          restart: always
          volumes:
            - ./db:/var/lib/mysql
          ports:
            - '3306:3306'
          environment:
            MYSQL_ROOT_PASSWORD: root
        web:
          build: .
          restart: always
          tty: true
          volumes:
            - ./src:/var/www
            - ./build/php.ini:/usr/local/etc/php/php.ini
          ports:
            - '80:80'
          depends_on:
            - db
        chrome:
          image: selenium/standalone-chrome
          restart: always
          ports:
            - '4444:4444'
            - '5900:5900'
          depends_on:
            - web
    
  • acceptance.suite.yml

    actor: AcceptanceTester
    modules:
      enabled:
        - WebDriver:
            url: web
            host: chrome
            browser: chrome
            wait: 15
            window_size: false
        - \Helper\Acceptance
    

我用以下命令启动容器:

docker-compose up

然后,我将 shell 附加到 Web 容器上,并使用以下命令运行测试:

php codecept.phar build && php codecept.phar run --steps

我正在运行一个简单的测试,基本上是尝试检查一个元素是否存在并拍摄屏幕截图: - test1.php:

$I = new AcceptanceTester($scenario);
$I->amOnUrl('http://127.0.0.1');
$I->makeScreenshot();
$I->waitForElement(".modal");

但是测试无法正常运行,因为Chrome容器无法连接到Web容器。屏幕截图显示了一个页面,上面写着:
This site can't be reached
127.0.0.1 refused to connect

以下是运行codeception时出现的错误:

[Facebook\WebDriver\Exception\NoSuchElementException] no such element: Unable to locate element: {"method":"css selector","selector":".modal"}
(Session info: chrome=68.0.3440.84)
(Driver info: chromedriver=2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706),platform=Linux 4.9.0-7-amd64 x86_64)

虽然我能够连接到http://127.0.0.1:4444/wd/hub

这是在运行“docker-compose up”时从shell获得的输出:

chrome_1 | INFO [GridLauncherV3.launch] - Selenium build info: version: '3.14.0', revision: 'aacccce0'
chrome_1 | INFO [GridLauncherV3$1.launch] - Launching a standalone Selenium Server on port 4444
chrome_1 | INFO::main: Logging initialized @286ms to org.seleniumhq.jetty9.util.log.StdErrLog
chrome_1 | INFO [SeleniumServer.boot] - Selenium Server is up and running on port 4444
chrome_1 | INFO [ActiveSessionFactory.apply] - Capabilities are: {"browserName": "chrome"}
chrome_1 | INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.remote.server.ServicedSession$Factory (provider: org.openqa.selenium.chrome.ChromeDriverService)
chrome_1 | Starting ChromeDriver 2[.14513.5517089780809 .(328f61]e[dS5EfV9E3R4E3]c:1 3bfi7n3d1(4)4 5r3e8tfu1r5nce0d0 ba3n7 0eerdrao6r7,0 6e) onr rpnoor=t9 91:7 2C9a4n
chrome_1 | Onnloyt  laoscsailg nc ornenqeucetsitoends  aadrder easlsl o(w9e9d).
chrome_1 | INFO [ProtocolHandshake.createSession] - Detected dialect: OSS
chrome_1 | INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session ed60fb03c497f98a7e23bdede05c4bb9 (org.openqa.selenium.chrome.ChromeDriverService)
chrome_1 | INFO [ActiveSessions$1.onStop] - Removing session ed60fb03c497f98a7e23bdede05c4bb9 (org.openqa.selenium.chrome.ChromeDriverService)
chrome_1 | INFO [ActiveSessionFactory.apply] - Capabilities are: {"browserName": "chrome"}
chrome_1 | INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.remote.server.ServicedSession$Factory (provider: org.openqa.selenium.chrome.ChromeDriverService)
chrome_1 | Starting ChromeDriver 2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706) on port 17381
chrome_1 | Only local connections are allowed.
chrome_1 | [1535110012.491][SEVERE]: bind() returned an error, errno=99: Cannot assign requested address (99)
chrome_1 | INFO [ProtocolHandshake.createSession] - Detected dialect: OSS
chrome_1 | INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session 3c49c360624e02460995193c50f43bd3 (org.openqa.selenium.chrome.ChromeDriverService)
chrome_1 | INFO [ActiveSessions$1.onStop] - Removing session 3c49c360624e02460995193c50f43bd3 (org.openqa.selenium.chrome.ChromeDriverService)

我认为为docker-compose容器设置网络应该能解决这个问题。我试着按照docker文档(网络配置参考)中的步骤将网络设置为“host”,但是它似乎已经过时了,因为在第3版中不允许使用名称。
我还尝试将chrome链接到web,并运行没有compose的chrome(docker run --net=host selenium/standalone-chrome),但结果没有任何改变。
你知道有什么方法可以使这个工作吗?谢谢你的帮助!

我遇到了类似的问题。我已经添加了selenium链接到我的其他服务,但仍然收到连接被拒绝的错误。 - Steve Tomlin
另外一点需要注意的是:Web 依赖于 Chrome,而不是反过来。 - Val Kalinichenko
你尝试过在本地浏览器上查看Chrome吗?地址是http://0.0.0.0:5900/(密码是“secret”)。 - Val Kalinichenko
4个回答

1
尝试通过设置JAVA_OPTS允许Chrome接受非本地主机连接。
    chrome:
      image: selenium/standalone-chrome
      restart: always
      ports:
        - '4444:4444'
        - '5900:5900'
      environment:
        - JAVA_OPTS=-Dwebdriver.chrome.whitelistedIps=
      depends_on:
        - web

1
这个解决方案很简单。
请参考此链接:在docker-compose中使用selenium/standalone-chrome与Python的selenium连接 您需要按照以下方式设置网络。
version: '3.8'

networks:
    web:
      external: true
      driver:  bridge

services:
    chrome:
        image: selenium/standalone-chrome:latest
        hostname: chrome
        networks:
          - web
        privileged: true
        shm_size: 2g

    framework:
        build: .
        networks:
            - web
        depends_on: 
            - chrome

在您的情况下,您可以根据自己的需求进行修改。请记住,当您在docker内运行代码时,您只能连接到http://chrome:4444/

1
返回:错误:网络web被声明为外部,但找不到。请使用“docker network create web”手动创建网络,然后重试。 - Robert Sinclair

0
你尝试过在docker-compose中使用network_mode: "host"吗?

0
This site can't be reached
127.0.0.1 refused to connect

Selenium 无法访问您的 Web 服务器的原因是它位于其他容器而不是同一容器中,因此要解决此问题,您需要提供特定容器和端口的名称,例如:
$I->amOnUrl('http://web:80'); 

但我仍然持怀疑态度,因为您已经映射了主机端口80和容器端口80,如果以上方法不起作用,请尝试

$I->amOnUrl('http://host.docker.internal:80'); 

在此,docker.host.internal 将指向您的主机系统端口 80,因此,由于您已将其映射到 Web 容器,因此它应该绝对可用。如果这适用于您,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接