مقدمه
اگر با Selenium وب اسکریپینگ میکنید، یکی از خطاهای پرتکرار این است که سیستم نمیتواند Chromedriver را پیدا کند و پیام «Chromedriver executable needs to be in PATH» را دریافت میکنید. در این مقاله بهصورت عملی و مرحلهبهمرحله یاد میگیرید که Chromedriver چه نقشی دارد، چطور محل آن را تشخیص دهید، و سه روش عملی برای رفع خطا شامل نصب خودکار، اضافهکردن به PATH و مشخصکردن مسیر در اسکریپت را اجرا کنید. مثالها با تمرکز بر Python و Selenium نوشته شدهاند و نکات امنیتی، عملکرد و دیباگ نیز پوشش داده میشوند.
خطا و دلیل آن
Chromedriver یک برنامهٔ اجرایی جداست که رابط بین Selenium WebDriver و مرورگر Chrome را فراهم میکند. وقتی Selenium فرمانی ارسال میکند، Chromedriver آن را به مرورگر ترجمه و پاسخ را بازمیگرداند. اگر سیستم نتواند فایل اجرایی Chromedriver را پیدا کند، Selenium نمیتواند اتصال را برقرار کند و آن خطا تولید میشود.
دو علت رایج:
- Chromedriver نصب نشده یا حذف شده است.
- محل Chromedriver در متغیر محیطی PATH قرار ندارد یا نسخهٔ Chromedriver با نسخهٔ مرورگر Chrome همخوانی ندارد.
نکته: PATH مانند نقشهای است که به سیستم میگوید کدام دایرکتوریها را برای پیدا کردن برنامهها بگردد. اگر فایل در یکی از آن دایرکتوریها نباشد، باید مسیر را مشخص یا PATH را بهروز کنید.
تشخیص و عیبیابی اولیه
قبل از هر تغییر، با این فرمانها بررسی کنید آیا Chromedriver در دسترس است:
which chromedriver # لینوکس / macOSwhere chromedriver # ویندوز (PowerShell یا CMD)اگر جواب هیچ مسیری نداد، یعنی Chromedriver در PATH نیست یا نصب نشده. اگر مسیر برگشت داده شد، آن مسیر را بررسی کنید و مطمئن شوید نسخهٔ فایل با نسخهٔ Chrome سازگار است.
روش 1 — نصب و مدیریت خودکار در اسکریپینگ (Selenium Manager یا webdriver_manager)
برای راحتی و اجتناب از مشکلات PATH، میتوانید از مدیریت خودکار درایور استفاده کنید. دو راه مرسوم:
- Selenium Manager (Selenium 4.6+): بهصورت خودکار درایور مناسب را دانلود و در زمان اجرا مصرف میکند (نیاز به اینترنت دارد).
- webdriver_manager: کتابخانهای که درایور را دانلود و مسیر آن را برمیگرداند.
نمونهٔ استاندارد با webdriver_manager و Selenium 4:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
# options.add_argument('--headless') # در صورت نیاز به حالت headless
driver = webdriver.Chrome(service=service, options=options)
try:
driver.get('https://example.com')
print(driver.title)
finally:
driver.quit()توضیح:
- ورودی: نیاز به کتابخانه webdriver_manager (نصب با
pip install webdriver_manager) و Selenium. - خروجی: یک شیء WebDriver آماده برای اتوماسیون.
- کارکرد: ChromeDriverManager().install() مسیر فایل chromedriver را دانلود و بازمیگرداند؛ سپس آن مسیر در Service ثبت میشود.
مزایا و نکات:
- نیاز به دستکاری PATH ندارد.
- سازگار با CI/CD تا زمانی که اینترنت در دسترس باشد.
- باید توجه کنید که نسخهٔ دانلودشده باید با نسخهٔ Chrome روی ماشین سازگار باشد؛ در صورت ناسازگاری ممکن است خطاهای دیگری ببینید.
اگر از Selenium نسخهٔ جدید استفاده میکنید، گاهی فقط اجرای webdriver.Chrome() کافی است چون Selenium Manager بهصورت خودکار درایور را مدیریت میکند:
from selenium import webdriver
driver = webdriver.Chrome() # Selenium Manager (Selenium >= 4.6) ممکن است درایور را خودکار مدیریت کند
driver.get('https://example.com')
driver.quit()هشدار: روش خودکار به اینترنت و دسترسی شبکه نیاز دارد و در محیطهای ایزوله (مثل سرورهای بدون اینترنت) کار نخواهد کرد.
روش 2 — افزودن Chromedriver به PATH سیستم
روش سنتی این است که فایل اجرایی را دانلود و آن را در پوشهای قرار دهید که در PATH موجود است یا مسیر پوشه را به PATH اضافه کنید.
ویندوز — مراحل:
- Chromedriver را دانلود و در پوشهای مانند
C:\Program Files\chromedriver\قرار دهید. - روی This PC راست-کلیک → Properties → Advanced system settings → Environment Variables کلیک کنید.
- در بخش System variables متغیر Path را پیدا کنید و Edit → New و مسیر پوشه را اضافه کنید.
- تمام پنجرهها را OK کنید و یک ترمینال جدید باز کنید.
لینوکس / macOS — مراحل:
- Chromedriver را در پوشهای مثل
/usr/local/bin/قرار دهید یا به پوشهٔ دلخواه منتقل کنید. - مسیر را به PATH اضافه کنید، برای مثال در Bash:
export PATH=$PATH:/path/to/chromedriver_directory
# برای دائمی شدن، خط بالا را در ~/.bashrc یا ~/.profile اضافه کنیدپس از افزودن، با which chromedriver یا where chromedriver بررسی کنید که سیستم آن را میبیند.
مزایا و معایب:
- مزایا: یکبار تنظیم میشود و همهٔ اسکریپتها میتوانند از آن استفاده کنند.
- معایب: مدیریت نسخهها روی ماشینهای متعدد دشوار است و آپدیت دستی لازم است.
روش 3 — مشخصکردن مسیر Chromedriver در اسکریپت
اگر نمیخواهید PATH را تغییر دهید و یا بهصورت موقتی از یک نسخهٔ مشخص استفاده میکنید، مسیر Chromedriver را مستقیماً در اسکریپت تعیین کنید. در Selenium 4 بهتر است از Service استفاده کنید:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
chromedriver_path = '/path/to/chromedriver'
service = Service(chromedriver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# استفاده از driver ...
driver.quit()توضیح: ساخت Service با مسیر صریح، ساده و قابلانتقال بین ماشینهاست (مثلاً وقتی chromedriver را در یک پوشهٔ پروژه نگه میدارید).
نکته: پارامتر قدیمی executable_path دیگر در نسخههای جدید Selenium توصیه نمیشود و بهتر است از Service استفاده کنید.
نکات امنیتی، عملکرد و پایداری در اسکریپینگ
- امنیت: از منابع رسمی برای دانلود Chromedriver استفاده کنید و در محیطهای حساس قبل از اجرا فایلها را بررسی کنید. از اجرای باینریهای ناشناس خودداری کنید.
- نسخهها: همیشه نسخهٔ chromedriver را با نسخهٔ Chrome سازگار کنید یا از ابزارهایی استفاده کنید که تطبیق نسخه را خودکار انجام میدهند.
- عملکرد و مدیریت حافظه: از چند نمونهٔ WebDriver همزمان فقط در صورت نیاز استفاده کنید و هر زمان کارتان تمام شد از driver.quit() استفاده کنید تا فرآیندهای کروم نشت نکنند.
- خطاها و retry: در هنگام راهاندازی WebDriver احتمال خطاهای شبکه یا دانلود وجود دارد؛ از منطق retry و لاگبرداری مناسب استفاده کنید.
- CI/CD: در محیطهای CI بهتر است chromedriver را یا در تصویر کانتینر نصب کنید یا از webdriver_manager با کش محلی استفاده کنید تا از دانلود مکرر جلوگیری شود.
نمونهٔ مدیریت خطا در اسکریپت
from selenium import webdriver
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
try:
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get('https://example.com')
except WebDriverException as e:
print('WebDriver error:', e)
finally:
try:
driver.quit()
except Exception:
passاین ساختار به شما کمک میکند خطاهای راهاندازی را ثبت کنید و منابع را پاکسازی کنید.
جمعبندی
برای رفع خطای «Chromedriver executable needs to be in PATH» سه مسیر اصلی دارید: استفاده از مدیریت خودکار درایور (Selenium Manager یا webdriver_manager) که ساده و سریع است، افزودن دستی Chromedriver به PATH که یکبار تنظیم میشود، یا تعیین مسیر صریح در اسکریپت با استفاده از Service. هر روش مزایا و محدودیتهای خودش را دارد؛ انتخاب مناسب بستگی به محیط (محلی، سرور، CI)، نیاز به مدیریت نسخه و دسترسی به اینترنت دارد. در نهایت همیشه نسخهٔ Chromedriver را با نسخهٔ Chrome همخوان کنید، از driver.quit() برای آزادسازی منابع استفاده کنید و در محیطهای حساس نکات امنیتی را رعایت کنید.





