You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Laravel Dusk浏览器测试连接失败求助

解决Laravel Dusk + Docker跨容器浏览器测试的JSON解码错误问题

问题根源

你遇到的JSON decoding of remote response failed错误,核心原因是给RemoteWebDriver::create()传入的地址http://selenium-hub:4444是Selenium Hub的控制台页面地址,它返回的是HTML而非WebDriver协议要求的JSON响应,自然会触发解码失败。另外,运行浏览器的chrome/firefox容器需要能正常访问你的Laravel app容器,才能执行页面访问类的测试。

分步解决方案

1. 修正Selenium WebDriver端点地址

在DuskTestCase.php中,将RemoteWebDriver的创建地址修改为Selenium Hub的标准WebDriver端点http://selenium-hub:4444/wd/hub,同时添加几个常用的Chrome参数避免容器内运行的权限/内存问题:

protected function driver() {
    $options = (new ChromeOptions)->addArguments([
        '--disable-gpu',
        '--headless',
        '--no-sandbox',
        '--disable-dev-shm-usage'
    ]);

    return RemoteWebDriver::create(
        'http://selenium-hub:4444/wd/hub', // 新增/wd/hub路径
        DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY,
            $options
        )
    );
}

2. 确保所有容器在同一网络互通

虽然Docker Compose默认会给所有服务创建默认网络,但显式定义自定义网络能避免潜在的域名解析问题。修改docker-compose.yml添加网络配置:

version: '3'
services:
  app:
    build: .
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    ports:
      - 80:80
    networks:
      - laravel-dusk-net
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: qwerty
    networks:
      - laravel-dusk-net
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql:db
    ports:
      - 8765:80
    environment:
      MYSQL_ROOT_PASSWORD: qwerty
      PMA_HOST: mysql
    depends_on:
      - mysql
    networks:
      - laravel-dusk-net
  selenium-hub:
    image: selenium/hub:3.12.0-americium
    container_name: selenium-hub
    ports:
      - "4444:4444"
    networks:
      - laravel-dusk-net
  chrome:
    image: selenium/node-chrome:3.12.0-americium
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
    networks:
      - laravel-dusk-net
  firefox:
    image: selenium/node-firefox:3.12.0-americium
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
    networks:
      - laravel-dusk-net

# 定义自定义桥接网络
networks:
  laravel-dusk-net:
    driver: bridge

3. 验证浏览器容器对app的访问性

进入chrome容器,用curl测试能否正常访问app容器:

# 替换为你的chrome容器名称
docker exec -it <chrome-container-name> bash

# 执行curl测试
curl http://app:80

如果能返回Laravel欢迎页面的HTML内容,说明网络互通正常;如果失败,检查app容器的Web服务(Nginx/Apache)是否正常启动,端口80是否在容器内开放。

4. 简化测试中的访问地址

在ExampleTest.php中,你可以直接使用相对路径,同时确保.env.testing文件里的APP_URL设置为http://app:80,Dusk会自动读取这个地址:

public function testBasicExample() {
    $this->browse(function (Browser $browser) {
        $browser->visit('/')
                ->assertSee('Welcome');
    });
}

额外注意事项

  • 启动测试前,确认selenium-hub和chrome节点已完全就绪,可以访问http://localhost:4444/grid/console查看节点状态。
  • 确保Laravel app容器的Web服务已正常启动,避免因容器启动顺序问题导致的访问失败(可以在app服务中添加健康检查)。
  • 如果使用较新版本的Laravel Dusk,建议同步升级Selenium镜像版本,避免版本不兼容问题。

内容的提问来源于stack exchange,提问作者tekken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:08:27