0

[Playwright Interview question #26]: Sự khác biệt giữa page.evaluate và page.evaluateHandle?

Câu hỏi phỏng vấn #26: What is the difference between page.evaluate and page.evaluateHandle?

Trả lời mẫu:

1. page.evaluate() - Returns serializable values:

// Returns JavaScript primitive values
const innerText = await page.evaluate(() => {
  return document.querySelector('h1').innerText;
});
console.log(innerText); // "Welcome"

// Returns JSON-serializable objects
const data = await page.evaluate(() => {
  return {
    title: document.title,
    url: window.location.href
  };
});

2. page.evaluateHandle() - Returns JSHandle:

// Returns handle to in-page object
const elementHandle = await page.evaluateHandle(() => {
  return document.querySelector('#complex-element');
});

// Can perform actions on handle
await elementHandle.click();
await elementHandle.dispose(); // Clean up

3. Use Cases Comparison:

// ❌ Wrong - Cannot return DOM element with evaluate
const element = await page.evaluate(() => {
  return document.querySelector('button'); // Returns null/undefined
});

// ✅ Correct - Use evaluateHandle for DOM elements
const elementHandle = await page.evaluateHandle(() => {
  return document.querySelector('button');
});

4. Working with Complex Objects:

// evaluateHandle for non-serializable objects
const windowHandle = await page.evaluateHandle(() => window);

// Execute methods on handle
const url = await windowHandle.evaluate(window => window.location.href);

5. Performance Considerations:

// evaluate - data serialized and sent
const texts = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('p'))
    .map(p => p.innerText);
});

// evaluateHandle - keeps reference in browser
const nodesHandle = await page.evaluateHandle(() => {
  return document.querySelectorAll('p');
});

💡 Tips:

  • Use evaluate() cho simple data extraction
  • Use evaluateHandle() cho DOM manipulation
  • Remember to dispose() handles để free memory
  • evaluate() có overhead của serialization

Lời Kết

Playwright đang trở thành một trong những automation frameworks phổ biến nhất cho web testing. Thông qua series này, hy vọng bạn sẽ:

  • Nắm vững kiến thức từ cơ bản đến nâng cao
  • Tự tin trong các buổi phỏng vấn
  • Áp dụng hiệu quả vào dự án thực tế
  • Trở thành một phần của cộng đồng Playwright Việt Nam năng động

📚 Bắt đầu hành trình của bạn với: Bài 1: Playwright vs Selenium

💬 Có câu hỏi? Tham gia group Facebook của chúng mình!

Theo dõi series để không bỏ lỡ bài viết mới!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí