docker selenium/standalone chrome无法连接到docker web服务器

docker selenium/standalone chrome无法连接到docker web服务器,docker,selenium-webdriver,docker-compose,codeception,Docker,Selenium Webdriver,Docker Compose,Codeception,我正在尝试使用codeception为使用docker容器开发的php网站运行测试。 我在web容器中创建了一个测试文件夹,并将codecept.phar放在那里 这是项目的设置: docker-compose.yml: version: '3' services: db: image: mariadb restart: always volumes: - ./db:/var/lib/mysql ports:

我正在尝试使用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的附加shell中显示的错误:

[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)
虽然我可以连接到

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

我认为为docker compose容器建立一个网络应该可以解决这个问题。 我试图按照docker文档()将网络设置为“主机”,但它似乎已经过时,因为在版本3中不允许使用名称

还尝试设置从chrome到web的链接,并在不使用compose的情况下运行chrome(docker run--net=host selenium/standalone chrome),但没有改变

你知道怎么做吗?
谢谢你的帮助

您是否尝试过docker compose中的
网络模式:“主机”

通过设置
JAVA\u选项,尝试允许非本地主机连接到chrome

chrome:
图片:selenium/standalone chrome
重新启动:始终
端口:
- '4444:4444'
- '5900:5900'
环境:
-JAVA_OPTS=-Dwebdriver.chrome.whitelistedIps=
取决于:
-网

解决方案很简单

参考此

你需要像这样设置网络

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
在您的情况下,您可以根据需要对此进行修改。请记住,您只能在
http://chrome:4444/
在docker内部运行代码时

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容器,它肯定会工作。让我知道这是否适用于您

我也有类似的问题。我已经针对我的其他服务添加了链接:-selenium,但仍然得到连接拒绝返回:错误:网络web声明为外部,但找不到。请使用
docker network create web
手动创建网络,然后重试。
$I->amOnUrl('http://host.docker.internal:80');