dusk 启动 chrome 失败主因是浏览器与 chromedriver 版本不匹配或环境配置错误:需确保安装对应版本的 chrome(非 chromium/edge),mac 用 brew 安装路径通常正确,linux/ci 需加 --headless=new、预置 chromedriver 并赋执行权限。

为什么 Dusk 启动 Chrome 失败,报 Facebook\WebDriver\Exception\UnknownErrorException
多数人卡在这一步:Dusk 装好了,php artisan dusk 一跑就崩,错误里带 ChromeDriver 或 session not created。根本原因不是 Laravel 写错了,而是浏览器环境没对齐。
- 确保本地已安装 Chrome(不是 Chromium 或 Edge),且版本与
laravel/dusk兼容——比如 Dusk 7.x 默认配 ChromeDriver 95,对应 Chrome 95–98;新版 Dusk 8.x 默认用 ChromeDriver 120+,必须用 Chrome 120+ - Mac 用户如果用
brew install --cask google-chrome装的 Chrome,路径通常没问题;但用Edge或Brave替代时,必须显式配置:tests/DuskTestCase.php里重写driver()方法,把ChromeOptions的binary指向正确路径 - Linux 服务器上跑 Dusk(比如 CI)必须加
--headless=new参数,旧版--headless --disable-gpu在 Chrome 112+ 已废弃,不加或写错直接报 session 创建失败
assertSee 总是超时失败,但页面明明有文字
Dusk 的断言默认等 5 秒,但“页面渲染完成”和“DOM 可见”不是一回事。React/Vue 渲染、AJAX 加载、CSS 动画延迟都会让文字晚于 HTML 出现。
- 别直接
$browser->assertSee('提交成功'),先等关键元素出现:$browser->waitForText('提交成功')或$browser->waitFor('.alert-success') -
assertSee是全文本匹配,区分大小写,且会过滤不可见文本(比如display: none或visibility: hidden的节点)。若文字在 tooltip、modal-body 或动态展开区域里,得先触发交互再断言 - 调试时加
$browser->dump()->pause(),看实际 DOM 快照,比猜更准
如何跳过登录步骤,直接测试后台页面
Dusk 默认走完整流程,每次测商品管理都得输账号密码,既慢又脆弱。Laravel 提供了绕过 UI 登录的合法方式,但得手动注入认证状态。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 在测试方法开头调用
$this->browse(function (Browser $browser) { ... })前,先用Auth::login($user)或actingAs($user)建立服务端 Session - 关键点:Dusk 浏览器请求和 PHPUnit 进程不在同一会话上下文,所以必须把 Session ID 同步过去。最稳做法是在
beforeEach里生成一个可复用的 Session,并通过$browser->visit('/login?token=xxx')这类路由透传(需配合自定义中间件验证 token 并 login) - 更轻量的做法是改用
DatabaseTransactions+RefreshDatabase,在测试数据库里预置用户,然后用$browser->visit('/admin/products')->assertSee('产品列表'),前提是路由不强制校验中间件里的 auth 状态——这需要临时关闭auth中间件,或在App/Providers/RouteServiceProvider.php的boot()里为测试环境豁免
CI 环境跑 dusk:install 报错找不到 chromedriver-linux
Dusk 安装脚本默认下载二进制到 tests/Browser/ChromeDriver,但 CI(如 GitHub Actions)没有图形界面,也未必有 wget 或 curl,还可能因网络策略无法直连 Google。
- 不要在 CI 步骤里跑
php artisan dusk:install,改用预编译好的 ChromeDriver:GitHub 上搜chrome-driver-binary找 release,下载对应平台的压缩包,解压后复制到tests/Browser/ChromeDriver - GitHub Actions 推荐直接用
actions/setup-node+browser-tools/setup-chrome,它会自动设好CHROMEDRIVER_BIN环境变量,Dusk 会优先读这个 - 务必检查权限:
chmod +x tests/Browser/ChromeDriver,否则 Linux 下报 “Permission denied” 不提示具体文件,只显示 vague 的 connection refused
真正麻烦的从来不是写几个 ->click(),而是让浏览器、驱动、Session、网络环境在不同机器上保持一致。每个环节松动一点,整个链路就断掉。










