Panther启动失败主因是chromedriver与Chrome版本不匹配:Chrome 124需chromedriver 124.x,否则报session not created;须用google-chrome --version查版本,从官方源下载对应驱动,Linux/macOS确保在PATH或显式传binary路径,Docker需加--headless=new、--no-sandbox、--disable-dev-shm-usage并挂载/dev/shm。

Panther 启动失败:chromedriver 和 Chrome 版本不匹配
绝大多数 Panther 测试卡在 Client::createChromeClient() 就报错,根本原因不是代码写错了,而是 chromedriver 与本地 Chrome 版本不兼容。Chrome 124 需要 chromedriver 124.x,混用 123 或 125 会直接触发 session not created 错误。
解决方法很直接:
- 运行
google-chrome --version查 Chrome 版本 - 去
https://chromedriver.storage.googleapis.com/找对应版本的 chromedriver 下载 - Linux/macOS 下确保
chromedriver在$PATH中,或显式传参:Client::createChromeClient(['binary' => '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome']) - Docker 环境必须加
--headless=new --no-sandbox --disable-dev-shm-usage,并挂载/dev/shm
waitForElementVisible 超时却元素明明存在
这个方法只等 DOM 节点渲染且 display: block、visibility: visible,但对 Vue/React 的异步数据加载、CSS 动画延迟显示、懒路由跳转完全无感。
更可靠的替代方案:
- 优先用稳定属性定位:
$client->waitFor('.js-submit-btn')不如$client->waitFor('[data-testid="submit-btn"]') - 目标是文案?直接等文本:
$client->waitForText('订单已提交成功', 5000) - 目标是跳转后页面?先
$client->click('#submit'),再$client->waitForNavigation(),最后断言 URL:$this->assertStringContainsString('/order/success', $client->getCurrentURL())
登录态丢失:Panther 不继承开发环境的 session cookie
你在浏览器里登录了后台,但 Panther 访问 /admin/dashboard 却被重定向到登录页——这不是你的 Security 配置问题,而是 Panther 启动的是全新 Chrome 实例,压根没拿到你 dev 环境的 PHPSESSID 或 Symfony cookie。
正确做法是走完整登录流程,而不是“复用”已有 session:
- 用
$client->request('GET', '/login')进入登录页 -
$form = $client->selectForm('form[name="login"]')定位表单 $form->setValues(['_username' => 'admin', '_password' => 'pass'])$form->submit()- 提交后检查重定向是否命中
/admin,再继续后续操作 - 如果需要跨多个测试复用登录态(比如 CI),可提取响应头中的
Set-Cookie,用$client->setCookie($name, $value)注入,但注意session.name应动态获取:ini_get('session.name')
截图空白或点击偏移:headless 模式 viewport 尺寸太小
本地跑得好好的截图,CI 上全是白图;按钮点不到、下拉菜单打不开——大概率是 headless Chrome 默认 viewport 只有 800×600,导致响应式 JS 判断 window.innerWidth 后隐藏了关键区域,或者 CSS Grid 布局错乱。
初始化 client 时强制指定尺寸:
$client = Client::createChromeClient([
'capabilities' => [
'goog:chromeOptions' => [
'args' => [
'--headless=new',
'--no-sandbox',
'--disable-dev-shm-usage',
'--window-size=1920,1080',
],
],
],
]);
这个尺寸能覆盖绝大多数管理后台和表单页的布局断点,避免因 viewport 触发错误的媒体查询分支。











