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

标签 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:
            - '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
    
  • 验收套件.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)
    

    虽然我可以连接到 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 文档( Network configuration reference )将网络设置为 "host",但它似乎已经过时,因为版本 3 中不允许使用名称。

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

    你知道有什么方法可以使这个工作吗?
    谢谢你的帮助!

    最佳答案

    尝试通过 set JAVA_OPTS 允许非本地主机连接到 chrome

        chrome:
          image: selenium/standalone-chrome
          restart: always
          ports:
            - '4444:4444'
            - '5900:5900'
          environment:
            - JAVA_OPTS=-Dwebdriver.chrome.whitelistedIps=
          depends_on:
            - web
    

    关于docker selenium/standalone-chrome 无法连接到 docker web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004832/

    相关文章:

    mysql - keycloak docker mysql连接链接失败

    node.js - 如何启动我从其他人那里获得的 Docker 容器?

    python - 如何从以前保存的 splinter 实例中在 splinter 中设置 cookie?

    java - 动态检索 JUnit 类

    javascript - 如何结合execute_scipt和WebdriverWait

    asp.net - 在 Elastic Beanstalk 上访问 Dockerized ASP.NET Core Web API 时出现 502 Bad Gateway

    docker - 如何将第二个磁盘安装到Docker容器?

    php - 无法使用 Docker 访问在主机上找到的文件(无法打开流 : Connection timed out)

    docker - docker-compose:先前的音量设置会覆盖更改

    Docker-Compose要求提供gcloud凭证