在 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 证书已正确安装在“受信任的根证书颁发机构”中,以便在容器中以无头模式运行。
从容器内部:
- 我可以看到 .crt 文件已复制到
/usr/local/share/ca-certificates
目录。
- 我什至可以使用 curl 命令并看到 DOM 被它访问,所以证书文件正在工作。
- 只有在将 chrome 与 selenium 一起使用时,我才能达到此 url。我的猜测是 chrome 需要一些额外的配置才能使用该证书。
经过更多挖掘后,我发现证书被复制到容器内的以下目录(我不得不进入容器中的 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)
我 运行宁 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 证书已正确安装在“受信任的根证书颁发机构”中,以便在容器中以无头模式运行。
从容器内部:
- 我可以看到 .crt 文件已复制到
/usr/local/share/ca-certificates
目录。 - 我什至可以使用 curl 命令并看到 DOM 被它访问,所以证书文件正在工作。
- 只有在将 chrome 与 selenium 一起使用时,我才能达到此 url。我的猜测是 chrome 需要一些额外的配置才能使用该证书。
经过更多挖掘后,我发现证书被复制到容器内的以下目录(我不得不进入容器中的 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)