用途:为需要真实浏览器的流程编写端到端测试,例如依赖 JavaScript、跨多页面的登录、结账或注册;当 WebTestCase 因依赖客户端渲染而看不到行为时,也适用。跨浏览器需求(WebKit、追踪、视频)WebDriver 无法覆盖,需单独运行 Playwright;也用于排查只在 CI 中失败的浏览器测试。
主要能力:可在真实浏览器与无 JavaScript 客户端之间选择;用显式等待驱动流程;对“未来状态”与“当前状态”分别断言;将 E2E 套件集中在 tests/E2E 并在测试间重置数据库;支持本地与 CI 调试。
使用方式:选择客户端,真实浏览器用 static::createPantherClient(),无需 JavaScript 时用 static::createClient()。安装 symfony/panther 与 dbrekelmans/bdi,运行 vendor/bin/bdi detect drivers,并在 phpunit.dist.xml 中注册 ServerExtension。继承 PantherTestCase,用 waitFor()、waitForVisibility()、waitForElementToContain() 等显式等待驱动流程。用 assertSelectorWillExist() 或 assertSelectorWillContain() 断言未来状态,用 assertSelectorIsVisible() 断言当前状态。套件保留在 tests/E2E,并用 DAMADoctrineTestBundle 或 Foundry 在测试间重置数据库。调试用 PANTHER_NO_HEADLESS=1 和 --debug,CI 中设置 PANTHER_NO_SANDBOX=1。
限制与注意事项:不要依赖隐式时序,每个异步步骤都要有 waitFor* 或 assertSelectorWill*;定位应针对 data-testid 属性而非样式类;及时删除 takeScreenshot() 或 PANTHER_ERROR_SCREENSHOT_DIR 产生的 PNG,绝不提交;E2E 较慢,只覆盖关键路径并与单元测试分开。
输出约定:E2E 测试文件需注明所用客户端类型与等待策略;说明驱动安装、ServerExtension 注册以及本地和 CI 所需的 PANTHER_* 变量;确认截图已清理。更多实现细节见 reference.md。