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
相关产品推荐
相关产品推荐

