Tìm kiếm trang web

typescript - Vấn đề đồng bộ Playwright với ứng dụng Angular


Tôi đang cố gắng tự động hóa một kịch bản trong đó dịch vụ truy vấn cơ sở dữ liệu và hiển thị dữ liệu lên giao diện người dùng. Quá trình hiển thị này mất khá nhiều thời gian (khoảng 3 phút). Playwright không chờ cho đến khi trang tải xong. Tôi đã thử sử dụng

await page.waitForLoadState();,
await page.waitForLoadState('networkidle');
await page.waitForLoadState('domcontentloaded'); and 
await page.setDefaultNavigationTimeout(150);

Tôi đang làm việc trên một ứng dụng Angular, tôi có rất nhiều kịch bản nơi tôi gặp phải những loại vấn đề đồng bộ này.

Câu trả lời #1

Triển khai hàm chờ tùy chỉnh

đến khi lưới/bảng/hoặc đối tượng khác được tải đầy đủ:

Cách dễ nhất có lẽ là sử dụng page.waitForFunction để đợi cho đến khi lưới/bảng được điền đủ hàng.

Ví dụ, bạn có thể chờ cho đến khi 1000 hàng được tải trong bảng với đoạn mã sau:

await page.waitForFunction(() => document.querySelectorAll('#table-selector tr').length >= 1000);

Đợi phản hồi

WaitForResponse đã hoạt động với tôi để chờ phản hồi từ dịch vụ lâu với thời gian chờ tùy chỉnh:

Thông thường, bạn phải bắt đầu chờ phản hồi trước khi hành động gây ra cuộc gọi xảy ra.

// Alternative way with a predicate.
const [response] = await Promise.all([
  // Waits for the next response matching some conditions
  page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200 , { timeout: 300000 }),
  // Triggers the response
  page.click('button.triggers-response'),
]);

Xác minh nội dung phản hồi

Các trường hợp mà việc xác minh trạng thái phản hồi không đủ và cần phải xác minh cả nội dung phản hồi.

    const promise= page.waitForResponse(/abcd/); // Regex 
    await page.goto('https://myurl.com', {waitUntil: 'networkidle', timeout: 30000}); 
    var response = await promise; // waiting for promise
    let resp = await response.json(); 
    console.log(resp); 
    await browser.close(); 

Nguồn: https://playwright.dev/docs/api/class-page#page-wait-for-response