You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Chromium-Driver搭配Symfony/Panther时Cookie禁用问题

解决Symfony Panther在Docker容器中运行时的Cookie禁用问题

问题背景

在Docker容器中部署Symfony Panther进行E2E测试时,执行登录流程出现错误提示:Your browser either does not know how to handle cookies, or refuses to handle them.,导致断言失败。

可能原因

  1. Docker环境下Chrome默认隐私设置阻止了Cookie存储
  2. Panther客户端未配置启用Cookie的Chrome启动参数
  3. 应用设置的Cookie属性(如Secure、SameSite)与测试环境不兼容
  4. 仅安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:20:05