会话未创建:此版本的ChromeDriver仅支持Chrome版本114。

14
我在AWS Batch环境中运行一个Docker容器中的Docker镜像。 一直以来都很顺利,但是从今天开始出现了以下错误。
E   selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This 
version of ChromeDriver only supports Chrome version 114
E   Current browser version is 116.0.5845.96 with binary path /opt/google/chrome/google-chrome

Dockerfile中包含了Chrome安装的内容,如下所示:
FROM python:3.10
WORKDIR /usr/src/app
COPY . .

RUN pip install --trusted-host pypi.org --upgrade pip
RUN pip install --no-cache-dir \
--extra-index-url https://artifactory.int.csgdev01.citcosvc.com/artifactory/api/pypi/citco- 
pypi/simple \
-r requirements.txt

RUN pip install awscli

RUN apt-get install -yqq unzip curl
RUN apt-get -y update
RUN apt-get install zip -y
RUN apt-get install unzip -y
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> 

/etc/apt/sources.list.d/google-chrome.list 运行 apt-get -y update 运行 apt-get -y install -y google-chrome-stable
# Install chrome driver
RUN wget -N https://chromedriver.storage.googleapis.com/`curl -sS 
chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip -P ~/
RUN unzip ~/chromedriver_linux64.zip -d ~/
RUN rm ~/chromedriver_linux64.zip
RUN mv -f ~/chromedriver /usr/local/bin/chromedriver
RUN chmod 0755 /usr/local/bin/chromedriver
RUN ls -lt
RUN ls -lt /usr/local/bin
RUN chmod +x ./run.sh
CMD ["bash", "./run.sh"]

我的Selenium Python测试类如下所示
from selenium import webdriver
import unittest
class Test_SecTransferWorkflow(unittest.TestCase):
    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument("--enable-javascript")
    options.add_argument("--start-maximized")
    options.add_argument("--incognito")
    options.add_argument('--headless')
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--enable-features=NetworkService')
    options.add_argument('--shm-size=1g')
    options.add_argument('--disable-gpu')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_argument("--window-size=1920,1080")
    options.add_argument("--disable-extensions")
    options.add_argument('--disable-dev-shm-usage')
    options.add_experimental_option('useAutomationExtension', False)
    options.add_experimental_option("detach", True)
    options.add_argument('--allow-running-insecure-content')
    options.add_argument('--allow-insecure-localhost')
    options.add_argument('--ignore-ssl-errors=yes')
    options.add_argument('--user-agent=Chrome/77')
    driver = webdriver.Chrome(options=options)

    @classmethod
    def setUpClass(cls):
        try:
            cls.driver.delete_all_cookies()
            cls.driver.get(TestData_common.BASE_URL)
            time.sleep(2)
        except WebDriverException as e:
            print('Site down...> ', e)
            cls.driver.delete_all_cookies()
        time.sleep(3)

    def test_001_login(self):
        if not TestData_common.URL_FOUND:
            pytest.skip('Site seems to be down...')
        self.loginPage = LoginPage(self.driver)
        self.loginPage.do_click_agree_button()
        self.driver.maximize_window()
        print('Successfully clicked on AGREE button...')
        time.sleep(2)

我到目前为止没有遇到任何问题运行这个镜像,直到今天遇到了这个错误。 非常感谢任何帮助。

Chrome浏览器和Chromedriver版本不匹配。原因是Chromedriver和Chrome并不同时发布。在这种情况下,最新版本的Chrome(116)超过了最新版本的Chromedriver(114)。您不应该依赖于这些存储库的最新版本是匹配的版本。 - sytech
非常感谢。我有几个关于这个问题的问题。 1.为什么到目前为止我没有遇到任何问题(它已经运行了几个月了),突然今天出现了问题? 2.如果我不应该依赖这些存储库的最新版本,那么我如何知道在Docker中应该安装哪个Chrome版本? 整个设置是在AWS Batch环境中运行的Linux操作系统上进行的。 3.如何从Docker文件中安装特定版本的Chrome? - Ram
  1. 之前能够正常工作是因为最新版本在过去的情况下恰好匹配了 - 而且通常会这样,但不能保证,正如你现在所见。
  2. 你应该检查 Chrome 的版本来确定要安装的 Chromedriver 版本 - 或者反过来。
  3. 要安装特定版本的 Chrome,只需下载所需版本的 .deb 文件 - 参见:这里 获取更多信息。你也可以在这里找到 116 版的 Chromedriver 下载链接:https://googlechromelabs.github.io/chrome-for-testing/#stable
- sytech
8个回答

4

Chrome的版本(116)和chromedriver(114)不匹配。这是因为chromedriver的最新版本(如chromedriver.storage.googleapis.com/LATEST_RELEASE所述)不一定始终与debian存储库中的Chrome的最新版本匹配。尽管这些主要版本通常会匹配(这就是为什么之前可以正常工作的原因),但您不能始终依赖于此,正如您现在所看到的。

相反,你应该检查 Chrome 的版本,然后安装适合的 Chromedriver 版本。如 chromedriver 下载页面 所述,你可以使用他们的 API 端点 查找各个版本的 Chromedriver 的下载链接,或者在 仪表盘 上找到这些链接,这些链接都将包含与 Chrome 116 兼容的 Chromedriver 版本的下载链接 -- 例如,在撰写本文时:https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.96/linux64/chromedriver-linux64.zip(但请注意,此 zip 结构可能与您已经使用的下载链接不同)。

在我的 Dockerfile 中,我手动指定了 Chromedriver 的下载 URL,并运行一个脚本来测试主要版本是否匹配。不过,你也可以使用上面提到的 API 端点自动获取正确的 Chromedriver URL。


关于为什么chromedriver.storage.googleapis.com/LATEST_RELEASE指向的主要版本是114而不是116,尽管116有可供下载的版本并且稳定的debian版本也是116,说实话我不太确定。

非常感谢您的建议,真的非常感激。我尝试安装RUN wget -N https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.96/linux64/chromedriver-linux64.zip -P ~/从Dockerfile中,并且成功了。 我还不确定如何解决Dockerfile中硬编码的Chrome版本问题。 如果明天Chrome版本发生变化,我应该编辑我的Dockerfile并将新版本放入其中吗?您能否向我展示如何自动完成这个过程?抱歉,我对Docker并不是很熟悉。 - Ram
感谢您提供这个答案,解释了问题并提供了正确驱动程序的URL。对我来说非常有效。Selenium版本为selenium==4.11.2chromium=116.0.5845.96 - morallito

2
如上所述,https://chromedriver.chromium.org/downloads 现在建议从 https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json 下载 chromedriver。
尝试使用此方法获取最新的 v116 版本:
export CHROMEDRIVER_VERSION=116
export CHROMEDRIVER_URL=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json | \
  jq -r --arg version "$CHROMEDRIVER_VERSION" '[.versions[] | select(.version | startswith($version + "."))] | last | .downloads.chromedriver[] | select(.platform == "linux64").url')

(这假设JSON文件已按从旧到新排序,所以我们想要带有version="160.x.y.z"last一个。)
请注意,下载的.zip现在是一个名为chromedriver-linux64的文件夹,其中包含可执行文件chromedriver
Dockerfile中尝试:
ARG CHROMEDRIVER_VERSION='116'

# Install Chrome WebDriver
RUN CHROMEDRIVER_URL=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json | \
  jq -r --arg version "$CHROMEDRIVER_VERSION" '[.versions[] | select(.version | startswith($version + "."))] | last | .downloads.chromedriver[] | select(.platform == "linux64").url') && \
  mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION && \
  curl -sS -o /tmp/chromedriver_linux64.zip "$CHROMEDRIVER_URL" && \
  unzip -qq /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION && \
  rm /tmp/chromedriver_linux64.zip && \
  chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver-linux64/chromedriver && \
  ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver

FWIW,gpt4帮助我编写了解析JSON的jq子句。

https://chat.openai.com/share/ebe38666-9ea7-4bd4-9935-5430fec339f5

此外,如果您将 select(.platform == "linux64") 替换为以下平台之一,则可获得所有其他可用平台:

curl -s https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json | \
jq '[.versions[] | select(.version | startswith("116."))] | last | .downloads.chromedriver'

[
  {
    "platform": "linux64",
    "url": "..."
  },
  {
    "platform": "mac-arm64",
    "url": "..."
  },
  {
    "platform": "mac-x64",
    "url": "..."
  },
  {
    "platform": "win32",
    "url": "..."
  },
  {
    "platform": "win64",
    "url": "..."
  }
]

1
这里列出了其他的 JSON URL:https://github.com/GoogleChromeLabs/chrome-for-testing#json-api-endpoints 例如,这个URL提供最新版本信息:https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json - Dmitry Shvedov

1
在Docker中安装最新的Chrome和Chromedriver:
# Install latest Chrome
RUN CHROME_URL=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json | jq -r '.channels.Stable.downloads.chrome[] | select(.platform == "linux64") | .url') \
    && curl -sSLf --retry 3 --output /tmp/chrome-linux64.zip "$CHROME_URL" \
    && unzip /tmp/chrome-linux64.zip -d /opt \
    && ln -s /opt/chrome-linux64/chrome /usr/local/bin/chrome \
    && rm /tmp/chrome-linux64.zip

# Install latest chromedriver
RUN CHROMEDRIVER_URL=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json | jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform == "linux64") | .url') \
    && curl -sSLf --retry 3 --output /tmp/chromedriver-linux64.zip "$CHROMEDRIVER_URL" \
    && unzip -o /tmp/chromedriver-linux64.zip -d /tmp \
    && rm -rf /tmp/chromedriver-linux64.zip \
    && mv -f /tmp/chromedriver-linux64/chromedriver "/usr/local/bin/chromedriver" \
    && chmod +x "/usr/local/bin/chromedriver"

根据https://chromedriver.chromium.org/downloads/version-selection,从115版本开始,Google已经改变了Chrome和Chromedriver的发布流程。有多个JSON端点可以用来获取最新的稳定版本的Chrome和Chromedriver。
这个答案受到Dr Nic的答案启发,只是使用了获取最新(稳定)版本的端点。

非常感谢您的所有评论。我在我的Dockerfile中尝试了以下内容,似乎运行良好。RUN google-chrome --version | grep -oE "[0-9]{1,10}.[0-9]{1,10}.[0-9]{1,10}.[0-9]{1,10}" > /tmp/chromebrowser-main-version.txtRUN wget -N https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$(cat /tmp/chromebrowser-main-version.txt)/linux64/chromedriver-linux64.zip -P ~/RUN unzip ~/chromedriver-linux64.zip -d ~/RUN rm ~/chromedriver-linux64.zipRUN mv -f ~/chromedriver-linux64 /usr/local/bin/chromedriver - Ram
我再次安装Chrome时遇到了问题。以下是命令:RUN CHROME_URL=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json | jq -r '.channels.Stable.downloads.chrome[] | select(.platform == "linux64") | .url') \ && curl -sSLf --retry 3 --output /tmp/chrome-linux64.zip "$CHROME_URL" \ && unzip /tmp/chrome-linux64.zip -d /opt \ && ln -s /opt/chrome-linux64/chrome /usr/local/bin/chrome \ && rm /tmp/chrome-linux64.zip出现错误:/bin/sh: 1: jq: not found - Ram
只是为了补充一下。我在Linux上打印了当前版本的Chrome RUN apt-get -y install -y google-chrome-stable RUN google-chrome --version,它打印的是116.0.5845.140。但根据https://googlechromelabs.github.io/chrome-for-testing,这个版本是即将发布的版本。所以我有点困惑为什么Linux上的Chrome版本显示的是即将发布的版本而不是稳定版本。非常感谢任何帮助。 - Ram
是的,你需要安装jq工具。不确定这个镜像基于哪个Linux版本。如果是基于Debian的,你需要在安装Chrome之前的某个地方运行apt-get install jq命令。 - Dmitry Shvedov
你正在打印当前版本,该版本位于你的 Linux 存储库中。我在答案中提出的安装方法不依赖于存储库。版本信息来自于这里:https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json。目前那里提到的版本是 116.0.5845.96,就像你期望的那样。 - Dmitry Shvedov

1
我已经通过从这里降级到先前的版本来修复它: https://google-chrome.it.uptodown.com/mac/versions 然后,以sudo身份将此行添加到您的etc/hosts文件中:
127.0.0.1 tools.google.com

Google Chrome无法访问用于自动更新的URL。
这可能不是最好的解决方案,但它能完成工作。

0
我用Java解决了这个问题。
WebDriverManager.chromedriver().browserVersionDetectionCommand("google-chrome --version | cut -d ' ' -f 3");

0
我的猜测是你使用的是较旧版本的selenium。Selenium版本4.10.0或更低版本将不支持最新版本的Chrome浏览器。
解决方案:将selenium版本升级到v4.11.2。这应该可以解决问题。

2
谢谢。不幸的是,将Selenium升级到4.11.2并没有解决这个问题。 - Ram

0
您需要在最新发布的网址chrome-for-testing#json-api-endpoints中找到一个名为driver_version的版本号,然后指定latest_release_url和driver_version参数。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
...
...
options = Options()
options.add_argument("--no-sandbox")
options.add_argument('--headless=new')
options.add_argument("--disable-gpu")

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(
            latest_release_url='https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json',
            driver_version='116.0.5845.96').install()), options=options)

在这种情况下,我使用了last-known-good-versions-with-downloads.json,并选择了版本116.0.5845.96。 它有效。

-1
我建议你将Chrome降级到114版本(在配置Jibri时,这对我有效)。
wget http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_114.0.5735.198-1_amd64.deb

sudo dpkg -i google-chrome-stable_114.0.5735.198-1_amd64.deb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接