Docker中Chromium-Driver搭配Symfony/Panther时Cookie禁用问题
问题背景
在Docker容器中部署Symfony Panther进行E2E测试时,执行登录流程出现错误提示:Your browser either does not know how to handle cookies, or refuses to handle them.,导致断言失败。
可能原因
- Docker环境下Chrome默认隐私设置阻止了Cookie存储
- Panther客户端未配置启用Cookie的Chrome启动参数
- 应用设置的Cookie属性(如
Secure、SameSite)与测试环境不兼容 - 仅安装chromium-driver而缺少完整的Chromium浏览器环境
解决方案
1. 调整Panther客户端的Chrome启动参数
在测试代码中创建Panther客户端时,显式添加启用Cookie、禁用隐私沙箱相关特性的参数:
use Symfony\Component\Panther\PantherTestCase; class E2eTest extends PantherTestCase { public function testMyApp(): void { $client = static::createPantherClient([ 'port' => 8080, 'chromeOptions' => [ 'args' => [ '--no-sandbox', // Docker环境下Chrome必填参数 '--disable-dev-shm-usage', // 解决容器内存限制问题 '--enable-cookies', // 强制启用Cookie支持 '--accept-all-cookies', // 接受所有Cookie '--disable-features=PrivacySandboxSettings4,CookiesWithoutSameSiteMustBeSecure', // 禁用阻止Cookie的隐私特性 ], ], ]); // 后续测试逻辑保持不变 $crawler = $client->request('GET', '/login_page.php'); $crawler->filter('#username')->sendKeys('test'); $crawler->filter('input[type="submit"]')->click(); $crawler = $client->waitFor('#password'); $crawler->filter('#password')->sendKeys('test123'); $crawler->filter('input[type="submit"]')->click(); $crawler = $client->waitFor('#main-container', 10, 2000); $client->takeScreenshot('tests/screenshot.png'); $this->assertSelectorNotExists('.alert'); } }
2. 完善Dockerfile中的浏览器安装与环境变量
- 安装完整的Chromium浏览器(而非仅驱动)
- 添加全局Chrome启动参数环境变量:
RUN apt-get update ;\ apt-get install -y default-mysql-client php8.2-mysql php8.2-ldap php8.2-xdebug git chromium-browser chromium-driver RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer ;\ chmod 777 /var/www RUN apt-get clean ;\ rm -rf /tmp/* /var/tmp/* RUN cd /var/www/html;\ composer req --dev symfony/panther;\ composer req --dev symfony/framework-bundle ENV PANTHER_WEB_SERVER_DIR=/var/www/html ENV PANTHER_WEB_SERVER_PORT=8080 ENV PANTHER_NO_SANDBOX=1 ENV KERNEL_CLASS=PantherTestKernel # 添加Chrome全局启动参数 ENV PANTHER_CHROME_ARGUMENTS="--no-sandbox --disable-dev-shm-usage --enable-cookies --accept-all-cookies --disable-features=PrivacySandboxSettings4,CookiesWithoutSameSiteMustBeSecure"
3. 调整应用的Cookie配置(适配HTTP测试环境)
如果应用的登录Cookie设置了Secure属性(仅HTTPS生效),但Panther默认使用HTTP服务器,会导致Cookie被拒绝。需在测试环境中禁用Secure属性:
// 应用中设置Cookie的示例代码 $env = $_SERVER['APP_ENV'] ?? 'prod'; $isSecure = $env !== 'test' && $env !== 'dev'; setcookie( 'user_session', $sessionToken, [ 'expires' => time() + 3600, 'path' => '/', 'secure' => $isSecure, 'httponly' => true, 'samesite' => 'Lax' // 避免SameSite=None在HTTP环境下被阻止 ] );
4. 验证容器内Chrome可用性
进入容器手动启动Chrome,确认是否能正常加载页面并存储Cookie:
docker exec -it <容器ID> bash chromium-browser --no-sandbox --disable-dev-shm-usage https://example.com
内容的提问来源于stack exchange,提问作者hadf
相关产品推荐
相关产品推荐

