

در این مقاله جامع یاد میگیرید چطور با استفاده از Playwright فرمهای وب را اتوماتیک کنید — هم برای اهداف وب اسکریپینگ و هم برای تست مرورگر. هدف این راهنما ارائهٔ تکنیکهای عملی، نمونهکدهای پایتون و نکات رفع اشکال است تا در پایان بتوانید فرمهای ساده تا پیچیده را با اطمینان پر و ارسال کنید.
پس از خواندن این مطلب قادر خواهید بود: عناصر فرم را شناسایی کنید، مقادیر را بهصورت ایمن وارد کنید، رفتارهای اعتبارسنجی و پاسخ سرور را بررسی کنید و با چالشهایی مثل فایلآپلود، فیلدهای rich-text، دیالوگها و کپچاها روبرو شوید.
فرمها (<form>) شامل کنترلهایی مثل <input>، <select> و <button> هستند. دو ویژگی کلیدی فرم عبارتاند از action (آدرس ارسال) و method (GET/POST).
نکتهٔ مهم برای اسکریپ کردن: نام فیلد (name) و نوع ورودی (type) تعیین میکنند که سرور چه بدلی را دریافت خواهد کرد؛ بنابراین همیشه این attributes را در حین بازرسی صفحه یادداشت کنید.
از DevTools برای پیدا کردن شناسههای مناسب استفاده کنید: id، name، labelها یا attributes قابل اعتماد مثل data-test. اولویتبندی توصیهشده:
متدهای پایهای که مرتب استفاده میشوند:
مثال پایهٔ ورود به سیستم با 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)
# سپس عملکردی که دیالوگ را ایجاد میکند اجرا شودکپچاها طراحیشدهاند تا اتوماسیون را دشوار کنند. اگر از سرویسهای حلکننده استفاده میکنید، حتماً قوانین سرویس و رعایت قوانین سایت را بررسی کنید. نمونهٔ سادهٔ استفاده از 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')هشدار: استفاده از سرویسهای حل کپچا مسائل قانونی و اخلاقی دارد؛ پیش از استفاده شرایط سایت و قوانین را بررسی کنید.
برخی مسائل مرسوم و راهحلها:
مثال زیر ترکیبی از مفاهیم است: انتخابگر برچسب، چکباکس، دراپداون و انتظار برای ناوبری.
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. همیشه اخلاق و قوانین سایتها را بررسی کنید و از بهترین شیوهها برای پایداری و امنیت کد استفاده نمایید.


