خانه/مقالات/اسکریپ فرم‌ها با Playwright برای توسعه‌دهنده‌های پایتون
اسکریپ فرم‌ها با Playwright برای توسعه‌دهنده‌های پایتون

اسکریپ فرم‌ها با Playwright برای توسعه‌دهنده‌های پایتون

این راهنمای عملی به توسعه‌دهنده‌های پایتون نشان می‌دهد چگونه با Playwright فرم‌های وب را برای اسکریپینگ و تست اتوماتیک کنند؛ شامل انتخابگرها، نمونه‌کدهای پایتون برای انواع ورودی‌ها، مدیریت پاسخ‌ها، روش‌های حل کپچا و نکات رفع اشکال و بهترین‌شیوه‌ها است.
امیر حسین حسینیان
امیر حسین حسینیان
1404-11-18

مقدمه

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

پس از خواندن این مطلب قادر خواهید بود: عناصر فرم را شناسایی کنید، مقادیر را به‌صورت ایمن وارد کنید، رفتارهای اعتبارسنجی و پاسخ‌ سرور را بررسی کنید و با چالش‌هایی مثل فایل‌آپلود، فیلدهای rich-text، دیالوگ‌ها و کپچاها روبرو شوید.

درک ساختار فرم‌های HTML

فرم‌ها (<form>) شامل کنترل‌هایی مثل <input>، <select> و <button> هستند. دو ویژگی کلیدی فرم عبارت‌اند از action (آدرس ارسال) و method (GET/POST).

نکتهٔ مهم برای اسکریپ کردن: نام فیلد (name) و نوع ورودی (type) تعیین می‌کنند که سرور چه بدلی را دریافت خواهد کرد؛ بنابراین همیشه این attributes را در حین بازرسی صفحه یادداشت کنید.

بازرسی فرم‌ها و انتخابگرها

از DevTools برای پیدا کردن شناسه‌های مناسب استفاده کنید: id، name، label‌ها یا attributes قابل اعتماد مثل data-test. اولویت‌بندی توصیه‌شده:

  • استفاده از labelها با Playwright (مثلاً page.get_by_label) — خواناتر و مقاوم‌تر در برابر تغییرات UI
  • اگر id/name یکتا وجود دارد از CSS selector یا locator استفاده کنید
  • برای عناصر دینامیک از صبر صریح (explicit wait) به‌جای sleep ناامن استفاده کنید

متدهای اصلی Playwright در پایتون

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

  • locator.fill() — مقداردهی فیلدهای متنی
  • locator.click() — کلیک روی دکمه‌ها و کنترل‌ها
  • locator.set_checked() — انتخاب/لغو تیک چک‌باکس‌ها
  • locator.select_option() — انتخاب مقدار در دراپ‌داون
  • page.set_input_files() — آپلود فایل

مثال پایهٔ ورود به سیستم با API همزمان Playwright:

from playwright.sync_api import sync_playwright

with sync_playwright() as pw:
    browser = pw.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('https://example.com/login')

    # پر کردن فیلدها با استفاده از برچسب
    page.get_by_label('User Name').fill('john')
    page.get_by_label('Password').fill('s3cr3t')

    # کلیک روی دکمه ورود
    page.get_by_role('button', name='Sign in').click()

    # منتظر ماندن برای ناوبری/پاسخ
    page.wait_for_load_state('networkidle')
    browser.close()

ورودی‌ها: آدرس صفحه و مقادیری که قرار است در فیلدها قرار گیرند. خروجی: صفحه بعد از ارسال که می‌توانید محتوا یا وضعیت را بررسی کنید.

اعتبارسنجی قبل از ارسال

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

# مثال سادهٔ اعتبارسنجی محلی
email = page.locator('#email').input_value()
first = page.locator('#firstName').input_value()
if not first or '@' not in email:
    print('Form validation failed')
else:
    page.locator('#submitButton').click()

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

بررسی پاسخ‌ها و تحلیل نتایج

پس از ارسال فرم معمولاً می‌خواهید بدانید آیا ارسال موفق بوده یا خطا رخ داده:

# روش اول: انتظار برای ناوبری و بررسی المان موفقیت
page.locator('#submitButton').click()
page.wait_for_load_state('networkidle')
if page.locator('.success-message').count() > 0:
    print('Form submitted successfully')
    result = page.text_content('.result')
    print('Result:', result)

# روش دوم: انتظار برای پاسخ شبکه مشخص
response = page.wait_for_response(lambda r: '/submit' in r.url and r.status == 200)
print('Response status:', response.status)

هر روش مزایا دارد: انتظار برای ناوبری برای فرم‌هایی که صفحه را ریدایرکت می‌کنند مناسب است و wait_for_response برای API‌های AJAX کاربردی‌تر است.

کار با انواع عناصر فرم

در ادامه چند الگوی متداول و مثال پایتون آورده شده است.

متن و textarea

page.get_by_label('Comment').fill('This is my message')  # فیلد تک‌خطی یا textarea

چک‌باکس

page.get_by_label('I agree to the terms').set_checked(True)  # یا False برای برداشتن تیک

رادیو

page.check('#paymentMethodCreditCard')  # انتخاب رادیو با CSS selector

دراپ‌داون

# انتخاب بر اساس value
page.select_option('#country', 'GB')
# انتخاب بر اساس label
page.locator('#dropdown').select_option(label='Option Label')
# انتخاب بر اساس index
page.locator('#dropdown').select_option(index=2)

فیلد تاریخ

page.fill('#startDate', '2022-12-31')  # فرمت yyyy-mm-dd برای input[type=date]

آپلود فایل

page.set_input_files('#file', './image.png')  # یا یک لیست برای چند فایل

فیلدهای rich-text یا contenteditable

# روش مستقیم: تغییر innerHTML
page.evaluate("document.querySelector('div.editable').innerHTML = '

متن غنی

'") # یا با کیبورد برای شبیه‌سازی تایپ page.click('div.editable') page.keyboard.type('متن شبیه‌سازی شده') # اگر داخل iframe است، ابتدا فریم را بگیرید frame = page.frame(name='editor-frame') frame.evaluate("document.querySelector('.editable').innerHTML = '

...

'")

دیالوگ‌ها و پنجره‌های هشدار

برای پاسخ خودکار به دیالوگ‌ها از listener استفاده کنید:

def on_dialog(dialog):
    print('Dialog message:', dialog.message)
    dialog.accept()

page.on('dialog', on_dialog)
# سپس عملکردی که دیالوگ را ایجاد می‌کند اجرا شود

پرداختن به CAPTCHA

کپچاها طراحی‌شده‌اند تا اتوماسیون را دشوار کنند. اگر از سرویس‌های حل‌کننده استفاده می‌کنید، حتماً قوانین سرویس و رعایت قوانین سایت را بررسی کنید. نمونهٔ سادهٔ استفاده از 2captcha با requests:

import requests
import time

API_KEY = 'YOUR_2CAPTCHA_API_KEY'
sitekey = page.eval_on_selector('.g-recaptcha', 'el => el.dataset.sitekey')
page_url = page.url

# ارسال درخواست اولیه
res = requests.get('http://2captcha.com/in.php', params={
    'key': API_KEY,
    'method': 'userrecaptcha',
    'googlekey': sitekey,
    'pageurl': page_url,
})
captcha_id = res.text.split('|')[1]

# پرس و جو تا زمان حل شدن
captcha_text = None
while not captcha_text:
    time.sleep(5)
    r = requests.get('http://2captcha.com/res.php', params={'key': API_KEY, 'action': 'get', 'id': captcha_id})
    if r.text.startswith('OK|'):
        captcha_text = r.text.split('|')[1]

# قراردادن پاسخ در textarea مربوطه
page.evaluate("(token) => document.getElementById('g-recaptcha-response').value = token", captcha_text)
page.click('#submitButton')

هشدار: استفاده از سرویس‌های حل کپچا مسائل قانونی و اخلاقی دارد؛ پیش از استفاده شرایط سایت و قوانین را بررسی کنید.

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

  • امتحان کردن چند انتخابگر: اگر یک selector ضعیف است، از label، name یا data-attributes استفاده کنید.
  • همگام‌سازی صحیح: از wait_for_selector، wait_for_response و انتظار برای وضعیت‌های لود مانند networkidle استفاده کنید.
  • اجتناب از تشخیص ربات: کارهایی مثل تنظیم user-agent، پراکسی، تاخیرهای تصادفی بین اقدامات و استفاده از context/cookie مدیریت‌شده کمک می‌کند؛ اما از روش‌های فریب‌دهنده غیرقانونی پرهیز کنید.
  • ثبت خطا و retry: برای افزایش پایداری از الگوی retry با backoff و ثبت لاگ استفاده کنید.
  • امنیت: رمزها و کلیدها را در متغیرهای محیطی نگه دارید، نه داخل کد.

رفع اشکال متداول

برخی مسائل مرسوم و راه‌حل‌ها:

  • عنصر پیدا نمی‌شود: از page.wait_for_selector('#id') یا افزایش timeout استفاده کنید.
  • عنصر قابل تعامل نیست: ممکن است overlay یا انیمیشن مانع شود؛ منتظر visible بودن بمانید.
  • کلیک یا تایپ اثر نداشت: بررسی کنید انتخابگر درست است؛ در صورت نیاز از evaluate برای کلیک مستقیم استفاده کنید.
  • فرم ارسال نمی‌شود: ممکن است اعتبارسنجی جاوااسکریپتی وجود داشته باشد؛ یا باید فیلدهای مخفی (honeypot) را مدیریت کنید یا فرم را با document.forms[0].submit() ارسال کنید.
  • مشکلات iframe: ابتدا به فریم سوئیچ کنید (page.frame(...)) و سپس تعامل کنید.

مثال عملی: فرم ثبت‌نام کامل (پایتون)

مثال زیر ترکیبی از مفاهیم است: انتخابگر برچسب، چک‌باکس، دراپ‌داون و انتظار برای ناوبری.

from playwright.sync_api import sync_playwright

with sync_playwright() as pw:
    browser = pw.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto('https://example.com/signup')

    # پر کردن فیلدها
    page.get_by_label('First Name').fill('John')
    page.get_by_label('Last Name').fill('Doe')
    page.get_by_label('Email').fill('john.doe@example.com')

    # انتخاب کشور از دراپ‌داون
    page.select_option('#country', 'US')

    # تیک قوانین
    page.get_by_label('I agree to the terms').set_checked(True)

    # ارسال فرم و انتظار برای ناوبری یا پیام موفقیت
    with page.expect_navigation():
        page.get_by_role('button', name='Create account').click()

    if page.locator('.welcome').count() > 0:
        print('Signup successful')
    else:
        print('Signup may have failed. Check error messages.')

    page.screenshot(path='signup_result.png')
    browser.close()

خط‌به‌خط: ایجاد مرورگر و صفحه → ورود به آدرس → پر کردن فیلدها با get_by_label → انتخاب گزینه‌ها → کلیک روی دکمه و انتظار برای ناوبری → بررسی وجود المان موفقیت → ذخیره اسکرین‌شات.

جمع‌بندی

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

مقاله‌های مرتبط
اسکرپینگ با Selenium و Playwright
1404-11-20
اسکریپ با Playwright: گرفتن اسکرین‌شات
این راهنمای عملی نشان می‌دهد چگونه با Playwright انواع اسکرین‌شات (صفحه کامل، ناحیه‌ای، المنتی، سفارشی با کیفیت) بگیریم، خروجی را به بافر منتقل کنیم، PDF بسازیم و خطاهای رایج را رفع کنیم. مثال‌های کد محور، نکات بهینه‌سازی و الگوهای retry/pattern برای پروژه‌های وب اسکریپینگ ارائه شده‌اند.
اسکرپینگ با Selenium و Playwright
1404-11-17
مدیریت کوکی‌ها با Playwright
این مقاله یک راهنمای عملی برای مدیریت کوکی‌ها با Playwright در وب اسکریپینگ ارائه می‌دهد: گرفتن، فیلتر، ذخیره/بارگذاری، حذف و نکات تولیدی. مثال‌های پایتون، بهترین شیوه‌ها و روش‌های عیب‌یابی به شما کمک می‌کنند کوکی‌ها را امن و پایدار در خودکارسازی‌ها مدیریت کنید.
اسکرپینگ با Selenium و Playwright
1404-11-10
وب اسکرپینگ با Playwright بدون‌ شناسایی شدن
این راهنمای فارسی و عملی به توسعه‌دهنده‌های پایتون میانی نشان می‌دهد چگونه با ترکیب تنظیمات مرورگر، پراکسی‌های مسکونی، تقلید رفتار انسانی و مدیریت خطا یک اسکریپ Playwright بسازند که کمتر شناسایی شود؛ شامل مثال‌های کد پایتون برای لانچ مرورگر، تعامل انسانی، پراکسی و حل CAPTCHA است.