FA-TOOLS — Header Component
آموزش playwright با پایتون — اتوماسیون مرورگر

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

رفیق برنامه‌نویس، آماده‌ای قدرت اتوماسیون مرورگر رو با پایتون و Playwright حس کنی؟ اگه دنبال ابزارهای حرفه‌ای برای پروژه‌هات می‌گردی، حتماً یه سری به فروشگاه ابزارها و اسنیپت‌های ما بزن. اونجا کلی چیز باحال پیدا می‌کنی که کارتو راه میندازه. اگه سوالی هم داشتی، همین الان می‌تونی با ما تماس بگیری: 09202232789

نقشه راه سریع: Playwright با پایتون در یک نگاه 🚀

آموزش playwright با پایتون — اتوماسیون مرورگر — تصویر 1
╔════════════════════════════════════════════════════════════════════╗
║ 1. 💡 معرفی Playwright                                       ║
║    - چرا Playwright؟ چرا پایتون؟ مزایای اتوماسیون مرورگر.           ║
╠════════════════════════════════════════════════════════════════════╣
║ 2. 🛠️ نصب و راه‌اندازی                                          ║
║    - Python, Pip, Playwright و Browserها (Chromium, Firefox, WebKit). ║
╠════════════════════════════════════════════════════════════════════╣
║ 3. ✍️ اولین کد: "سلام دنیا"                                    ║
║    - باز کردن صفحه، گرفتن عنوان.                                     ║
╠════════════════════════════════════════════════════════════════════╣
║ 4. 🧩 مفاهیم کلیدی                                          ║
║    - Browser, Page, Locator, Actions, Context.                      ║
╠════════════════════════════════════════════════════════════════════╣
║ 5. 🔍 پیمایش و تعامل                                         ║
║    - انتخابگرها (CSS, XPath, Text), کلیک, تایپ, پر کردن فرم.         ║
╠════════════════════════════════════════════════════════════════════╣
║ 6. ⏱️ مدیریت ناهمزمانی و انتظار                                ║
║    - Async/Await, `expect()`, استراتژی‌های انتظار.                 ║
╠════════════════════════════════════════════════════════════════════╣
║ 7. 📸 گرفتن اسکرین‌شات و PDF                                  ║
║    - مستندسازی و خروجی.                                             ║
╠════════════════════════════════════════════════════════════════════╣
║ 8. 📁 کار با فایل‌ها                                         ║
║    - آپلود و دانلود.                                                 ║
╠════════════════════════════════════════════════════════════════════╣
║ 9. ⚙️ سناریوهای پیشرفته                                       ║
║    - احراز هویت, دیالوگ‌ها, Headless, Parallel, Network Interception.║
╠════════════════════════════════════════════════════════════════════╣
║ 10. ✅ عیب‌یابی سریع و FAQ                                   ║
║    - حل مشکلات رایج، سوالات پر تکرار.                               ║
╚════════════════════════════════════════════════════════════════════╝
    

فهرست مطالب

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

مقدمه: Playwright و دنیای اتوماسیون مرورگر

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

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

تصور کن بتونی هر کاری که یه کاربر عادی توی مرورگر انجام میده رو، با چند خط کد پایتون به صورت خودکار انجام بدی. از پر کردن فرم‌ها و کلیک روی دکمه‌ها گرفته تا گرفتن اسکرین‌شات و تست کردن وب‌سایت‌ها. Playwright این قدرت رو بهت میده، اونم با سرعتی باورنکردنی و پایداری بالا. دیگه لازم نیست نگران ناسازگاری مرورگرها باشی، چون Playwright با Chromium، Firefox و WebKit (موتور Safari) به صورت پیش‌فرض کار می‌کنه.

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

نصب و راه‌اندازی Playwright: گام به گام

قبل از هر چیزی، باید مطمئن بشیم که ابزارهای لازم رو روی سیستممون داریم. نگران نباش، کار سختی نیست و خیلی سریع انجام میشه.

پیش‌نیازها

  • پایتون (Python): مطمئن شو که پایتون 3.7 یا بالاتر روی سیستمت نصبه.
  • Pip: مدیر بسته پایتون که معمولاً با خود پایتون نصب میشه.

مراحل نصب

برای نصب Playwright و مرورگرهای لازم، کافیه این مراحل ساده رو دنبال کنی:

  1. نصب پکیج Playwright:

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

    pip install playwright

    این دستور پکیج اصلی Playwright رو نصب می‌کنه.

  2. نصب مرورگرها:

    Playwright برای کار کردن به مرورگرهای واقعی نیاز داره. نگران نباش، خودش یه دستور داره که هر سه مرورگر اصلی (Chromium، Firefox، WebKit) رو برات نصب می‌کنه:

    python -m playwright install

    این دستور ممکنه چند دقیقه طول بکشه چون فایل‌های مرورگرها رو دانلود می‌کنه. بعد از تموم شدن، Playwright آماده به کار میشه.

برای کدهای آماده پایتون و ابزارهای مرتبط، حتماً یه نگاهی به اسنیپت‌های پایتون ما بندازید. اونجا کلی چیز به درد بخور پیدا می‌کنید!

اولین گام با Playwright: “سلام دنیا”

حالا که Playwright نصبه، وقتشه اولین برنامه‌مون رو بنویسیم. یه برنامه ساده که یک صفحه وب رو باز می‌کنه و عنوانش رو چاپ می‌کنه. بیایم یه فایل با اسم `first_script.py` درست کنیم.


import asyncio
from playwright.async_api import sync_playwright

async def main():
    async with sync_playwright() as p:
        browser = await p.chromium.launch(headless=False) # مرورگر رو باز کن، headless=False یعنی مرورگر رو می‌بینی
        page = await browser.new_page() # یک صفحه جدید باز کن
        await page.goto("https://www.google.com") # به گوگل برو
        print(await page.title()) # عنوان صفحه رو چاپ کن
        await browser.close() # مرورگر رو ببند

if __name__ == '__main__':
    asyncio.run(main()) # تابع اصلی رو اجرا کن

برای اجرای این کد، کافیه توی ترمینال، همونجایی که فایل رو ذخیره کردی، این دستور رو بزنی:

python first_script.py

می‌بینی که یه پنجره کروم باز میشه، میره تو گوگل، بعد عنوان “Google” رو توی ترمینال چاپ می‌کنه و بسته میشه. این یعنی همه چی درست کار می‌کنه!

مفاهیم کلیدی در Playwright: از مرورگر تا المان

برای اینکه بتونی با Playwright کد قوی و قابل اطمینان بزنی، باید مفاهیم اصلیش رو خوب درک کنی. اینجا چند تا از مهم‌ترین‌ها رو با هم مرور می‌کنیم:

  • Browser: این همون نمونه مرورگره که شما لانچش می‌کنید (مثل Chromium، Firefox یا WebKit). میشه Headless باشه (بدون رابط کاربری) یا Headed (با رابط کاربری که می‌بینید).
  • BrowserContext: یک محیط مرورگر مستقل. مثل اینه که توی مرورگرت یه پروفایل جدید بسازی. کوکی‌ها، حافظه لوکال و کش هر کانتکست از هم جداست. این برای تست‌های موازی یا سناریوهایی که نیاز به لاگین‌های متفاوت داری، خیلی مفیده.
  • Page: یک تب یا پنجره مرورگر رو نشون میده. هر کانتکست می‌تونه چندین Page داشته باشه. بیشتر تعاملات شما (کلیک، تایپ، پیمایش) با همین Page انجام میشه.
  • Locator: این جادوی Playwright برای پیدا کردن عناصر توی صفحه است. برخلاف روش‌های قدیمی که ممکنه با تغییرات کوچک UI کدتو بشکونن، Locatorها هوشمندتر و مقاوم‌ترن. مثلاً می‌تونی با متن، نقش (role)، یا حتی ترکیبی از این‌ها عنصر رو پیدا کنی.
  • Actions: عملیاتی که روی عناصر انجام میدی، مثل `click()`، `fill()`، `type()`، `press()` و … . Playwright مطمئن میشه که قبل از انجام هر عملی، عنصر مورد نظر قابل مشاهده و تعامل باشه.
  • Wait Strategies: Playwright به صورت خودکار منتظر می‌مونه تا عناصر در دسترس بشن و عملیات تکمیل بشه. اما بعضی وقت‌ها نیاز داری خودت انتظارهای خاصی رو تنظیم کنی (مثلاً منتظر بمونی تا یک شبکه درخواست کامل بشه).

پیمایش و تعامل با عناصر صفحه

حالا که با مفاهیم اصلی آشنا شدی، وقتشه بریم سراغ عملیات واقعی: پیدا کردن و تعامل با عناصر توی صفحه. Playwright روش‌های متنوعی برای پیدا کردن عناصر ارائه میده که خیلی قدرتمندن.

انواع انتخابگرها (Locators)

Playwright تأکید زیادی روی استفاده از Locatorها داره که پایدارتر از انتخابگرهای قدیمی (مثل CSS Selector مستقیم) هستن. بیایم چند نمونه رو ببینیم:

  • By text: پیدا کردن عنصر با متن قابل مشاهده‌ش.
    await page.get_by_text("ورود").click()

  • By role: پیدا کردن عنصر بر اساس نقش دسترس‌پذیری‌ش (مثل دکمه، لینک، فیلد متنی).
    await page.get_by_role("button", name="ارسال").click()

  • By label: پیدا کردن فیلد ورودی بر اساس برچسب (label) مرتبطش.
    await page.get_by_label("نام کاربری").fill("my_username")

  • By placeholder: پیدا کردن فیلد ورودی بر اساس متن placeholder.
    await page.get_by_placeholder("رمز عبور").fill("my_password")

  • By test ID: اگر توسعه‌دهنده وب تگ `data-test-id` رو اضافه کرده باشه، می‌تونی ازش استفاده کنی.
    await page.get_by_test_id("login-button").click()

  • CSS Selector و XPath: هنوز هم می‌تونی از این روش‌ها استفاده کنی، اما Playwright توصیه می‌کنه اولویت رو به Locatorهای هوشمند بدی.
    await page.locator("#my-id").click()
    await page.locator("xpath=/html/body/div[1]/button").click()

مثال عملی: ورود به یک سایت و پر کردن فرم

بیایم یه سناریوی رایج رو پیاده‌سازی کنیم: ورود به یک سایت فرضی.


import asyncio
from playwright.async_api import sync_playwright

async def login_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://www.example.com/login") # فرض می‌کنیم اینجا صفحه ورودیه

        # پر کردن فیلد نام کاربری
        await page.get_by_label("نام کاربری").fill("admin_user")
        # پر کردن فیلد رمز عبور
        await page.get_by_label("رمز عبور").fill("secure_password123")
        
        # کلیک روی دکمه ورود (فرض می‌کنیم متن دکمه "ورود" هست)
        await page.get_by_role("button", name="ورود").click()

        # منتظر می‌مونیم تا صفحه اصلی یا داشبورد بارگذاری بشه
        # مثلاً تا وقتی که URL تغییر کنه
        await page.wait_for_url("https://www.example.com/dashboard")
        print("با موفقیت وارد شدید و به داشبورد هدایت شدید!")
        print(f"عنوان صفحه: {await page.title()}")

        await browser.close()

if __name__ == '__main__':
    asyncio.run(login_example())

این مثال نشون میده که چقدر راحت میشه با Locatorها و متدهای تعاملی Playwright، فرم‌ها رو پر کرد و روی دکمه‌ها کلیک کرد. برای اسنیپت‌های مربوط به HTML یا CSS که ممکنه برای پیدا کردن عناصر نیاز داشته باشی، سری به اسنیپت‌های HTML و اسنیپت‌های CSS بزن.

مدیریت ناهمزمانی و انتظارها در Playwright

وب‌سایت‌ها امروزه بسیار پویا هستن و به صورت ناهمزمان بارگذاری میشن. Playwright از پایتون `asyncio` برای هندل کردن این ناهمزمانی استفاده می‌کنه تا کدهای شما پایدار و کارآمد باشن. تمام متدهای Playwright از نوع `awaitable` هستن، یعنی باید با `await` ازشون استفاده کنی.

چرا `async/await`؟

`async/await` به پایتون این امکان رو میده که چندین عملیات رو به صورت همزمان (بدون بلاک کردن اجرای برنامه) مدیریت کنه. وقتی یک عملیات I/O (مثل رفتن به یک URL یا کلیک کردن) در حال انجامه، برنامه می‌تونه کارهای دیگه رو انجام بده و بعداً برگرده سراغ اون عملیات.

استفاده از `expect()` برای انتظارات صریح

درسته که Playwright به صورت خودکار منتظر می‌مونه تا عناصر قابل تعامل بشن، اما بعضی وقت‌ها نیاز به انتظارهای خاص‌تری داریم. پکیج `playwright.sync_api.expect` ابزارهای قدرتمندی برای انتظارهای صریح (explicit waits) بهت میده. این خیلی شبیه به Asserts در فریم‌ورک‌های تست نویسی هست.


import asyncio
from playwright.async_api import sync_playwright, expect

async def explicit_wait_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.goto("https://www.example.com") # فرض کنید اینجا بعد از چند ثانیه یه دکمه ظاهر میشه

        # منتظر بمان تا یک دکمه با متن "بارگذاری شد" قابل مشاهده شود
        await expect(page.get_by_role("button", name="بارگذاری شد")).to_be_visible()
        print("دکمه 'بارگذاری شد' مشاهده گردید!")

        # منتظر بمان تا یک متن خاص در صفحه ظاهر شود
        await expect(page.locator("text=محتوای پویا")).to_be_in_viewport()
        print("متن 'محتوای پویا' در viewport قرار گرفت!")

        await browser.close()

if __name__ == '__main__':
    asyncio.run(explicit_wait_example())

`expect()` کلی متدهای دیگه هم داره، مثل `to_have_text()`, `to_have_value()`, `to_be_enabled()` و … که می‌تونی ازشون استفاده کنی. برای یادگیری بیشتر در مورد `asyncio` و مفاهیم ناهمزمانی در پایتون، به اسنیپت‌های پایتون مراجعه کن.

گرفتن اسکرین‌شات و خروجی PDF

یکی از قابلیت‌های کاربردی Playwright، امکان گرفتن اسکرین‌شات از صفحات وب و حتی ذخیره کل صفحه به صورت فایل PDF (برای مرورگرهای Chromium و WebKit) هست. این قابلیت برای گزارش‌گیری، مستندسازی و عیب‌یابی خیلی به دردت می‌خوره.

گرفتن اسکرین‌شات

می‌تونی از کل صفحه، یک بخش خاص از صفحه یا حتی فقط یک عنصر خاص اسکرین‌شات بگیری. متد `screenshot()` روی آبجکت `page` و `locator` قابل استفاده است.


import asyncio
from playwright.async_api import sync_playwright

async def screenshot_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.set_viewport_size({"width": 1920, "height": 1080}) # تنظیم اندازه viewport
        await page.goto("https://www.digikala.com")

        # گرفتن اسکرین‌شات از کل صفحه
        await page.screenshot(path="full_page_digikala.png", full_page=True)
        print("اسکرین‌شات از کل صفحه ذخیره شد: full_page_digikala.png")

        # گرفتن اسکرین‌شات از یک عنصر خاص (مثلاً لوگوی دیجی‌کالا)
        logo_locator = page.locator("a.c-header__logo") # این انتخابگر ممکنه با زمان تغییر کند
        if await logo_locator.is_visible():
            await logo_locator.screenshot(path="digikala_logo.png")
            print("اسکرین‌شات از لوگو ذخیره شد: digikala_logo.png")
        else:
            print("لوگو پیدا نشد.")
            
        await browser.close()

if __name__ == '__main__':
    asyncio.run(screenshot_example())

ذخیره صفحه به صورت PDF

برای ذخیره یک صفحه به صورت PDF، فقط کافیه متد `pdf()` رو صدا بزنی. این قابلیت فقط برای مرورگرهای Chromium و WebKit در دسترسه.


import asyncio
from playwright.async_api import sync_playwright

async def pdf_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch() # فقط با Chromium یا WebKit کار می‌کنه
        page = await browser.new_page()
        await page.goto("https://playwright.dev/python")

        await page.pdf(path="playwright_docs.pdf")
        print("صفحه Playwright به صورت PDF ذخیره شد: playwright_docs.pdf")
            
        await browser.close()

if __name__ == '__main__':
    asyncio.run(pdf_example())

کار با فایل‌ها و دانلودها

اتوماسیون مرورگر فقط به کلیک و تایپ محدود نمیشه. بعضی وقت‌ها لازمه فایل آپلود کنی یا فایلی رو از وب‌سایت دانلود کنی. Playwright برای این سناریوها هم راه حل‌های ساده و قدرتمندی داره.

آپلود فایل

برای آپلود فایل، شما با فیلدهای “ سر و کار دارید. Playwright این کار رو با متد `set_input_files()` روی `locator` انجام میده.


import asyncio
from playwright.async_api import sync_playwright
import os

async def upload_file_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://ps.w.org/svg-support/assets/screenshot-1.png") # یک سایت فرضی برای آپلود (مثال واقعی نیست)

        # ساخت یک فایل dummy برای آپلود
        with open("test_upload.txt", "w") as f:
            f.write("این یک فایل تستی برای آپلود است.")

        # پیدا کردن فیلد آپلود فایل (مثلاً با نوع input[type="file"])
        # این قسمت نیاز به انتخابگر دقیق در سایت هدف دارد
        file_input_locator = page.locator("input[type='file']") 
        # اگر چنین المانی در سایت بالا نباشه، کد خطا میده
        # برای تست واقعی باید به سایتی مثل https://fineuploader.com/demos.html مراجعه کرد.

        # اگر المان پیدا شود، فایل را آپلود کن
        if await file_input_locator.is_visible(): # این خط در صورت نبود المان واقعی خطا می‌دهد.
            await file_input_locator.set_input_files("test_upload.txt")
            print("فایل test_upload.txt با موفقیت آپلود شد.")
        else:
            print("فیلد آپلود فایل پیدا نشد. این مثال برای یک سایت واقعی باید تغییر کند.")

        os.remove("test_upload.txt") # فایل dummy رو پاک می‌کنیم
        await browser.close()

if __name__ == '__main__':
    asyncio.run(upload_file_example())

یادت باشه که `file_input_locator` رو باید با انتخابگر دقیق فیلد آپلود فایل توی سایت خودت جایگزین کنی.

مدیریت دانلودها

دانلود فایل‌ها هم با Playwright کار آسونیه. شما می‌تونی منتظر رویداد دانلود بمونی و بعد اطلاعات فایل دانلود شده رو بگیری و ذخیره‌اش کنی.


import asyncio
from playwright.async_api import sync_playwright

async def download_file_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://www.learningcontainer.com/wp-content/uploads/2020/07/small-sample-text-file.txt") # یک فایل تستی برای دانلود

        async with page.expect_download() as download_info: # منتظر رویداد دانلود باش
            await page.click("body") # یا هر کلیکی که باعث دانلود میشه
                                   # در این مثال، خود صفحه یک فایل هست و مرورگر آن را دانلود می‌کند

        download = await download_info.value
        await download.save_as(os.path.join("downloads", download.suggested_filename))
        print(f"فایل {download.suggested_filename} در پوشه downloads ذخیره شد.")

        await browser.close()

if __name__ == '__main__':
    asyncio.run(download_file_example())

قبل از اجرای این کد، مطمئن شو که یه پوشه با نام `downloads` در کنار فایل پایتون‌ت وجود داره.

سناریوهای پیشرفته اتوماسیون مرورگر

Playwright فقط برای کارهای ساده نیست. قابلیت‌های پیشرفته‌ای داره که بهت اجازه میده سناریوهای پیچیده رو هم هندل کنی و اتوماسیون‌های قدرتمندی بسازی.

احراز هویت (Authentication)

نیاز به ورود به سایت‌ها داری؟ Playwright می‌تونه کوکی‌ها و Local Storage رو ذخیره و بارگذاری کنه تا مجبور نباشی هر بار از اول لاگین کنی. این کار اتوماسیون رو سریع‌تر و کارآمدتر می‌کنه.


import asyncio
from playwright.async_api import sync_playwright

async def auth_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch()
        
        # 1. انجام لاگین و ذخیره وضعیت احراز هویت
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.example.com/login") # صفحه لاگین واقعی
        await page.get_by_label("نام کاربری").fill("testuser")
        await page.get_by_label("رمز عبور").fill("testpass")
        await page.get_by_role("button", name="ورود").click()
        await page.wait_for_url("https://www.example.com/dashboard")
        
        await context.storage_state(path="state.json") # وضعیت رو ذخیره کن
        print("وضعیت احراز هویت ذخیره شد.")
        await browser.close()

        # 2. باز کردن مرورگر جدید با وضعیت ذخیره شده
        browser = await p.chromium.launch()
        context = await browser.new_context(storage_state="state.json")
        page = await context.new_page()
        await page.goto("https://www.example.com/dashboard") # مستقیماً به صفحه نیازمند احراز هویت برو
        print(f"عنوان صفحه بعد از ورود با وضعیت ذخیره شده: {await page.title()}")
        await browser.close()

if __name__ == '__main__':
    asyncio.run(auth_example())

هندل کردن دیالوگ‌ها (Alerts, Confirms, Prompts)

بعضی وقت‌ها وب‌سایت‌ها از دیالوگ‌های جاوااسکریپت استفاده می‌کنن. Playwright بهت اجازه میده این دیالوگ‌ها رو مدیریت کنی.


import asyncio
from playwright.async_api import sync_playwright

async def dialog_example():
    async with sync_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        page.on("dialog", lambda dialog: asyncio.create_task(dialog.accept())) # همه دیالوگ‌ها رو تأیید کن

        await page.goto("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert")
        # کلیک روی دکمه‌ای که Alert رو نمایش میده
        await page.frame_locator("#iframeResult").get_by_role("button", name="Try it").click()
        print("Alert هندل شد (تأیید شد).")
        
        await asyncio.sleep(2) # برای مشاهده نتیجه
        await browser.close()

if __name__ == '__main__':
    asyncio.run(dialog_example())

شما می‌تونی با `dialog.accept()` تأیید کنی یا با `dialog.dismiss()` رد کنی. برای `prompt` می‌تونی متنی رو هم با `dialog.accept(“my text”)` ارسال کنی.

Headless vs. Headed Browsers

قبلاً اشاره کردم، مرورگر می‌تونه Headless (بدون رابط کاربری) یا Headed (با رابط کاربری) باشه.

  • Headless: پیش‌فرض Playwright. سریع‌تر و مناسب سرورها و محیط‌های CI/CD.
  • Headed: با `headless=False` فعال میشه. برای عیب‌یابی و دیدن مراحل اتوماسیون عالیه.

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

جدول مقایسه: Playwright در برابر دیگران

حالا که با Playwright آشنا شدی، ممکنه بپرسی چه فرقی با ابزارهای دیگه مثل Selenium داره؟ این جدول یه مقایسه سریع بهت میده:

ویژگی Playwright
پشتیبانی از مرورگرها Chromium, Firefox, WebKit (همه مرورگرهای مدرن)
مدیریت ناهمزمانی طبیعتاً بر پایه `async/await` در پایتون، سریع و کارآمد
پایداری (Stability) بالا، با Waitهای خودکار و Locatorهای هوشمند
توسعه و نگهداری مایکروسافت، جامعه فعال و به‌روزرسانی‌های مداوم
قابلیت‌های پیشرفته Network Interception, Emulation, Parallel Execution (با Playwright Test)

با توجه به این ویژگی‌ها، Playwright به خصوص برای پروژه‌های جدید و مدرن، گزینه‌ی بسیار جذاب و قدرتمندی به حساب میاد.

نکات و ترفندهای حرفه‌ای

تا اینجا مبانی Playwright رو یاد گرفتی. حالا وقتشه چند تا ترفند و بهترین روش (Best Practices) رو با هم مرور کنیم تا کدهات حرفه‌ای‌تر و مقاوم‌تر بشن.

  • همیشه از Locatorها استفاده کن: به جای استفاده مستقیم از `page.click(“css=button.submit”)`، همیشه از `page.get_by_role(“button”, name=”Submit”)` یا سایر Locatorها استفاده کن. این کار باعث میشه کدهات در برابر تغییرات UI سایت مقاوم‌تر بشن.
  • از Contextها برای سناریوهای مستقل استفاده کن: اگه نیاز داری چند تا کاربر رو شبیه‌سازی کنی یا وضعیت مرورگر رو بین تست‌ها جدا نگه داری، از `browser.new_context()` استفاده کن.
  • اشکال‌زدایی (Debugging) با Headed Mode و `page.pause()`: وقتی کدهات خوب کار نمی‌کنن، `headless=False` رو به `launch()` اضافه کن تا مرورگر رو ببینی. همچنین می‌تونی `await page.pause()` رو توی کد بزاری تا اجرای برنامه متوقف بشه و بتونی توی مرورگر تعامل کنی و مشکل رو پیدا کنی.
  • استفاده از Trace Viewer: Playwright ابزار Trace Viewer رو داره که بهت اجازه میده بعد از اجرای کد، تمام اتفاقات (کلیک‌ها، ناوبری‌ها، درخواست‌های شبکه) رو به صورت گرافیکی ببینی. این ابزار برای دیباگ کردن سناریوهای پیچیده بی‌نظیره. کافیه `PWDEBUG=1 python your_script.py` رو اجرا کنی و بعد از اتمام `playwright show-trace trace.zip` رو بزنی.
  • تنظیم Viewport Size: همیشه اندازه Viewport رو برای مرورگر مشخص کن (`await page.set_viewport_size({“width”: 1920, “height”: 1080})`). این کار باعث میشه کدهای اتوماسیون شما در محیط‌های مختلف (لوکال، CI/CD) نتایج یکسانی داشته باشن و مشکلاتی که به خاطر ریسپانسیو بودن سایت به وجود میاد، کمتر بشن. این مورد برای رسپانسیو بودن برای موبایل، تبلت، لپ‌تاپ و حتی تلویزیون بسیار حیاتیه.
  • مدیریت Timeoutها: Playwright تایم‌اوت‌های پیش‌فرض داره، اما گاهی اوقات باید اونا رو برای عملیات‌های خاصی افزایش بدی. مثلاً `await page.goto(“slow-site.com”, timeout=60000)`

برای اسنیپت‌های مربوط به وردپرس یا سایر ابزارهای توسعه، به اسنیپت‌های وردپرس و همه اسنیپت‌ها سر بزن.

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

هیچ کدنویسی‌ای بدون مشکل نیست! اینجا به چند تا از مشکلات رایجی که ممکنه با Playwright باهاش روبرو بشی اشاره می‌کنم و راه‌حل‌هاشون رو میگم:

1. مرورگر اجرا نمیشه یا خطای “Browser not found” دریافت می‌کنم.

  • علت: مرورگرها به درستی نصب نشدن.
  • راه‌حل: مطمئن شو که دستور `python -m playwright install` رو اجرا کردی. اگه پشت پروکسی هستی، ممکنه نیاز به تنظیمات پروکسی برای pip یا خود Playwright داشته باشی.

2. عنصر مورد نظر پیدا نمیشه یا خطای “Element not found” دارم.

  • علت: انتخابگر (Locator) اشتباهه یا عنصر هنوز در صفحه لود نشده.
  • راه‌حل:
    • با `headless=False` مرورگر رو باز کن و دستی بررسی کن که انتخابگرت درسته.
    • از Locatorهای مقاوم‌تر Playwright (مثل `get_by_text`, `get_by_role`) استفاده کن.
    • از `await expect(locator).to_be_visible()` یا `await page.wait_for_selector()` برای انتظارهای صریح استفاده کن.
    • ممکنه عنصر داخل یک `iframe` باشه. در این صورت باید از `page.frame_locator(“iframe_selector”)` استفاده کنی.

3. تایم‌اوت می‌گیرم (TimeoutError).

  • علت: عملیات طولانی‌تر از حد انتظار طول کشیده (مثلاً لود شدن صفحه یا پیدا شدن یک عنصر).
  • راه‌حل:
    • تایم‌اوت رو برای اون عملیات خاص افزایش بده: `await page.goto(“url”, timeout=60000)` یا `await locator.click(timeout=30000)`.
    • مطمئن شو که از انتظارهای صریح (Explicit Waits) در جای مناسب استفاده می‌کنی.

4. مشکلات مربوط به Encoding یا نمایش کاراکترها (مثل فارسی).

  • علت: معمولاً مربوط به سیستم عامل یا محیط اجرایی پایتون.
  • راه‌حل:
    • مطمئن شو که فایل پایتون‌ت با UTF-8 ذخیره شده (`# -*- coding: utf-8 -*-` در ابتدای فایل).
    • در ترمینال، از محیطی استفاده کن که UTF-8 رو پشتیبانی می‌کنه (مثلاً Git Bash در ویندوز).

5. عملکرد (Performance) پایینه.

  • علت: استفاده از Headed Mode، لود کردن منابع غیرضروری، یا انتظارهای طولانی.
  • راه‌حل:
    • تا جایی که میشه از `headless=True` استفاده کن.
    • از `context.route()` برای بلاک کردن درخواست‌های غیرضروری (مثل عکس‌ها یا CSS/JS سنگین) استفاده کن تا صفحات سریع‌تر لود بشن.
    • از `await page.wait_for_load_state(‘domcontentloaded’)` به جای `load` برای سریع‌تر لود شدن صفحه استفاده کن (اگر فقط نیاز به عناصر اولیه داری).

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

Playwright چه مرورگرهایی را پشتیبانی می‌کند؟

Playwright از Chromium (برای Chrome و Edge), Firefox و WebKit (برای Safari) پشتیبانی می‌کند. یعنی با یک API می‌تونی روی هر سه مرورگر اصلی وب تست یا اتوماسیون انجام بدی.

آیا Playwright برای وب اسکرپینگ (Web Scraping) مناسب است؟

بله، Playwright یک ابزار عالی برای وب اسکرپینگ است، به خصوص برای سایت‌هایی که از جاوااسکریپت زیاد استفاده می‌کنند و محتوا را به صورت پویا بارگذاری می‌کنند. قابلیت‌هایی مثل مدیریت Context، Network Interception و انتظارهای هوشمند، آن را برای اسکرپینگ پیچیده بسیار قدرتمند می‌کند. ولی باید توجه داشت که این کار می‌تواند بار زیادی روی سرور سایت هدف وارد کند و باید با احتیاط انجام شود.

تفاوت Playwright با Selenium چیست؟

تفاوت‌های اصلی شامل معماری (Playwright از پروتکل اختصاصی برای ارتباط مستقیم با مرورگر استفاده می‌کند که سریع‌تر و پایدارتر است، در حالی که Selenium از WebDriver استفاده می‌کند)، قابلیت‌های داخلی (Playwright دارای Network Interception، مدیریت Context و Emulation به صورت داخلی است)، و پشتیبانی از `async/await` در پایتون برای کارایی بهتر است. همچنین، Playwright برای Headless بودن بهتر بهینه شده و به طور کلی تجربه توسعه‌دهنده بهتری را ارائه می‌دهد.

آیا Playwright می‌تواند در محیط‌های CI/CD (مثل Jenkins یا GitHub Actions) استفاده شود؟

قطعاً! Playwright به گونه‌ای طراحی شده که به راحتی در محیط‌های CI/CD قابل استفاده باشد. از آنجایی که به صورت پیش‌فرض Headless است و مرورگرهای مورد نیاز را می‌توان به سادگی نصب کرد، ادغام آن با خطوط لوله CI/CD بسیار آسان است و نتایج قابل اعتمادی ارائه می‌دهد.

سخن پایانی

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

یادت باشه که اتوماسیون یه مهارت عملیه؛ پس حتماً کدهایی که دیدیم رو خودت هم امتحان کن و پروژه‌های کوچیک برای خودت تعریف کن. هرچه بیشتر باهاش ور بری، بیشتر قلقش دستت میاد. دنیای وب همیشه در حال تغیر و پیشرفته و Playwright هم ابزاریه که پا به پای این تغییرات پیش میره و همیشه به‌روزه.

امیدوارم این مقاله برات مفید بوده باشه و بتونی از Playwright نهایت استفاده رو ببری. اگه سوالی داشتی یا نیاز به راهنمایی بیشتری داشتی، خوشحال میشم کمک کنم. برای ابزارها و کدهای بیشتر، یه بار دیگه به سایت fa-tools.ir سر بزن. موفق باشی!

Table of Contents

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