Playwright предоставляет богатый набор инструментов для
взаимодействия с веб-страницами, включая возможности для работы с
объектами в браузере. Один из ключевых методов для манипуляции объектами
на страницах — это evaluateHandle. Этот метод используется
для выполнения кода в контексте страницы и возвращает дескриптор
объекта, который может быть полезен для дальнейшей работы.
evaluateHandle?Метод evaluateHandle позволяет выполнять JavaScript-код
в контексте страницы и возвращать не просто результат выполнения, а
объект в виде дескриптора (или «ручки») этого объекта, доступного для
дальнейших манипуляций. В отличие от метода evaluate,
который возвращает результат выполнения JavaScript в виде значения,
метод evaluateHandle возвращает дескриптор элемента, с
которым можно взаимодействовать далее.
Основное отличие между evaluate и
evaluateHandle заключается в том, что первый метод
возвращает результат непосредственно, а второй — возвращает объект в
виде дескриптора, который можно использовать для дальнейших
взаимодействий с элементом или его свойствами. Это полезно в тех
случаях, когда нужно работать с элементами или объектами, которые могут
быть сложными или требуют дополнительных манипуляций.
const handle = await page.evaluateHandle(pageFunction, ...args);
pageFunction: Функция, которая будет выполнена в
контексте страницы.args: Массив аргументов, которые будут переданы в
функцию.Метод возвращает дескриптор объекта (или элемента), который можно использовать в дальнейшем.
Предположим, что на странице есть объект с уникальным идентификатором, и требуется получить его дескриптор для последующей работы с его свойствами.
const handle = await page.evaluateHandle(() => document.getElementById('myObject'));
В этом примере мы получаем дескриптор элемента с id
myObject. Возвращенный handle можно
использовать для дальнейших действий с объектом.
Одной из основных задач, для которой используется
evaluateHandle, является манипуляция сложными объектами на
странице. Например, если на странице есть элемент, который представляет
собой сложный объект JavaScript, можно получить его дескриптор и
работать с его свойствами и методами.
Пример: предположим, что на странице есть объект, представляющий форму с несколькими полями. Мы можем получить этот объект и работать с его свойствами:
const handle = await page.evaluateHandle(() => {
return {
name: document.getElementById('name').value,
age: document.getElementById('age').value
};
});
В этом примере возвращается объект с данными из формы. Дескриптор этого объекта можно использовать для дальнейших операций с его свойствами.
Часто в автоматизированных тестах нужно работать с динамическими
элементами, которые загружаются или изменяются после того, как страница
была загружена. В таких случаях полезно использовать дескрипторы,
полученные через evaluateHandle, для выполнения асинхронных
операций с элементами или объектами.
Пример использования evaluateHandle с асинхронными
операциями:
const handle = await page.evaluateHandle(async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
});
Здесь возвращается дескриптор асинхронного результата, который позже можно использовать для извлечения данных или других операций.
evaluateHandle также полезен при работе с коллекциями
объектов, например, с массивами или списками элементов на странице. Если
необходимо манипулировать элементами, которые являются частью массива
или коллекции, дескрипторы позволяют эффективно работать с такими
структурами.
Пример получения коллекции элементов и работы с ними:
const handle = await page.evaluateHandle(() => {
const items = document.querySelectorAll('.item');
return Array.from(items).map(item => item.textContent);
});
В этом примере мы получаем дескриптор коллекции элементов с классом
.item. С помощью дескриптора можно работать с текстовым
содержимым каждого элемента в коллекции.
После того как дескриптор объекта больше не нужен, его следует
освобождать. Playwright предоставляет метод dispose для
очистки дескрипторов и освобождения ресурсов:
await handle.dispose();
Этот метод важно вызывать, чтобы избежать утечек памяти, особенно при большом количестве операций с элементами и объектами.
evaluateHandleМетод evaluateHandle полезен в следующих ситуациях:
Использование evaluateHandle дает несколько важных
преимуществ:
document.querySelector.dispose.Однако существуют и ограничения:
dispose,
чтобы избежать утечек памяти.Метод evaluateHandle представляет собой мощный
инструмент для работы с объектами и элементами на веб-странице в
контексте тестирования с Playwright.