عدم تطابق نسخه ChromeDriver: رفع خطای session not created

تاریخ انتشار:

16 دقیقه مطالعه

Acar Diveroli
نویسنده: Acar Diveroli
جعبه‌های نسخه درایور روی نوار نقاله: آبی 154 در جایگاه ⁦Chrome 154⁩ می‌نشیند و قرمز 152 کنار دستگاه از نوار بیرون رانده شده
فهرست مطالب

اسکریپت Selenium شما جمعه بی هیچ مشکلی اجرا شد. دوشنبه همان خط اول، یعنی webdriver.Chrome()، با SessionNotCreatedException و دو خط متن متوقف می‌شود: This version of ChromeDriver only supports Chrome version 152 و Current browser version is 154.0.8037.92. کسی به کد دست نزده است. Chrome آخر هفته خودش را به‌روز کرد و فایل chromedriver روی دیسک همان‌جا که بود ماند.

این راهنما نخست پیام را می‌خواند، قاعده‌ای را که ChromeDriver اعمال می‌کند از روی کد منبع آن نشان می‌دهد و توضیح می‌دهد چرا این خطا حالا هر چند هفته یک بار برمی‌گردد. سپس راه‌حل‌ها می‌آیند: Selenium Manager، درایور کهنه‌ای که روی PATH مانده، Chrome for Testing، Docker و CI، همین خطا در Edge و یک اسکریپت آزموده‌شده Python که درایور کهنه را با نام نشان می‌دهد.

پیام «This version of ChromeDriver only supports Chrome version» چه معنایی دارد؟

ChromeDriver برنامه کوچکی است که میان Selenium و Chrome قرار می‌گیرد: Selenium فرمان‌های استاندارد WebDriver مانند «این URL را باز کن» را برایش می‌فرستد و ChromeDriver آن‌ها را به فرمان‌هایی تبدیل می‌کند که Chrome می‌فهمد. هر بیلد ChromeDriver از همان درخت کد منبعی بیرون می‌آید که یک نسخه Chrome از آن ساخته شده و شماره نسخه همان را دارد.

نشست (session) یعنی یک مرورگر که کد شما تا quit() آن را کنترل می‌کند؛ «session not created» یعنی کار حتی به آنجا نرسیده است. این همان پیامی است که ⁦Selenium 4.50⁩ در آزمایش ما با ⁦ChromeDriver 152⁩ و یک بیلد آزمایشی ⁦Chrome 154⁩ چاپ کرد (مسیر کوتاه شده و stack trace بریده شده است):

text
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 152
Current browser version is 154.0.8037.92 with binary path ...\154.0.8037.92\chrome-win64\chrome.exe; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#sessionnotcreatedexception

پیام سه بخش دارد:

  • only supports Chrome version 152 نسخه اصلی درایوری است که Selenium اجرا کرده است.
  • Current browser version is 154.0.8037.92 نسخه کامل همان Chrome است که این درایور اجرا کرده است.
  • with binary path فایل Chrome را نام می‌برد. روی رایانه‌ای که Chrome، Chrome Beta و یک بیلد آزمایشی دارد، نشان می‌دهد کدام‌یک انتخاب شده است.

این متن را خود ChromeDriver تولید می‌کند، نه بسته Python؛ برای همین Java، ⁦C#⁩ و JavaScript هم همین دو خط را درون استثنای (exception) خودشان نشان می‌دهند. stack trace زیر آن مال درایور است و در این خطا چیزی به دانسته‌های شما اضافه نمی‌کند.

ChromeDriver کدام نسخه‌های Chrome را می‌پذیرد؟

این بررسی یک تابع کوتاه به نام CheckVersion در کد منبع launcher در ChromeDriver است و فقط عدد اول دو نسخه را با هم مقایسه می‌کند:

  1. نسخه اصلی یکسان: نشست شروع می‌شود.
  2. Chrome دقیقاً یک نسخه اصلی جدیدتر از درایور: نشست شروع می‌شود و درایور هشداری در لاگ خود می‌نویسد. توضیحی در کد منبع دلیلش را می‌گوید: درایور نسخه Beta باید بتواند مرورگر Dev یا Canary را اجرا کند.
  3. هر حالت دیگر، از جمله وقتی Chrome قدیمی‌تر از درایور است: session not created.

هر حالت را با بیلدهای Chrome for Testing، ⁦Selenium 4.50.0⁩ و ⁦Python 3.13⁩ روی ویندوز 11 آزمودیم:

ChromeDriverChromeنتیجه
154.0.8037.92154.0.8037.92نشست شروع می‌شود
153.0.8010.52154.0.8037.92نشست شروع می‌شود، هشدار فقط در لاگ درایور
152.0.7977.82154.0.8037.92session not created
154.0.8037.92153.0.8010.52session not created (درایور جدیدتر از مرورگر)

در ردیف دوم، لاگ درایور نوشت This version of ChromeDriver has not been tested with Chrome version 154. Selenium این لاگ را نشان نمی‌دهد مگر اینکه خودتان بخواهید، پس هشدار دیده نمی‌شود تا نسخه بعدی Chrome آن را به خطا تبدیل کند. مستندات گوگل برای ChromeDriver از خود کد سخت‌گیرتر است و می‌خواهد شماره‌های اصلی، فرعی و بیلد هر سه یکی باشند.

چرا این خطا مدام برمی‌گردد؟

Chrome خودش را به‌روز می‌کند: نسخه جدید در پس‌زمینه دانلود می‌شود و از اجرای بعدی مرورگر به کار می‌افتد، و Selenium برای هر نشست یک Chrome تازه اجرا می‌کند. اما فایل chromedriver که دانلود کرده‌اید یک فایل اجرایی ساده است و هیچ چیز آن را به‌روز نمی‌کند.

از ⁦Chrome 153⁩ به بعد این اتفاق بیشتر می‌افتد. گوگل در 8 سپتامبر 2026 Chrome را به چرخه انتشار پایدار دوهفته‌ای برد، روی دسکتاپ، اندروید و iOS: ⁦Chrome 154⁩ در 22 سپتامبر منتشر شد، 155 در 6 اکتبر و 156 برای 20 اکتبر برنامه‌ریزی شده است. با آن حاشیه یک‌نسخه‌ای، درایوری که روز انتشار با Chrome مطابق بود از یک انتشار جان به در می‌برد و در انتشار بعدی شکست می‌خورد؛ پس عمر کاری آن حالا حدود چهار هفته است، نه هشت هفته. شرکت‌هایی که روی کانال Extended Stable هستند همچنان فقط هر هشت هفته یک نسخه اصلی تازه می‌گیرند.

برای دیدن هر دو عدد، در Chrome از بالا سمت چپ روی بیشتر کلیک کنید و راهنما > درباره Google Chrome را انتخاب کنید. برای درایور، آن را با --version اجرا کنید:

text
> chromedriver --version
ChromeDriver 152.0.7977.82 (d04cdb24d67b081f6cf80200ffc5233f44b61109-refs/branch-heads/7977@{#2322})

Selenium چگونه انتخاب می‌کند کدام chromedriver را اجرا کند؟

بیشتر موارد «دیروز کار می‌کرد» به این برمی‌گردد که Selenium کدام فایل درایور را برداشته است. با ⁦Selenium 4.50⁩، webdriver.Chrome() به این ترتیب جست‌وجو کرد:

  1. مسیری که در Service(executable_path=...) داده شده. Selenium همان فایل را همان‌طور که هست به کار می‌برد و هرگز نسخه‌اش را بررسی نمی‌کند.
  2. یک chromedriver روی PATH، یعنی فهرست پوشه‌هایی که سیستم برای یافتن برنامه‌ها در آن‌ها می‌گردد. Selenium Manager این فایل را حتی وقتی نسخه‌ها با هم نمی‌خوانند به کار می‌برد و فقط یک هشدار چاپ می‌کند.
  3. درایوری که Selenium Manager دانلود کرده است. نسخه همان Chrome را که قرار است اجرا کند می‌خواند، درایور مطابق را در Chrome for Testing پیدا می‌کند و آن را در ~/.cache/selenium نگه می‌دارد.

Selenium Manager برنامه کمکی‌ای است که از نسخه 4.6 درون همه بسته‌های رسمی Selenium عرضه می‌شود، برای همین از Python، Java، ⁦C#⁩، Ruby و JavaScript یکسان رفتار می‌کند. مستندات Selenium Manager تنظیمات آن را فهرست می‌کند؛ هر تنظیم یک متغیر محیطی هم دارد که با SE_ شروع می‌شود.

راه‌حل 1: مسیر ثابت درایور را بردارید

آموزش‌های قدیمی‌تر ChromeDriver را دستی دانلود می‌کنند و مسیرش را به کد می‌دهند. این مسیر با به‌روزرسانی بعدی Chrome دیگر مطابق نیست:

python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Before: a fixed file that goes stale after a Chrome update
service = Service(executable_path=r"C:\tools\chromedriver.exe")
driver = webdriver.Chrome(service=service)

# After: no path, Selenium Manager fetches the driver for the installed Chrome
driver = webdriver.Chrome()

نخست نسخه نصب‌شده را با pip show selenium بررسی کنید: Selenium Manager در نسخه‌های قدیمی‌تر از 4.6 وجود ندارد و نسخه کنونی، 4.50.0، در 30 سپتامبر 2026 منتشر شد. در آزمایش ما، شکل دوم در اجرای نخست ⁦ChromeDriver 154.0.8037.92⁩ را برای ⁦Chrome 154.0.8037.92⁩ دانلود کرد و در اجراهای بعدی همان را دوباره به کار برد.

دانلود به اینترنت نیاز دارد. اگر پشت پروکسی شرکت هستید، نشانی پروکسی را در SE_PROXY بگذارید؛ روی رایانه‌ای که اصلاً به اینترنت وصل نیست، هر دو فایل را مانند راه‌حل 3 خودتان فراهم کنید. درایورهای ⁦Chrome 115⁩ و نسخه‌های بعدی فقط در Chrome for Testing منتشر می‌شوند، پس اسکریپت دانلود قدیمی‌ای که از سایت ذخیره‌سازی پیشین ChromeDriver می‌خواند در نسخه 114 می‌ماند.

راه‌حل 2: chromedriver قدیمی روی PATH را پاک کنید

Selenium Manager این مورد را به‌تنهایی حل نمی‌کند. اگر یک chromedriver.exe قدیمی در یکی از پوشه‌های PATH مانده باشد، مثلاً یک پوشه ابزار یا پوشه Scripts در Python، Selenium Manager همان را به کار می‌برد و هشدار می‌دهد. با ⁦ChromeDriver 152⁩ روی PATH و ⁦Chrome 154⁩، اجرای ما پیش از استثنا این خط را چاپ کرد:

text
The chromedriver version (152.0.7977.82) detected in PATH at ...\chromedriver.exe might not be compatible with the detected chrome version (154.0.8037.92); currently, chromedriver 154.0.8037.92 is recommended for chrome 154.*, so it is advised to delete the driver in PATH and retry

همه کپی‌های آن را با where.exe chromedriver در ویندوز یا which -a chromedriver در macOS و لینوکس پیدا کنید، سپس فایل را پاک کنید یا پوشه‌اش را از PATH بیرون بیاورید. اگر نمی‌توانید رایانه را تغییر دهید، مثلاً روی یک سرور بیلد مشترک، SE_SKIP_DRIVER_IN_PATH=true را تنظیم کنید. در آزمایش ما Selenium Manager پس از آن کپی کهنه را نادیده گرفت، درایور 154 را دانلود کرد و نشست شروع شد.

راه‌حل 3: Chrome و ChromeDriver را با Chrome for Testing ثابت کنید

راه‌حل‌های 1 و 2 دنبال Chrome نصب‌شده می‌روند و این برای رایانه توسعه‌دهنده مناسب است. کارهای زمان‌بندی‌شده و مجموعه‌های تست اغلب عکس آن را می‌خواهند: همان مرورگر در هر اجرا، و به‌روزرسانی هر وقت خودتان تصمیم بگیرید. Chrome for Testing بیلدی از Chrome است که برای همین کار ساخته شده. خودش را به‌روز نمی‌کند و هر نسخه آن همراه ChromeDriver با همان شماره منتشر می‌شود. با Selenium Manager، ثابت کردن نسخه فقط یک گزینه می‌خواهد:

python
from selenium import webdriver

options = webdriver.ChromeOptions()
options.browser_version = "153"  # Chrome for Testing 153 and ChromeDriver 153
driver = webdriver.Chrome(options=options)
print(driver.capabilities["browserVersion"])  # 153.0.8010.52 in our test
driver.quit()

اگر نسخه اصلی Chrome نصب‌شده متفاوت باشد، Selenium Manager ⁦Chrome for Testing 153⁩ را کنار درایور در کش خود دانلود می‌کند؛ اگر Chrome نصب‌شده از قبل 153 باشد، همان را به کار می‌برد. SE_FORCE_BROWSER_DOWNLOAD=true باعث می‌شود همیشه بیلد دانلودشده به کار رود و SE_CACHE_PATH کش را جابه‌جا می‌کند، مثلاً به پوشه پروژه.

برای رایانه آفلاین یا ایمیج Docker، آرشیو مرورگر و درایور را از یک ردیف نسخه در داشبورد Chrome for Testing دانلود کنید و Selenium را با options.binary_location و Service(executable_path=...) به آن‌ها ارجاع دهید. اینجا مسیر ثابت مشکلی ندارد، چون مرورگری که کنار آن است نمی‌تواند به‌روز شود.

webdriver-manager، Docker و CI

پروژه‌های قدیمی‌تر Python تابع ChromeDriverManager().install() را از بسته webdriver-manager فرا می‌خوانند؛ README همین بسته اکنون برای ⁦Selenium 4.6+⁩ استفاده از Selenium Manager را توصیه می‌کند. این بسته درایورها را به‌طور پیش‌فرض یک روز در پوشه .wdm کش می‌کند و driver_version="..." درایور را ثابت نگه می‌دارد، در حالی که Chrome جلو می‌رود. این آرگومان را حذف کنید یا فراخوانی را با راه‌حل 1 جایگزین کنید.

کانتینرها و سرورهای بیلد معمولاً پس از یک بیلد دوباره خراب می‌شوند:

  • Dockerfile با Chrome کنونی و درایور ثابت. apt-get install google-chrome-stable هر نسخه‌ای را که روز بیلد جاری باشد نصب می‌کند، در حالی که chromedriver دانلودشده از یک URL نسخه‌دار سر جایش می‌ماند. هر دو را از یک نسخه Chrome for Testing نصب کنید، یا بگذارید Selenium Manager درایور را هنگام اجرا بیاورد.
  • ایمیج‌های Docker خود Selenium. برچسب‌های selenium/standalone-chrome هر دو نسخه را نام می‌برند، مثلاً 153.0-chromedriver-153.0-20260909، پس مرورگر و درایور درون ایمیج با هم مطابق‌اند. پروژه توصیه می‌کند به‌جای latest از برچسب کامل استفاده کنید.
  • runnerهای میزبانی‌شده GitHub. ایمیج‌های Ubuntu، Chrome را همراه ChromeDriver هم‌نسخه آن عرضه می‌کنند که به /usr/bin لینک شده و این پوشه روی PATH است. اگر یکی از گام‌های workflow نسخه دیگری از Chrome نصب کند، آن درایور دیگر مطابق نیست؛ SE_SKIP_DRIVER_IN_PATH=true را تنظیم کنید یا درایور را از همان منبعی نصب کنید که مرورگر را از آن گرفته‌اید.

همین خطا در Edge و اینکه چرا Playwright گرفتار آن نمی‌شود

Edge بر پایه Chromium ساخته شده و درایور آن، msedgedriver (Microsoft Edge WebDriver)، پس از به‌روزرسانی Edge به همین شکل شکست می‌خورد: This version of Microsoft Edge WebDriver only supports Microsoft Edge version 122 و پس از آن Current browser version is 124.0.2478.80. مستندات WebDriver مایکروسافت درایوری می‌خواهد که سه بخش نخست شماره نسخه‌اش با Edge یکی باشد؛ Edge نسخه خود را در edge://settings/help نشان می‌دهد. راه‌حل‌ها اینجا هم کار می‌کنند: Selenium Manager برای webdriver.Edge() درایور msedgedriver را دانلود می‌کند و یک کپی قدیمی روی PATH درست مانند chromedriver قدیمی سر راه آن قرار می‌گیرد.

Playwright از اساس طوری طراحی شده که به این مشکل نخورد. هر نسخه Playwright به بیلدهای مشخصی از مرورگر گره خورده که playwright install آن‌ها را دانلود می‌کند، پس فایل درایور جداگانه‌ای وجود ندارد که باید با مرورگر هم‌گام نگه داشته شود. خطای معادل آن ⁦"Executable doesn't exist"⁩ است که پس از به‌روزرسانی کتابخانه دیده می‌شود و با اجرای دوباره playwright install برطرف می‌شود. اگر چرخه دوهفته‌ای Chrome شما را به بازنگری در انتخاب ابزار واداشته است، مقایسه ما میان Playwright و Selenium یک کار را با هر دو اجرا می‌کند.

اسکریپت Python که درایور کهنه را با نام نشان می‌دهد

این اسکریپت Chrome را به همان شیوه‌ای اجرا می‌کند که راه‌حل 1 توصیه می‌کند و عدم تطابق نسخه را به دو خط تبدیل می‌کند که می‌گویند کدام فایل را باید برداشت. هر دو نسخه اصلی را از پیام بیرون می‌کشد، بررسی می‌کند آیا chromedriver روی PATH به کار رفته است و هر خطای دیگر session not created را بی‌تغییر دوباره بالا می‌فرستد (re-raise).

python
"""Start Chrome with Selenium and explain a driver/browser version mismatch."""
import os
import re
import shutil
import sys

from selenium import webdriver
from selenium.common.exceptions import SessionNotCreatedException
from selenium.webdriver.chrome.service import Service

MISMATCH = re.compile(
    r"only supports Chrome version (?P<driver>\d+)\s+"
    r"Current browser version is (?P<browser>\d+)"
)


def start_chrome(browser_version=None, binary=None, driver_path=None, headless=True):
    """Return a Chrome driver; on a version mismatch, say which driver is stale and exit."""
    options = webdriver.ChromeOptions()
    if browser_version:  # e.g. "154": Selenium Manager fetches that Chrome for Testing + its driver
        options.browser_version = browser_version
    if binary:  # a Chrome for Testing build you unpacked yourself
        options.binary_location = binary
    if headless:
        options.add_argument("--headless")
    service = Service(executable_path=driver_path) if driver_path else None

    try:
        driver = webdriver.Chrome(options=options, service=service)
    except SessionNotCreatedException as exc:
        found = MISMATCH.search(exc.msg or "")
        if not found:
            raise  # "session not created" for another reason: read the full message
        print(f"ChromeDriver {found['driver']} cannot drive Chrome {found['browser']}.")
        on_path = shutil.which("chromedriver")
        if driver_path:
            print(f"The fixed path is stale: {driver_path}")
            print("Remove driver_path and let Selenium Manager pick the driver.")
        elif on_path:
            print(f"Selenium used the chromedriver on PATH: {on_path}")
            print("Delete that file (or set SE_SKIP_DRIVER_IN_PATH=true) and run again.")
        sys.exit(1)

    caps = driver.capabilities
    driver_version = caps["chrome"]["chromedriverVersion"].split(" ")[0]
    print(f"Chrome {caps['browserVersion']} with ChromeDriver {driver_version}")
    return driver


if __name__ == "__main__":
    driver = start_chrome(
        browser_version=os.environ.get("CHROME_VERSION"),
        binary=os.environ.get("CHROME_BINARY"),
        driver_path=os.environ.get("CHROMEDRIVER_PATH"),
    )
    try:
        driver.get("https://example.com/")
        print(driver.title)
    finally:
        driver.quit()

اسکریپت فقط به pip install selenium نیاز دارد؛ اگر متغیر محیطی تنظیم نکنید، Chrome نصب‌شده را اجرا می‌کند.

خروجی چگونه است؟

اسکریپت را پنج بار روی ویندوز 11 با ⁦Selenium 4.50.0⁩ اجرا کردیم؛ در اجراهای 1، 2، 3 و 5 متغیر CHROME_BINARY به ⁦Chrome for Testing 154⁩ اشاره می‌کرد و کش Selenium Manager در پوشه پروژه بود. خط‌هایی که با # شروع می‌شوند برچسب‌های ما هستند و مسیرها کوتاه شده‌اند:

text
# 1. ChromeDriver 152 on PATH
The chromedriver version (152.0.7977.82) detected in PATH at ...\chromedriver.exe might not be compatible with the detected chrome version (154.0.8037.92); currently, chromedriver 154.0.8037.92 is recommended for chrome 154.*, so it is advised to delete the driver in PATH and retry
ChromeDriver 152 cannot drive Chrome 154.
Selenium used the chromedriver on PATH: ...\152.0.7977.82\chromedriver-win64\chromedriver.EXE
Delete that file (or set SE_SKIP_DRIVER_IN_PATH=true) and run again.

# 2. CHROMEDRIVER_PATH set to ChromeDriver 152
ChromeDriver 152 cannot drive Chrome 154.
The fixed path is stale: ...\152.0.7977.82\chromedriver-win64\chromedriver.exe
Remove driver_path and let Selenium Manager pick the driver.

# 3. No driver anywhere: Selenium Manager downloads 154
Chrome 154.0.8037.92 with ChromeDriver 154.0.8037.92
Example Domain

# 4. CHROME_VERSION=153 (with SE_FORCE_BROWSER_DOWNLOAD=true)
Chrome 153.0.8010.52 with ChromeDriver 153.0.8010.52
Example Domain

# 5. Run 1 again with SE_SKIP_DRIVER_IN_PATH=true
Chrome 154.0.8037.92 with ChromeDriver 154.0.8037.92
Example Domain

خط نخست اجرای شماره 1 هشدار خود Selenium Manager است که از راه ماژول logging در Python چاپ شده است.

دیگر پیام‌های «session not created»

هر session not created به نسخه‌ها مربوط نیست. دو مورد دیگر هنگام آزمایش‌های ما پیش آمد و اسکریپت آن‌ها را بی‌تغییر عبور می‌دهد:

پیام پس از «session not created»چه اتفاقی افتادچه چیزی را بررسی کنید
from unknown error: no chrome binary at ...binary_location به فایلی اشاره می‌کند که وجود نداردمسیر درون options.binary_location
Chrome failed to start: crashed. همراه با DevToolsActivePort file doesn't existChrome بلافاصله پس از اجرا بسته شد؛ در آزمایش ما نشست دیگری از همان پوشه پروفایل استفاده می‌کردبرای هر نشست یک --user-data-dir جدا، یا هیچ

کجا با این خطا روبه‌رو می‌شوید؟

  • اسکرپرهای زمان‌بندی‌شده و پایش قیمت که بدون ناظر اجرا می‌شوند: نخستین اجرا پس از به‌روزرسانی Chrome پیش از بار شدن هر صفحه‌ای شکست می‌خورد.
  • مجموعه‌های تست روی لپ‌تاپ توسعه‌دهندگان که درایوری از یک راهنمای نصب قدیمی هنوز روی PATH آن‌ها مانده است.
  • پایپ‌لاین‌های CI پس از تغییر ایمیج runner یا ایمیج پایه Docker.
  • سرورهای مشترک که کسی سال‌ها پیش chromedriver را برای همه روی آن‌ها نصب کرده است.

بررسی نسخه پیش از آنکه Chrome حتی یک صفحه بار کند انجام می‌شود، پس علت هرگز شبکه نیست. اسکرپری که پشت یک پروکسی دیتاسنتر کار می‌کند همان‌طور شکست می‌خورد که اسکرپری روی اتصال خانگی، و عوض کردن پروکسی چیزی را تغییر نمی‌دهد.

اشتباه‌های رایج

  • دوباره نوشتن مسیر یک درایور تازه دانلودشده در کد. تا وقتی Chrome دو نسخه جلو برود کار می‌کند، یعنی حالا حدود چهار هفته.
  • به‌روز کردن کپی اشتباه. تا وقتی یک کپی قدیمی‌تر زودتر در PATH قرار دارد، درایور جدیدتر در پوشه‌ای دیگر کمکی نمی‌کند.
  • پایین آوردن نسخه Chrome روزمره برای جور شدن با یک درایور قدیمی. از وصله‌های امنیتی چشم می‌پوشید؛ برای مرورگر قدیمی‌تر از Chrome for Testing استفاده کنید.
  • تکیه بر حاشیه یک‌نسخه‌ای. هشدار در لاگی می‌نشیند که کسی آن را نمی‌خواند.
  • افزودن --disable-build-check به ChromeDriver. این سوئیچ پشتیبانی‌نشده مقایسه را کنار می‌گذارد و درایور هشدار می‌دهد که باگ‌هایی را که فقط با آن دیده می‌شوند نباید گزارش کرد. عدم تطابق را پنهان می‌کند، نه اینکه برطرفش کند.

راهنمای انتخاب

آنچه می‌بینیدچه کنید
نسخه اصلی درایور دو نسخه یا بیشتر پایین‌تر از Chrome استمسیر ثابت را بردارید؛ بگذارید Selenium Manager درایور مطابق را پیدا کند
هشدار Selenium Manager درباره درایوری در PATHآن فایل را پاک کنید یا SE_SKIP_DRIVER_IN_PATH=true را تنظیم کنید
درایور جدیدتر از Chrome استChrome را از صفحه «درباره Google Chrome» به‌روز کنید یا با browser_version ثابت کنید
تست‌ها باید هفته‌ها روی همان مرورگر اجرا شوندChrome و ChromeDriver را با Chrome for Testing ثابت کنید
خطا پس از بیلد دوباره ایمیج Dockerهر دو را از یک نسخه Chrome for Testing نصب کنید یا از ایمیج Selenium با برچسب کامل استفاده کنید
Selenium قدیمی‌تر از 4.6Selenium را ارتقا دهید
همین پیام از msedgedriverهمان گام‌ها با webdriver.Edge()؛ edge://settings/help را بررسی کنید

پرسش‌های متداول

چرا ChromeDriver از کار افتاد در حالی که من چیزی را تغییر نداده‌ام؟

Chrome خودش را به‌روز کرد و به‌روزرسانی را در اجرای بعدی اعمال کرد، در حالی که فایل chromedriver روی نسخه قدیمی‌اش ماند. وقتی مرورگر دو نسخه اصلی جلوتر برود، یا درایور از مرورگر جدیدتر باشد، نشست رد می‌شود.

آیا ⁦ChromeDriver 153⁩ می‌تواند ⁦Chrome 154⁩ را اجرا کند؟

بله، با یک هشدار در لاگ درایور؛ در آزمایش ما نشست به‌طور عادی شروع شد. ⁦ChromeDriver 153⁩ نسخه 155 از Chrome و هر نسخه قدیمی‌تر از 153 را رد می‌کند.

Selenium Manager درایورهایی را که دانلود می‌کند کجا ذخیره می‌کند؟

در ~/.cache/selenium درون پوشه خانگی شما، مرتب‌شده بر اساس درایور، پلتفرم و نسخه، همراه با هر بیلد Chrome for Testing که دانلود کرده باشد. برای نگه داشتن کش در پوشه پروژه، SE_CACHE_PATH را تنظیم کنید.

آیا باید جلوی به‌روزرسانی Chrome را بگیرم تا درایور مطابق بماند؟

نه در مرورگری که هر روز با آن کار می‌کنید، چون به‌روزرسانی‌ها وصله‌های امنیتی دارند. برای تست‌هایی که نباید تغییر کنند از Chrome for Testing استفاده کنید: هرگز خودش را به‌روز نمی‌کند و خودتان تصمیم می‌گیرید کی به نسخه جدیدتر بروید.

آیا پروکسی می‌تواند باعث «session not created» شود؟

نه. ChromeDriver نسخه‌ها را پیش از آنکه Chrome هیچ صفحه‌ای را باز کند مقایسه می‌کند و آرگومان --proxy-server فقط روی ترافیک پس از آن اثر دارد. با این حال پروکسی شرکت ممکن است جلوی دانلود Selenium Manager را بگیرد؛ SE_PROXY را تنظیم کنید تا دانلود از آن پروکسی عبور کند.

آیا همین راه‌حل در Java، ⁦C#⁩ و JavaScript هم کار می‌کند؟

بله. Selenium Manager از نسخه 4.6 همراه همه بسته‌های رسمی Selenium عرضه می‌شود: در Java خط System.setProperty("webdriver.chrome.driver", ...) را حذف کنید؛ در ⁦C#⁩ و JavaScript دیگر مسیر درایور را ندهید.

خلاصه

پیام «This version of ChromeDriver only supports Chrome version N» یعنی Chrome خودش را به‌روز کرده و فایل درایور نه. ChromeDriver همان نسخه اصلی را می‌پذیرد و با هشدار، یک نسخه جدیدتر را هم؛ پس در چرخه دوهفته‌ای Chrome، درایوری که ثابت مانده حدود چهار هفته دوام می‌آورد. مسیرهای ثابت درایور و کپی‌های قدیمی روی PATH را بردارید، بگذارید Selenium Manager درایور مطابق را پیدا کند و جایی که اجراها باید یکسان بمانند، هر دو را با Chrome for Testing ثابت کنید.

وقتی نشست دوباره شروع شد، گام بعدی در بیشتر کارهای اسکرپینگ تنظیم شبکه است؛ راهنمای ما درباره استفاده از پروکسی در Selenium به Chrome، Edge، احراز هویت و SOCKS5 می‌پردازد.

برای سایت‌هایی که بازدیدکنندگان را بر اساس اعتبار آدرس IP آن‌ها می‌سنجند، این ترافیک را از یک پروکسی مسکونی بفرستید که از اتصال‌های خانگی خارج می‌شود.

پرسش از ChatGPTپرسش از Claude