การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ
ทำให้การส่งฟอร์มหลายขั้นตอนและลำดับการนำทางเป็นอัตโนมัติด้วยออบเจ็กต์หน้าเว็บของ Playwright
การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
กลยุทธ์การทดสอบแบบฟอร์มตั้งแต่ต้นจนจบ
การทดสอบแบบฟอร์มตั้งแต่ต้นจนจบจำลองเส้นทางการใช้งานทั้งหมดของผู้ใช้ ได้แก่ เข้าสู่หน้า กรอกช่องข้อมูล ส่งแบบฟอร์ม จัดการข้อผิดพลาดจากการตรวจสอบความถูกต้อง และยืนยันผลลัพธ์เมื่อสำเร็จ
รูปแบบออบเจ็กต์หน้า
รูปแบบออบเจ็กต์หน้า (POM) รวมตัวเลือกและการโต้ตอบสำหรับหน้าไว้ในคลาส ทำให้การทดสอบอ่านเข้าใจง่ายและลดการทำซ้ำ
class LoginPage {
constructor(private page: Page) {}
async goto() { await this.page.goto('/login'); }
async fillEmail(email: string) { await this.page.getByLabel('Email').fill(email); }
async fillPassword(pw: string) { await this.page.getByLabel('Password').fill(pw); }
async submit() { await this.page.getByRole('button', { name: /log in/i }).click(); }
async getError() { return this.page.getByRole('alert').textContent(); }
}การใช้วัตถุหน้าในการทดสอบ
เมื่อใช้วัตถุหน้า การทดสอบจะกลายเป็นคำอธิบายการกระทำของผู้ใช้ในระดับเจตนา ซึ่งอ่านและดูแลรักษาได้ง่าย
test('successful login redirects to dashboard', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.fillEmail('alice@example.com');
await loginPage.fillPassword('password123');
await loginPage.submit();
await expect(page).toHaveURL('/dashboard');
await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});การทดสอบข้อผิดพลาดจากการตรวจสอบความถูกต้อง
ส่งข้อมูลที่ไม่ถูกต้องหรือว่างเปล่า แล้วตรวจสอบข้อความข้อผิดพลาดที่ส่วนติดต่อผู้ใช้แสดง
test('shows validation errors on empty submit', async ({ page }) => {
await page.goto('/register');
await page.getByRole('button', { name: 'Create account' }).click();
await expect(page.getByText('Email is required')).toBeVisible();
await expect(page.getByText('Password must be at least 8 characters')).toBeVisible();
});การทดสอบแบบฟอร์มหลายขั้นตอน
สำหรับตัวช่วยสร้างหลายขั้นตอน ให้ดำเนินการผ่านแต่ละขั้น พร้อมยืนยันว่าแบบฟอร์มเลื่อนไปข้างหน้าและยังคงข้อมูลที่ป้อนไว้ก่อนหน้า
test('completes 3-step signup', async ({ page }) => {
await page.goto('/signup');
// Step 1
await page.getByLabel('First Name').fill('Alice');
await page.getByRole('button', { name: 'Next' }).click();
// Step 2
await page.getByLabel('Plan').selectOption('pro');
await page.getByRole('button', { name: 'Next' }).click();
// Step 3
await page.getByLabel('Card Number').fill('4242424242424242');
await page.getByRole('button', { name: 'Complete' }).click();
await expect(page.getByText('Welcome, Alice!')).toBeVisible();
});การจำลอง API ใน Playwright
ใช้ page.route() เพื่อดักจับการเรียก API และส่งการตอบกลับจำลอง ซึ่งมีประโยชน์สำหรับการทดสอบกรณีขอบโดยไม่ต้องใช้แบ็กเอนด์จริง
await page.route('/api/register', async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ token: 'fake-token' }),
});
});
await page.goto('/register');
// ...fill and submit form
await expect(page).toHaveURL('/dashboard');การทดสอบการอัปโหลดไฟล์
ใช้ setInputFiles() เพื่อจำลองการอัปโหลดไฟล์ใน Playwright
test('uploads a profile photo', async ({ page }) => {
await page.goto('/profile');
const fileInput = page.getByLabel('Profile photo');
await fileInput.setInputFiles('./fixtures/avatar.png');
await page.getByRole('button', { name: 'Upload' }).click();
await expect(page.getByAltText('Profile photo')).toBeVisible();
});การนำสถานะการยืนยันตัวตนกลับมาใช้
เข้าสู่ระบบเพียงครั้งเดียว บันทึกสถานะพื้นที่จัดเก็บของเบราว์เซอร์ และนำกลับมาใช้ในการทดสอบหลายครั้งเพื่อข้ามขั้นตอนการเข้าสู่ระบบซ้ำ
// auth.setup.ts
test('authenticate', async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Email').fill('alice@example.com');
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Log in' }).click();
await page.context().storageState({ path: 'e2e/.auth/user.json' });
});
// playwright.config.ts — use storageState in other tests
use: { storageState: 'e2e/.auth/user.json' }การทดสอบการกู้คืนจากข้อผิดพลาด
จำลองความล้มเหลวของเครือข่าย และตรวจสอบว่าผู้ใช้สามารถลองใหม่หรือเห็นข้อความข้อผิดพลาดที่เป็นประโยชน์
await page.route('/api/submit', route => route.abort());
await page.getByRole('button', { name: 'Submit' }).click();
await expect(page.getByText('Network error. Please try again.')).toBeVisible();
await page.unroute('/api/submit');
// Now the real request goes through
await page.getByRole('button', { name: 'Retry' }).click();การทดสอบการนำทางด้วยแป้นพิมพ์
ทดสอบว่าแบบฟอร์มสามารถเข้าถึงได้ด้วยแป้นพิมพ์อย่างสมบูรณ์ โดยกด Tab ผ่านช่องข้อมูลต่าง ๆ และส่งแบบฟอร์มด้วย Enter
test('submits form with keyboard only', async ({ page }) => {
await page.goto('/contact');
await page.keyboard.press('Tab'); // focus name
await page.keyboard.type('Alice');
await page.keyboard.press('Tab'); // focus email
await page.keyboard.type('alice@example.com');
await page.keyboard.press('Tab'); // focus submit
await page.keyboard.press('Enter');
await expect(page.getByText('Message sent!')).toBeVisible();
});ชุดตั้งต้นสำหรับข้อมูลการทดสอบ
ใช้ชุดตั้งต้นของ Playwright เพื่อใช้ตรรกะการตั้งค่าร่วมกันอย่างเป็นระเบียบระหว่างการทดสอบหลายรายการ เช่น การสร้างผู้ใช้ทดสอบ
// fixtures.ts
const test = base.extend<{ testUser: User }>({
testUser: async ({}, use) => {
const user = await createTestUser();
await use(user);
await deleteTestUser(user.id);
},
});
// In a test file:
test('edits profile', async ({ page, testUser }) => {
await page.goto(`/users/${testUser.id}/edit`);
});การเรียกใช้การทดสอบแบบขนาน
Playwright เรียกใช้การทดสอบแบบขนานโดยค่าเริ่มต้นผ่านตัวทำงานหลายตัว ใช้ test.describe.serial เฉพาะกับการทดสอบที่ต้องเรียกใช้ตามลำดับ
ตรวจสอบอย่างรวดเร็ว
ประโยชน์หลักของรูปแบบออบเจ็กต์หน้า (POM) ในการทดสอบตั้งแต่ต้นจนจบคืออะไร
สรุปทบทวน
การทดสอบแบบฟอร์มตั้งแต่ต้นจนจบใช้วัตถุหน้าเพื่อให้ดูแลรักษาได้ง่าย ใช้ page.route() เพื่อจำลอง API ใช้ setInputFiles() สำหรับการอัปโหลด และใช้สถานะพื้นที่จัดเก็บเพื่อนำเซสชันการยืนยันตัวตนกลับมาใช้ ทดสอบการตรวจสอบความถูกต้อง ลำดับการทำงานหลายขั้นตอน และการนำทางด้วยแป้นพิมพ์เพื่อครอบคลุมเส้นทางการใช้งานจริงของผู้ใช้
คำถามที่พบบ่อย
บทเรียน “การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ”
ทำให้การส่งฟอร์มหลายขั้นตอนและลำดับการนำทางเป็นอัตโนมัติด้วยออบเจ็กต์หน้าเว็บของ Playwright คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทดสอบแบบผสานรวมด้วย React Testing Library
- การทดสอบ UI แบบอะซิงก์และการเรียก API ด้วย MSW
- เริ่มต้นใช้งาน Playwright สำหรับ React
- การทดสอบฟอร์มและขั้นตอนการใช้งานตั้งแต่ต้นจนจบ