在 selenium docker 图像中为无头 chrome 安装证书

installing cert for headless chrome in selenium docker image

我 运行宁 chrome 使用 python 和硒。对于我的自动化测试,我们正在非生产环境中进行测试,如果不在您的机器上安装 .crt 证书就无法访问该环境:

Current User>Trusted Root Certificate Authority

在 Dockerfile 中,我正在安装如下证书:

FROM selenium/standalone-chrome-debug:latest

RUN sudo apt-get update && sudo apt-get install -y python3 python3-pip 
RUN sudo apt-get update && sudo pip3 install pytest pytest-html selenium behave allure-behave

COPY . /home

ADD /certs/*.crt /usr/local/share/ca-certificates/
RUN sudo chmod 644 /usr/local/share/ca-certificates/*.crt && sudo apt-get update && sudo update-ca-certificates && sudo apt-get update 

为了使 headless chrome 工作,我使用以下参数作为 chrome 选项:

    elif data.get('browser') == 'container':
        chrome_options.add_argument("--headless")
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_argument('add_experimental_option("excludeSwitches",["ignore-certificate-errors"])')
        chrome_options.add_argument('window-size=1200x600')
        context.driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)

问题: 现在,当我 运行 在安装了此 .crt 证书的个人计算机上以无头模式进行测试时,我的测试工作正常。当我尝试 运行 它在无头模式的容器内时,这些证书被安装在 Dockerfile 中,我的测试失败并且截取这个非 prod 环境的屏幕截图给我一个空白图像(全白屏幕)。这意味着容器中的 headless chrome 由于证书问题无法加载站点。

如果我尝试截取不需要任何证书的任何其他网站的屏幕截图,它会按预期工作。

我是否需要添加任何其他步骤来确保 .crt 证书已正确安装在“受信任的根证书颁发机构”中,以便在容器中以无头模式运行。

从容器内部:

经过更多挖掘后,我发现证书被复制到容器内的以下目录(我不得不进入容器中的 bash shell 并为以下步骤进行一些故障排除) :

/usr/local/share/ca-certificates

为了测试证书是否有效,我尝试在非产品环境 url(从容器内部)上使用 curl,这也有效。在这一点上,我确信证书在容器中并且正在工作,但是 chrome 由于某种原因无法使用这些证书。

为了解决这个问题,我使用 chrome 选项将这些功能添加到 chrome:

capabilities = chrome_options.to_capabilities()         #cap
capabilities['acceptInsecureCerts'] = True              #cap

它开始按预期工作。要查看我为使这项工作必须添加的所有参数和功能,下面是 chrome:

的完整配置
    elif data.get('browser') == 'container':
        #chrome_options.addArguments("--headless", "--window-size=1920,1200","--ignore-certificate-errors")
        chrome_options.add_argument("--headless")
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        #chrome_options.add_argument('--allow-running-insecure-content')
        #chrome_options.add_argument('--disable-web-security')
        #chrome_options.add_experimental_option('useAutomationExtension', False)
        chrome_options.add_argument('add_experimental_option("excludeSwitches",["ignore-certificate-errors"])')
        chrome_options.add_argument('window-size=1200x600')
        capabilities = chrome_options.to_capabilities()         #cap
        capabilities['acceptInsecureCerts'] = True              #cap
        context.driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)