Метод evaluate в Playwright представляет собой один из
наиболее мощных инструментов для взаимодействия с браузером в рамках
тестирования. Этот метод позволяет выполнять JavaScript код
непосредственно в контексте страницы, что делает его незаменимым для
множества сценариев, связанных с тестированием функциональности
веб-приложений. В отличие от других методов Playwright,
evaluate выполняет код на странице, как если бы он был
частью её JavaScript-окружения, позволяя работать с DOM и производить
манипуляции с данными, доступными на странице.
Метод evaluate используется для выполнения произвольного
JavaScript кода в контексте текущей страницы. В отличие от других
методов, таких как page.click() или
page.fill(), которые взаимодействуют с элементами на
странице, evaluate позволяет непосредственно работать с
браузером через JavaScript.
Пример базового использования метода:
const result = await page.evaluate(() => {
return document.title;
});
console.log(result);
В данном примере код, переданный в метод evaluate, будет
выполнен в контексте браузера. В данном случае извлекается заголовок
страницы с помощью свойства document.title, и его значение
возвращается в Node.js контекст, после чего оно выводится в консоль.
Метод evaluate имеет следующий синтаксис:
const result = await page.evaluate(pageFunction[, ...args]);
pageFunction: обязательный параметр, представляющий
собой функцию, которая будет выполнена на странице. Эта функция может
быть анонимной или ссылаться на уже определённую функцию.args: дополнительные аргументы, которые могут быть
переданы в функцию. Эти аргументы будут сериализованы и доступны внутри
функции как обычные параметры.Функция, передаваемая в evaluate, может работать с
любыми доступными объектами страницы, такими как DOM, события или даже
глобальные переменные, определённые на странице. Однако важно помнить,
что аргументы, передаваемые в метод, сериализуются. Это означает, что
объекты и функции передаются в виде сериализованных данных, что
ограничивает возможности работы с функциями и методами внутри
передаваемой функции.
evaluateМетод evaluate всегда возвращает результат выполнения
функции. Этот результат будет передан в Node.js окружение как
сериализованный объект. На практике это означает, что результат может
быть любым типом данных, который можно сериализовать в JSON, включая
строки, числа, массивы и объекты.
Пример:
const pageTitle = await page.evaluate(() => {
return document.title;
});
console.log(pageTitle); // Выводит заголовок страницы
Этот код выполняет JavaScript внутри страницы и возвращает заголовок страницы. Результат автоматически передаётся обратно в Node.js, где его можно использовать для дальнейшей обработки.
Один из самых распространённых случаев применения метода
evaluate — это извлечение данных из DOM. Это может быть
полезно, например, для получения текста с элементов, атрибутов, или для
выполнения сложных операций, которые невозможно сделать с помощью
обычных методов Playwright.
Пример извлечения списка элементов:
const items = await page.evaluate(() => {
const elements = Array.from(document.querySelectorAll('li'));
return elements.map(el => el.textContent);
});
console.log(items); // Выводит массив текстов всех элементов <li> на странице
Здесь метод evaluate извлекает текст из всех элементов
списка (<li>) и возвращает массив строк.
evaluateМетод evaluate поддерживает асинхронные операции, но
важно понимать, что сам код, передаваемый в evaluate,
должен быть синхронным или возвращать промис. Если внутри передаваемой
функции используется асинхронный код, то результат будет ожидаться,
прежде чем он будет передан обратно.
Пример работы с асинхронной функцией:
const data = await page.evaluate(async () => {
const response = await fetch('https://api.example.com/data');
const result = await response.json();
return result;
});
console.log(data); // Выводит данные, полученные от API
Здесь асинхронный запрос выполняется внутри браузера, и результат возвращается после завершения запроса.
evaluateПередача данных в метод evaluate возможна через
дополнительные аргументы. Эти аргументы передаются в функцию,
выполняемую на странице, и доступны как локальные переменные.
Пример передачи данных:
const selector = '.my-element';
const elementText = await page.evaluate((selector) => {
const element = document.querySelector(selector);
return element ? element.textContent : null;
}, selector);
console.log(elementText); // Выводит текст элемента, если он найден
В этом примере в функцию передаётся селектор, который затем используется для поиска элемента на странице. Это позволяет гибко работать с динамическими данными, например, извлекая текст или атрибуты элементов, чьи селекторы могут быть переменными.
При использовании evaluate важно учитывать, что все
данные, передаваемые в функцию, должны быть сериализуемыми. В частности,
функции, классы или объекты с методами нельзя передать напрямую. Однако,
если необходимо передать более сложные данные, можно использовать
подходы для сериализации/десериализации, чтобы обеспечить корректную
передачу.
Пример использования сложных объектов:
const userData = {
username: 'testUser',
age: 30
};
const result = await page.evaluate((userData) => {
return `User: ${userData.username}, Age: ${userData.age}`;
}, userData);
console.log(result); // Выводит: User: testUser, Age: 30
Этот пример демонстрирует, как передавать и использовать объекты в
методе evaluate. Хотя данные сериализуются, они сохраняют
свою структуру, и их можно легко использовать для выполнения вычислений
или создания динамического контента на странице.
Сериализация данных: Поскольку
evaluate работает через сериализацию данных, необходимо
учитывать, что объекты с методами, циклическими ссылками или
специализированными типами данных (например, Map или Set) не могут быть
переданы напрямую. В таких случаях можно использовать методы
сериализации или обрабатывать данные до передачи.
Производительность: Хотя evaluate
предоставляет огромные возможности для взаимодействия с браузером, его
использование может быть менее производительным по сравнению с
стандартными методами Playwright. Особенно это касается случаев, когда
необходимо часто выполнять операции с большими объёмами данных или
взаимодействовать с элементами на странице.
Безопасность: Код, выполняемый через
evaluate, имеет доступ к целому браузеру и его объектам.
Это означает, что он может нарушать безопасность страницы или
взаимодействовать с конфиденциальной информацией. Поэтому использование
evaluate должно быть ограничено сценариями, в которых такой
доступ необходим, и где безопасность данных не ставится под
угрозу.
Метод evaluate является мощным инструментом для
взаимодействия с браузером и позволяет решать множество задач, которые
трудно выполнить стандартными методами Playwright. Правильное понимание
и использование этого метода позволяет существенно расширить возможности
автоматизированных тестов и повысить гибкость в работе с
веб-приложениями.