Playwright P2: Viết test đầu tiên, action và assertion cơ bản. Locator cơ bản

⏱︎

Read time:

3–4 minutes
Playwright P2: Viết test đầu tiên, action và assertion cơ bản

Giống test case manual, việc viết 1 test case trong playwright cũng tuân thủ y hệt những quy tắc, sao cho dễ đọc, dễ hiểu, các step đầy đủ,

Các thành phần trong 1 test case

Thành phầnBắt buộc?Hàm Playwright
test.describe('Đăng ký khóa học'Khôngđể bạn điền tên của test suite
tag: ['@smoke', '@registration']Khônggán nhãn cho test case. Để tiện cho việc phân loại
annotation: [
{ type: 'feature', description: 'Course registration' }]
Khôngthêm các thông tin bổ sung cho test case nếu cần
test('học viên gửi form hợp lệ'CóTên của test case
await page.goto('/register');

await page.getByLabel('Họ tên').fill('Nguyễn An');
CóCác test step, tương tác với màn hình
await expect(page.getByRole('alert')).toHaveText('Đăng ký thành công');CóAssertion step, tương đương với expected behavior mà test case của bạn mong muốn
import { test, expect } from '@playwright/test';

test.describe('Đăng ký khóa học', {
  tag: ['@smoke', '@registration'],
  annotation: [
    { type: 'feature', description: 'Course registration' },
    { type: 'requirement', description: 'REG-001' },
  ],
}, () => {
  test('học viên gửi form hợp lệ', {
    tag: '@positive',
    annotation: {
      type: 'description',
      description: 'Kiểm tra đầy đủ textbox, dropdown, checkbox và radio',
    },
  }, async ({ page }) => {
    await page.goto('/register');
    await page.getByLabel('Họ tên').fill('Nguyễn An');
    await page.getByLabel('Khóa học').selectOption('playwright');
    await page.getByLabel('Học buổi tối').check();
    await page.getByRole('radio', { name: 'Online' }).check();
    await page.getByRole('button', { name: 'Đăng ký' }).click();

    await expect(page.getByRole('alert')).toHaveText('Đăng ký thành công');
  });
});
Lưu ý
1 file ts có thể chứa nhiều hơn 1 block describle, tức là 1 file ts có thể chứa nhiều hơn 1 test suite

Các action chính hay gặp

Thành phầnHành độngHàm Playwright
TextboxNhập text vào textboxfill()
Buttonclick vào nútclick()
Dropdown HTMLchọn optionselectOption()
Checkboxtick vào checkboxcheck()/uncheck()
Radiotick vào radioboxcheck()

Các assertion thường dùng

// kiểm tra URL hiện tại:
await expect(page).toHaveURL(/dashboard/);

// kiểm tra title trang web:
await expect(page).toHaveTitle(/Dashboard/);

// kiểm tra có dòng chữ Xin chào trên hiện màn hình
await expect(page.getByText('Xin chào')).toBeVisible();

// kiểm tra trường Email đang có giá trị mong muốn:
await expect(page.getByLabel('Email')).toHaveValue('an@example.com');

// kiểm tra 1 button đang được enable:
await expect(page.getByRole('button')).toBeEnabled();

// kiểm tra checkbox Đồng ý đang được tick:
await expect(page.getByLabel('Đồng ý')).toBeChecked();

Các locator thường dùng

Như ở các bài trước, chúng ta đã tìm hiểu về xpath. Chúng ta hoàn toàn có thể truyền xpath vào để bắt được locator của đối tượng cần tương tác. Ngoài ra, playwright còn cung cấp các kiểu khác dễ đọc dễ viết hơn xpath, ví dụ như các hàm getByName, getByRole, getByText…

Sử dụng getBy…()

Lưu ý
Sử dụng hàm page.getByXXX() để lấy element bạn mong muốn
await page.getByRole('button', { name: 'Đăng nhập' }).click();
await page.getByLabel('Email').fill('an@example.com');
await page.getByPlaceholder('Nhập từ khóa').fill('Playwright');
await page.getByText('Khóa học cơ bản').click();
await page.getByAltText('Logo Elitest').click();
await page.getByTitle('Đóng').click();
await page.getByTestId('submit-order').click();

Sử dụng xpath

Lưu ý
Sử dụng hàm page.locator() để lấy element bạn mong muốn
// tìm đến button có id = submit
await page.locator('xpath=//button[@id="submit"]').click(); 

Sử dụng CSS

Cú pháp sẽ khác với Xpath đôi chút:

// tìm đến element có id = email
await page.locator('#email').fill('an@example.com');       

// tìm đến element có class = product-card
await page.locator('css=.product-card').click();     

Khi có nhiều element trùng locator nhau

Đôi khi page.getByText('Khóa học cơ bản') trả về đế 2 element khác nhau, việc này rất hay gặp nếu trên màn hình có 2 chỗ có text giống nhau. Thì chúng ta có thể sử lý nhanh để lấy đúng đối tượng ta cần

// Giả sử: page.getByText('Khóa học cơ bản') trả về đến 3 element 

// lấy thằng đầu tiên rồi click
await page.getByText('Khóa học cơ bản').first().click()

// lấy thằng cuối cùng rồi click
await page.getByText('Khóa học cơ bản').last().click()

// lấy thằng thứ 2 theo index của nó (index chạy từ 0), nên trường hợp này sẽ là 1:
await page.getByText('Khóa học cơ bản').nth(1).click()