FA-TOOLS — Header Component

آموزش Selenium با پایتون — اتوماسیون مرورگر

رفیق برنامه‌نویس، آماده‌ای تا جادوی اتوماسیون وب رو با پایتون و Selenium تجربه کنی؟ تو دنیای پرسرعت امروز، دیگه وقت نداریم کارهای تکراری وب رو دستی انجام بدیم. از تست خودکار وب‌سایت‌ها گرفته تا جمع‌آوری داده‌ها (Web Scraping) و حتی شبیه‌سازی فعالیت کاربر، Selenium با پایتون مثل یک دستیار خستگی‌ناپذیر کنارته. با این مقاله جامع، قدم به قدم همراهتیم تا از صفر تا صد این مهارت فوق‌العاده رو یاد بگیری و به مرورگرت فرمان بدی. همین الان می‌تونی به کدهای آماده و اسنیپت‌های پایتون ما یه سر بزنی و ابزارهات رو تکمیل کنی.

برای هر سوال یا نیاز به پشتیبانی هم می‌تونی با شماره 09202232789 در تماس باشی.

نقشه راه آموزش Selenium با پایتون

آموزش Selenium با پایتون — اتوماسیون مرورگر — تصویر 1

✨ شروع سریع

  • نصب پایتون و Selenium
  • دانلود WebDriver (کروم/فایرفاکس)
  • اولین اسکریپت: باز کردن مرورگر

🛠️ کارهای اصلی

  • پیدا کردن المنت‌ها (ID, Class, XPath, CSS Selector)
  • تعامل با فرم‌ها و دکمه‌ها
  • استراتژی‌های انتظار (Implicit, Explicit Wait)

💡 تکنیک‌های پیشرفته

  • کار با پاپ‌آپ‌ها و فریم‌ها
  • اسکرول صفحه و اسکرین‌شات
  • حالت Headless (مرورگر بدون رابط کاربری)
  • الگوی طراحی Page Object Model (POM)

✅ نگهداری و عیب‌یابی

  • مدیریت خطا و بستن مرورگر
  • نکات کلیدی برای بهینه‌سازی
  • پاسخ به مشکلات رایج (Troubleshooting)

فهرست مطالب

آموزش Selenium با پایتون — اتوماسیون مرورگر — تصویر 2

۱. Selenium چیه و چرا باید ازش استفاده کنیم؟

آموزش Selenium با پایتون — اتوماسیون مرورگر — تصویر 3

اگه بخوایم خودمونی بگیم، Selenium یه ابزار قدرتمنده که به برنامه‌ها (مثل پایتون) اجازه میده تا مرورگرهای وب رو درست مثل یه کاربر واقعی کنترل کنن. یعنی چی؟ یعنی می‌تونه صفحات رو باز کنه، روی دکمه‌ها کلیک کنه، متن وارد کنه، فرم‌ها رو پر کنه و حتی اسکرین‌شات بگیره. همه این کارها به صورت خودکار انجام میشه. این قابلیت باعث میشه Selenium تو حوزه‌های مختلفی مثل:

  • تست خودکار نرم‌افزار (Automated Testing): برای اطمینان از اینکه همه بخش‌های وب‌سایت یا وب‌اپلیکیشن درست کار می‌کنن، بدون اینکه نیاز باشه یه نفر دستی همه چیز رو چک کنه.
  • جمع‌آوری داده از وب (Web Scraping): اگه نیاز داری اطلاعات خاصی رو از وب‌سایت‌ها جمع‌آوری کنی، Selenium می‌تونه این کار رو برات ساده کنه، مخصوصاً وقتی محتوا با جاوااسکریپت داینامیک لود میشه.
  • اتوماسیون کارهای تکراری (Repetitive Task Automation): هر کار تکراری که تو مرورگر انجام میدی (مثلاً پر کردن یه فرم تکراری یا لاگین به چند سایت)، می‌تونی با Selenium اتوماتیک کنی.

به همین دلیل، یادگیری Selenium سرمایه‌گذاری بزرگی تو زمان و بهره‌وری تو حساب میشه. یه بار کد می‌نویسی، بارها استفاده می‌کنی.

۲. پایتون، بهترین دوست Selenium

شاید بپرسی چرا پایتون؟ Selenium با زبان‌های برنامه‌نویسی مختلفی مثل جاوا، C#، روبی و PHP هم کار می‌کنه، اما پایتون یه حال و هوای دیگه داره. دلایلش هم زیاده:

  • سادگی و خوانایی: پایتون زبانی بسیار ساده و خوانا است که نوشتن کدهای تمیز و قابل فهم رو راحت می‌کنه. این یعنی تو کمتر از بقیه زبان‌ها، درگیر پیچیدگی‌های دستوری میشی.
  • جامعه کاربری بزرگ: جامعه پایتون خیلی بزرگه و اگه به مشکلی برخوردی، تقریباً همیشه یه راه‌حل یا یه نفر که قبلاً این مشکل رو تجربه کرده، پیدا می‌کنی.
  • کتابخانه‌های غنی: پایتون کلی کتابخانه دیگه هم داره که می‌تونی کنار Selenium ازشون استفاده کنی؛ مثلاً برای تحلیل داده، مدیریت فایل‌ها یا حتی ساخت رابط کاربری.
  • توسعه سریع: با پایتون می‌تونی خیلی سریع نمونه‌های اولیه (prototypes) بسازی و ایده‌هات رو عملی کنی.

در کل، ترکیب پایتون و Selenium یه تیم برنده برای اتوماسیون وب رو تشکیل میده که هم کارا است و هم توسعه‌دهنده‌ها رو خوشحال نگه میداره. برای دیدن نمونه کدهای بیشتر می‌تونی سری به بخش اسنیپت‌های پایتون ما بزنی.

۳. شروع کار: نصب و راه‌اندازی

قبل از اینکه کد بزنیم، باید محیط کارمون رو آماده کنیم. سه تا چیز اصلی لازم داریم:

  1. پایتون (اگه نصب نیست)
  2. کتابخانه Selenium برای پایتون
  3. درایور مرورگر (WebDriver)

۳.۱. نصب پایتون

اگه پایتون رو هنوز نصب نکردی، به وب‌سایت رسمی پایتون (python.org) برو و آخرین نسخه پایدار رو دانلود و نصب کن. موقع نصب، حواست باشه گزینه “Add Python to PATH” رو تیک بزنی تا پایتون از هرجای سیستم قابل اجرا باشه.

۳.۲. نصب کتابخانه Selenium

بعد از نصب پایتون، ترمینال یا Command Prompt رو باز کن و دستور زیر رو وارد کن:

pip install selenium

با این کار، کتابخانه Selenium روی سیستم شما نصب میشه.

۳.۳. دانلود WebDriver

Selenium برای ارتباط با مرورگرت، به یک “درایور” نیاز داره. این درایورها مخصوص هر مرورگر هستن. محبوب‌ترین‌هاش:

  • برای Google Chrome: ChromeDriver (نسخه درایور باید با نسخه مرورگرت یکی باشه)
  • برای Mozilla Firefox: GeckoDriver
  • برای Microsoft Edge: Edge WebDriver

بعد از دانلود، فایل اجرایی (مثلاً chromedriver.exe یا geckodriver) رو تو یه مسیر مشخص (مثل پوشه پایتون یا پوشه پروژه) قرار بده. یا اینکه مسیرش رو به PATH سیستمت اضافه کن. من معمولاً توصیه می‌کنم تو همون پوشه پروژت بزاریش که کدها رو جابجا می‌کنی، براورزر درایور هم همیشه کنارت باشه.

۴. اولین اسکریپت اتوماسیون شما

حالا که همه چیز آماده است، بیا یه کد ساده بزنیم که یه صفحه رو باز کنه و عنوانش رو چاپ کنه.

۴.۱. باز کردن یک مرورگر

اینجا یه مثال برای باز کردن کروم داریم. اگه از فایرفاکس استفاده می‌کنی، webdriver.Chrome رو به webdriver.Firefox تغییر بده.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time

# مسیر به فایل ChromeDriver رو مشخص کن
# اگه WebDriver رو به PATH سیستم اضافه کردی، نیازی به این خط نیست
# service = Service(executable_path='/path/to/chromedriver') 
# driver = webdriver.Chrome(service=service)

# یا اگه درایور تو PATH سیستم هست یا در کنار اسکریپت
driver = webdriver.Chrome() 

# یه صفحه وب رو باز می‌کنیم
driver.get("https://fa-tools.ir/")

# عنوان صفحه رو چاپ می‌کنیم
print(f"عنوان صفحه: {driver.title}")

# چند ثانیه صبر می‌کنیم تا بتونیم مرورگر رو ببینیم
time.sleep(5) 

# مرورگر رو می‌بندیم
driver.quit()

همچین کد ساده‌ای نشون میده که چقدر شروع کار با Selenium راحت و سر راست هست. می‌تونی تو همین لحظه به صفحه اصلی fa-tools.ir هم سری بزنی.

۴.۲. پیدا کردن المنت‌ها (Finding Elements)

قلب اتوماسیون وب اینجاست: پیدا کردن المنت‌های مورد نظر روی صفحه. Selenium روش‌های مختلفی برای این کار داره:

  • By.ID: بهترین و سریع‌ترین روش اگه المنت ID منحصربه‌فردی داشته باشه.
  • By.NAME: با استفاده از ویژگی name المنت.
  • By.CLASS_NAME: با استفاده از نام کلاس المنت. (ممکنه چند المنت هم‌نام داشته باشیم)
  • By.TAG_NAME: با استفاده از نام تگ HTML (مثلاً div, a, input).
  • By.LINK_TEXT: برای پیدا کردن لینک‌ها بر اساس متن کامل لینک.
  • By.PARTIAL_LINK_TEXT: برای پیدا کردن لینک‌ها بر اساس بخشی از متن لینک.
  • By.CSS_SELECTOR: روش قدرتمند و انعطاف‌پذیر با استفاده از انتخابگرهای CSS.
  • By.XPATH: قدرتمندترین و انعطاف‌پذیرترین روش که تقریباً هر المنت رو میشه باهاش پیدا کرد، اما ممکنه کمی کندتر باشه و به نگهداری بیشتری نیاز داشته باشه.
# پیدا کردن المنت با ID
element_by_id = driver.find_element(By.ID, "some-id")

# پیدا کردن المنت با کلاس (اولین المنت)
element_by_class = driver.find_element(By.CLASS_NAME, "some-class")

# پیدا کردن همه المنت‌ها با تگ 'a' (لینک‌ها)
all_links = driver.find_elements(By.TAG_NAME, "a")
for link in all_links:
    print(link.get_attribute("href"))

# پیدا کردن المنت با CSS Selector
element_by_css = driver.find_element(By.CSS_SELECTOR, "div.container > p.text")

# پیدا کردن المنت با XPath
element_by_xpath = driver.find_element(By.XPATH, "//input[@name='username']")

۴.۳. تعامل با المنت‌ها

حالا که المنت‌ها رو پیدا کردیم، چطور باهاشون کار کنیم؟

  • send_keys("متن شما"): برای وارد کردن متن به فیلدهای ورودی (input).
  • click(): برای کلیک روی دکمه‌ها، لینک‌ها یا هر المنت قابل کلیک.
  • clear(): برای پاک کردن محتوای یک فیلد ورودی.
  • text: برای گرفتن متن قابل مشاهده یک المنت.
  • get_attribute("نام_ویژگی"): برای گرفتن مقدار یک ویژگی HTML (مثلاً href یک لینک).
# فرض می‌کنیم یه فیلد جستجو با ID 'search-box' داریم
search_box = driver.find_element(By.ID, "search-box")
search_box.send_keys("آموزش Selenium")
search_box.submit() # یا می‌تونیم دکمه جستجو رو پیدا کرده و روش کلیک کنیم

# اگه یه دکمه با متن "Submit" داریم
submit_button = driver.find_element(By.XPATH, "//button[contains(text(), 'Submit')]")
submit_button.click()

۴.۴. استراتژی‌های انتظار (Waiting Strategies)

این یکی خیلی مهمه! صفحات وب امروزی داینامیک هستن و المنت‌ها ممکنه بلافاصله بعد از لود صفحه در دسترس نباشن. اگه Selenium سریع‌تر از بارگذاری المنت‌ها بخواد باهاشون تعامل کنه، با ارور NoSuchElementException مواجه میشی. برای حل این مشکل، از استراتژی‌های انتظار استفاده می‌کنیم:

  • Implicit Wait (انتظار ضمنی): یه زمان کلی برای کل WebDriver تعریف می‌کنه. اگه Selenium نتونه المنت رو پیدا کنه، تا اون زمان مشخص صبر می‌کنه و بعد ارور میده.
  • Explicit Wait (انتظار صریح): هوشمندانه‌تره. به WebDriver میگه تا زمانی که یک شرط خاص (مثل قابل کلیک بودن یک المنت) برقرار نشده، صبر کن.

انتظار ضمنی (Implicit Wait)

driver.implicitly_wait(10) # تا ۱۰ ثانیه برای پیدا کردن المنت صبر می‌کنه

این کد به Selenium میگه برای هر find_element که با شکست مواجه میشه، تا ۱۰ ثانیه صبر کنه.

انتظار صریح (Explicit Wait)

این روش دقیق‌تره و با کلاس WebDriverWait و expected_conditions استفاده میشه.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# تا زمانی که المنت با ID 'myButton' قابل کلیک شود، حداکثر تا ۲۰ ثانیه صبر کن
try:
    button = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.ID, "myButton"))
    )
    button.click()
except Exception as e:
    print(f"خطا: المنت یافت نشد یا قابل کلیک نبود: {e}")

برای کارهای پیچیده‌تر، انتظار صریح بهترین انتخابه. برای یادگیری بیشتر در مورد استراتژی‌های انتظار، می‌تونی به کدهای آماده و اسنیپت‌های ما مراجعه کنی.

۵. مفاهیم پیشرفته در Selenium

تا اینجا اصول اولیه رو یاد گرفتیم، حالا بریم سراغ چند تا تکنیک جذاب‌تر.

۵.۱. کار با پاپ‌آپ‌ها و هشدارها (Alerts)

بعضی وب‌سایت‌ها از پاپ‌آپ‌های جاوااسکریپت (Alert, Confirm, Prompt) استفاده می‌کنن. Selenium برای مدیریت اینها، یه رابط مخصوص داره:

  • driver.switch_to.alert: برای رفتن به پنجره هشدار.
  • alert.accept(): کلیک روی “OK” یا “Yes”.
  • alert.dismiss(): کلیک روی “Cancel” یا “No”.
  • alert.text: گرفتن متن هشدار.
  • alert.send_keys("متن"): وارد کردن متن به پاپ‌آپ Prompt.
try:
    alert = driver.switch_to.alert
    print(f"متن هشدار: {alert.text}")
    alert.accept() # تایید هشدار
except NoAlertPresentException:
    print("هیچ هشداری وجود ندارد.")

۵.۲. کار با فریم‌ها (Frames)

اگه دیدی Selenium نمی‌تونه المنت مورد نظرت رو پیدا کنه، یکی از دلایلش می‌تونه این باشه که اون المنت داخل یه iframe قرار داره. برای تعامل با المنت‌های داخل فریم، باید اول به اون فریم “سوئیچ” کنی:

# سوئیچ با ID یا Name فریم
driver.switch_to.frame("frame-id-or-name")

# سوئیچ با المنت فریم
# frame_element = driver.find_element(By.TAG_NAME, "iframe")
# driver.switch_to.frame(frame_element)

# حالا می‌تونی با المنت‌های داخل فریم کار کنی
element_in_frame = driver.find_element(By.ID, "element-inside-frame")

# برای برگشتن به محتوای اصلی صفحه
driver.switch_to.default_content()

اگه با جاوااسکریپت و CSS کار می‌کنی، حتماً سری به اسنیپت‌های جاوااسکریپت و اسنیپت‌های CSS ما هم بزن، شاید اونجا هم ایده‌هایی برای کار با فریم‌ها پیدا کنی.

۵.۳. کار با Dropdownها و Select Elements

برای کار با تگ‌های <select> (دروپ‌داون‌ها)، Selenium یه کلاس اختصاصی به اسم Select داره که کار رو خیلی راحت‌تر می‌کنه.

from selenium.webdriver.support.ui import Select

# فرض می‌کنیم یه دروپ‌داون با ID 'my-dropdown' داریم
select_element = driver.find_element(By.ID, "my-dropdown")
select = Select(select_element)

# انتخاب بر اساس مقدار (value)
select.select_by_value("option1")

# انتخاب بر اساس متن قابل مشاهده
select.select_by_visible_text("Option Text 2")

# انتخاب بر اساس ایندکس (اولین گزینه ایندکس 0 دارد)
select.select_by_index(2)

# دریافت تمام گزینه‌های دروپ‌داون
for option in select.options:
    print(option.text)

۵.۴. اسکرول کردن و اسکرین‌شات گرفتن

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

# اسکرول به پایین صفحه
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # یه مکث کوتاه برای لود شدن المنت‌ها

# اسکرول به المنت خاص
target_element = driver.find_element(By.ID, "some-footer-element")
driver.execute_script("arguments[0].scrollIntoView();", target_element)
time.sleep(2)

# گرفتن اسکرین‌شات
driver.save_screenshot("screenshot.png")
# یا اسکرین‌شات از یک المنت خاص
# target_element.screenshot("element_screenshot.png")

۵.۵. حالت Headless (مرورگر بدون رابط کاربری)

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

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless") # فعال کردن حالت Headless
chrome_options.add_argument("--disable-gpu") # توصیه شده برای ویندوز
chrome_options.add_argument("--window-size=1920,1080") # تنظیم اندازه پنجره مجازی

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://fa-tools.ir/")
print(f"عنوان صفحه در حالت Headless: {driver.title}")
driver.quit()

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

۵.۶. الگوی طراحی Page Object Model (POM)

اگه داری یه پروژه اتوماسیون بزرگ رو انجام میدی، خیلی مهمه که کدهات تمیز و قابل نگهداری باشن. POM یه الگوی طراحی (Design Pattern) است که بهت کمک می‌کنه کدهای مربوط به یک صفحه وب رو تو یه کلاس جداگانه سازماندهی کنی.

در این الگو، برای هر صفحه یا جزء اصلی وب‌سایت، یک “Page Object” (یک کلاس پایتون) می‌سازی. این کلاس شامل موارد زیر میشه:

  • Locatorها: روش‌های پیدا کردن المنت‌ها (مثل ID, XPath) به عنوان متغیرهای ثابت.
  • متدها: عملیاتی که کاربر روی اون صفحه انجام میده (مثل login(), search()).

این کار باعث میشه:

  • کد خواناتر بشه: عملیات کاربردی در یک جا جمع میشن.
  • نگهداری راحت‌تر بشه: اگه UI وب‌سایت تغییر کنه، فقط کافیه Page Object مربوط به اون صفحه رو ویرایش کنی، نه تمام اسکریپت‌های تست.
  • قابلیت استفاده مجدد: متدها و Locatorها رو می‌تونی تو تست‌های مختلف استفاده کنی.

مثال ساختار POM:

ساختار فایل:


project/
├── tests/
│   └── test_login.py
├── pages/
│   └── login_page.py
│   └── home_page.py
└── drivers/
    └── chromedriver
    

نمونه کلاس Page Object (login_page.py):

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginPage:
    URL = "https://example.com/login"
    USERNAME_INPUT = (By.ID, "username")
    PASSWORD_INPUT = (By.ID, "password")
    LOGIN_BUTTON = (By.XPATH, "//button[@type='submit']")
    ERROR_MESSAGE = (By.CLASS_NAME, "error-message")

    def __init__(self, driver):
        self.driver = driver

    def load(self):
        self.driver.get(self.URL)

    def login(self, username, password):
        self.driver.find_element(*self.USERNAME_INPUT).send_keys(username)
        self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password)
        self.driver.find_element(*self.LOGIN_BUTTON).click()

    def get_error_message(self):
        return WebDriverWait(self.driver, 10).until(
            EC.visibility_of_element_located(self.ERROR_MESSAGE)
        ).text
    

نمونه اسکریپت تست (test_login.py):

import pytest
from selenium import webdriver
from pages.login_page import LoginPage # فرض می‌کنیم فایل login_page.py در پوشه pages است

@pytest.fixture
def browser():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

def test_successful_login(browser):
    login_page = LoginPage(browser)
    login_page.load()
    login_page.login("correct_user", "correct_password")
    # اینجا باید بررسی کنی که لاگین موفقیت آمیز بوده
    # مثلاً با بررسی URL یا وجود المنت Home Page

def test_failed_login(browser):
    login_page = LoginPage(browser)
    login_page.load()
    login_page.login("wrong_user", "wrong_password")
    assert "Invalid credentials" in login_page.get_error_message()
    

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

۶. بهترین روش‌ها و نکته‌ها

برای اینکه اتوماسیون‌هات پایدار و بهینه باشن، چند تا نکته مهم رو در نظر داشته باش:

۶.۱. مدیریت خطا و بستن مرورگر

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

driver = webdriver.Chrome()
try:
    driver.get("https://fa-tools.ir/")
    # کارهای اتوماسیون شما
    # ...
except Exception as e:
    print(f"خطایی رخ داد: {e}")
finally:
    driver.quit() # مطمئن میشیم مرورگر همیشه بسته میشه

۶.۲. بهینه‌سازی Locatorها

انتخاب Locator مناسب، تو پایداری اسکریپتت نقش حیاتی داره. همیشه سعی کن از باثبات‌ترین Locator ممکن استفاده کنی:

مقایسه Locatorها در Selenium
نوع Locator مزایا و معایب
ID (By.ID) ✔︎ سریع‌ترین و پایدارترین (اگه ID منحصربه‌فرد باشه). ❌ کمتر در دسترس.
CSS Selector (By.CSS_SELECTOR) ✔︎ قدرتمند، خوانا و سریع‌تر از XPath. ❌ کمی پیچیده برای تازه‌کارها.
XPath (By.XPATH) ✔︎ انعطاف‌پذیرترین، هر المنت را پیدا می‌کند. ❌ کندتر و شکننده‌تر در برابر تغییرات UI.
Name, Class Name, Tag Name ✔︎ ساده برای المنت‌های منحصربه‌فرد. ❌ اغلب غیر منحصربه‌فرد و ناپایدار.

سعی کن تا حد امکان از ID و CSS Selector استفاده کنی و XPath رو به عنوان آخرین راه حل نگه داری.

۷. عیب‌یابی سریع: مشکلات رایج و راه‌حل‌ها

خب، هیچ پروژه‌ای بدون چالش نیست! اینا بعضی از مشکلاتی هستن که ممکنه باهاشون روبرو بشی و راه‌حل‌هاشون:

۷.۱. ارور NoSuchElementException

علت: المنت مورد نظر پیدا نشده.

  • راه‌حل ۱ (انتظار): تقریباً ۹۰٪ مواقع مشکل از اینه که صفحه هنوز لود نشده. از WebDriverWait و expected_conditions (انتظار صریح) استفاده کن.
  • راه‌حل ۲ (Locator غلط): مطمئن شو که Locator (ID, XPath, CSS Selector) رو درست نوشتی. با استفاده از ابزارهای توسعه مرورگر (Inspect Element) المنت رو دقیقاً بررسی کن.
  • راه‌حل ۳ (داخل Frame): اگه المنت داخل iframe هست، اول باید به اون فریم سوئیچ کنی (driver.switch_to.frame()).
  • راه‌حل ۴ (پنهان بودن): المنت ممکنه مخفی باشه یا نیاز به اسکرول کردن داشته باشی تا ظاهر بشه (driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")).

۷.۲. ارور WebDriverException: Message: 'chromedriver' executable needs to be in PATH.

علت: WebDriver (مثل ChromeDriver) پیدا نشده.

  • راه‌حل ۱ (مسیر): مطمئن شو که فایل WebDriver رو تو مسیری گذاشتی که پایتون بتونه پیداش کنه (مثلاً کنار فایل اسکریپتت). یا مسیر کاملش رو به Service(executable_path='مسیر_درایور') پاس بده.
  • راه‌حل ۲ (PATH سیستم): فایل WebDriver رو به متغیر محیطی PATH سیستم عاملت اضافه کن. (این کار برای یه برنامه‌نویس اتوماسیون ضروری است.)
  • راه‌حل ۳ (نسخه نامطابق): نسخه WebDriver باید با نسخه مرورگرت همخونی داشته باشه. اگه مرورگرت آپدیت شده، WebDriver رو هم آپدیت کن.

۷.۳. ارور ElementNotInteractableException

علت: المنت پیدا شده، اما فعلاً قابل تعامل (مثلاً کلیک یا وارد کردن متن) نیست.

  • راه‌حل ۱ (انتظار): با EC.element_to_be_clickable() مطمئن شو که المنت قبل از کلیک کردن، آماده تعامله.
  • راه‌حل ۲ (پوشانده شدن): یه المنت دیگه ممکنه روی المنت مورد نظرت باشه (مثلاً یه پاپ‌آپ یا لایه Overlay). اون المنت رو باید مدیریت کنی (ببندیش یا بهش سوئیچ کنی).
  • راه‌حل ۳ (غیرفعال بودن): المنت ممکنه توسط جاوااسکریپت غیرفعال شده باشه (ویژگی disabled).

۷.۴. مرورگر بدون دلیل بسته می‌شود

علت: مشکل در WebDriver یا ناسازگاری.

  • راه‌حل ۱ (به‌روزرسانی): Selenium و WebDriver و حتی مرورگرت رو به آخرین نسخه به‌روزرسانی کن. ناسازگاری نسخه‌ها از دلایل شایع هستن.
  • راه‌حل ۲ (Optionها): اگه داری از گزینه‌های (Options) خاصی برای مرورگر استفاده می‌کنی (مثلاً حالت Headless), مطمئن شو که درست تنظیم شدن. مثلاً --disable-gpu گاهی اوقات کمک کننده است.
  • راه‌حل ۳ (کش): گاهی اوقات کش مرورگر ممکنه مشکل ایجاد کنه. می‌تونی از پروفایل کاربری تمیز (clean profile) استفاده کنی.

با در نظر گرفتن این راه‌حل‌ها، اکثر مشکلاتی که با Selenium پیش میان، قابل حل هستن. فقط کافیه کمی صبر و تحقیق چاشنی کارت کنی.

۸. سوالات متداول (FAQ)

۱. آیا Selenium فقط برای تست وب‌سایت‌هاست؟

نه رفیق! درسته که Selenium تو تست اتوماتیک خیلی معروفه، اما می‌تونی برای وب اسکرپینگ (جمع‌آوری داده از وب)، اتوماسیون کارهای تکراری روزمره تو مرورگر، و حتی پر کردن خودکار فرم‌ها ازش استفاده کنی. هر جایی که نیاز داری مرورگر یه کار رو خودش انجام بده، Selenium به کارت میاد.

۲. بهترین راه برای پیدا کردن المنت‌ها چیه؟

بهترین راه بستگی به وضعیت المنت داره. اگه المنت ID منحصربه‌فرد داره، همیشه از By.ID استفاده کن، چون سریع‌ترین و پایدارترینه. بعد از اون، CSS Selector یه انتخاب عالی و قدرتمنده. XPath رو بذار برای مواقعی که هیچ راه دیگه‌ای نداری، چون ممکنه به تغییرات UI حساس باشه و کدتو شکننده‌تر کنه.

۳. چطور می‌تونم از بسته شدن ناگهانی مرورگر جلوگیری کنم؟

این مشکل معمولاً به دلیل ناسازگاری نسخه WebDriver با مرورگرت یا قدیمی بودن نسخه Selenium اتفاق میفته. مطمئن شو که همه رو به آخرین نسخه به‌روزرسانی کردی. همچنین، همیشه از بلاک try...finally برای بستن driver.quit() استفاده کن، این باعث میشه حتی اگه اسکریپتت خطا داد، منابع مرورگرت آزاد بشن و سیستم هنگ نکنه.

۴. آیا می‌توانم بدون باز شدن پنجره مرورگر از Selenium استفاده کنم؟

بله، قطعاً! با فعال کردن حالت Headless مرورگر می‌تونی این کار رو انجام بدی. برای کروم، با افزودن chrome_options.add_argument("--headless") به گزینه‌های کروم این قابلیت فعال میشه. این حالت برای اجرای اسکریپت‌ها روی سرورها یا وقتی نمی‌خوای حواس کاربر پرت بشه، خیلی مفیده.

۵. چطور می‌تونم با المنت‌هایی که با جاوااسکریپت لود میشن کار کنم؟

اینجا دقیقاً جاییه که انتظار صریح (Explicit Wait) به کارت میاد. با WebDriverWait و expected_conditions می‌تونی به Selenium بگی تا زمانی که المنت مورد نظرت قابل مشاهده، قابل کلیک یا فعال نشده، صبر کنه. این روش تضمین می‌کنه که کد شما قبل از تعامل با المنت، صبر می‌کنه تا المنت کاملاً آماده باشه. هرچند که زمان وابت هم مهمه و باید یه مقدار منطقی باشه.

۹. حرف آخر

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

یادت باشه، اتوماسیون یه مهارت عملیه؛ هرچی بیشتر کد بزنی و باهاش ور بری، حرفه‌ای‌تر میشی. از امتحان کردن و کاوش کردن نترس. اگه به کمک بیشتری نیاز داری یا دنبال کدهای آماده می‌گردی، حتماً یه سر به کدهای آماده پایتون ما بزن. موفق باشی رفیق!

Table of Contents

آخرین نوشته‌ها