Playwright库page.evaluate()方法执行JavaScript 表达式

2024-03-31 09:20

本文主要是介绍Playwright库page.evaluate()方法执行JavaScript 表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

page.evaluate() 方法是 Playwright 中常用的方法之一,用于在页面上下文中执行 JavaScript 代码。它允许在浏览器环境中执行各种操作,如操作 DOM 元素、获取页面数据、执行复杂的计算等,并将结果返回到 Node.js 或 Python 代码中。

在 Playwright 中,page.evaluate() 方法的基本语法如下:

result = await page.evaluate(script, *args)

其中:

  • script 是一个 JavaScript 字符串,表示要在页面上下文中执行的代码。
  • args 是可选参数,可以传递给 JavaScript 代码的参数列表。

page.evaluate() 方法会在页面的 JavaScript 环境中执行指定的代码,并返回执行结果。如果代码中有异步操作,您可以使用 await 关键字来等待执行完成。

# 获取页面标题
title = await page.evaluate('document.title')# 在页面中查找所有链接的数量
links_count = await page.evaluate('document.querySelectorAll("a").length')# 计算两个数字的和
result = await page.evaluate('(a, b) => a + b', 3, 4)# 获取页面中某个元素的文本内容
element_text = await page.evaluate('(selector) => document.querySelector(selector).innerText', '.my-element')

page.evaluate() 方法在 Playwright 和 Puppeteer 中的使用方式非常相似,都是用于在页面上下文中执行 JavaScript 代码,并返回执行结果。这使得它成为执行各种操作的强大工具,如数据提取、页面操作、自动化测试等。 

-------
evaluate
方法是 Playwright 库在版本 1.8 中新增的功能,用于在浏览器环境中执行 JavaScript 表达式并获取其结果。它能够处理同步和异步函数,并支持向这些函数传递参数。

主要特点包括:

  1. 执行 JavaScript 表达式:您可以将函数或包含 JavaScript 表达式的字符串传递给 page.evaluate() 方法。

  2. 处理 Promise:如果传递给 page.evaluate() 的函数返回一个 Promise,则该方法会等待 Promise 解析,并返回其值。

  3. 处理非可序列化值:如果函数返回一个非可序列化值,比如函数本身或特殊的数值,如 -0NaNInfinity-Infinity,方法会解析为 undefined。不过,Playwright 还支持传输这些额外的值。

  4. 传递参数:您可以向 JavaScript 表达式/函数传递参数。这些参数可以作为数组提供,并且可以在表达式内部访问到。

  5. 与 ElementHandle 的结合使用:您还可以将 ElementHandle 实例作为参数传递给 page.evaluate(),从而可以直接在浏览器环境中操作 DOM 元素。

  6. 自动函数调用:如果表达式评估为一个函数,则 page.evaluate() 会自动调用它。

以下是page.evaluate() 使用方法的示例:

# 传递函数和参数
result = await page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
print(result)  # 输出: 56# 传递包含表达式的字符串
print(await page.evaluate("1 + 2"))  # 输出: 3
x = 10
print(await page.evaluate(f"1 + {x}"))  # 输出: 11# 传递 ElementHandle 实例
body_handle = await page.evaluate("document.body")
html = await page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
await body_handle.dispose()

 在这个例子中:

  • 我们传递了一个函数 (x, y) => Promise.resolve(x * y),以及参数 [7, 8],以异步方式计算两个数字的乘积。
  • 我们将简单的算术表达式和变量传递给 page.evaluate(),以在浏览器环境中执行计算。
  • 我们获取 <body> 元素的 innerHTML 并在浏览器环境中与后缀连接起来。

----------

使用 page.evaluate() 方法时,您可以利用它来执行各种任务,包括但不限于:

  1. 操作 DOM 元素:您可以使用 JavaScript 来查找、修改或操作页面上的 DOM 元素。例如,您可以通过 document.querySelector()document.querySelectorAll() 方法来选择元素,并使用其他 DOM API 来进行操作。

    # 查找单个元素
    element = await page.evaluate('document.querySelector("h1")')# 查找多个元素
    elements = await page.evaluate('document.querySelectorAll("p")')
    
  2. 获取页面内容:您可以检索页面的文本内容、属性值、样式信息等。这对于提取页面信息以进行后续分析或操作非常有用。

    # 修改元素的文本内容
    await page.evaluate('document.querySelector("h1").textContent = "New Heading"')# 修改元素的样式
    await page.evaluate('document.querySelector("p").style.color = "red"')# 添加类名
    await page.evaluate('document.querySelector("div").classList.add("highlight")')
    
  3. 模拟用户操作:您可以执行一系列操作,如点击、填写表单、提交表单等,以模拟用户与页面的交互。这对于自动化测试或爬取动态网页内容非常有用。

    # 点击按钮
    await page.evaluate('document.querySelector("button").click()')# 填写表单字段
    await page.evaluate('document.querySelector("input[type=\\"text\\"]").value = "John Doe"')# 提交表单
    await page.evaluate('document.querySelector("form").submit()')# 模拟键盘输入
    await page.evaluate('document.querySelector("input[type=\\"text\\"]").value = "Hello, World!"')
    
  4. 执行复杂的计算:如果您需要在页面上执行一些复杂的计算或操作,page.evaluate() 可以帮助您在浏览器环境中执行这些操作,并将结果返回到 Python 代码中。

    result = await page.evaluate('''() => {// 在页面上执行复杂的计算function complexCalculation(a, b) {return Math.sqrt(a*a + b*b);}// 调用复杂计算函数return complexCalculation(3, 4);
    }''')print("结果:", result)  # 输出: 5
    
  5. 处理页面事件:您可以在页面上触发事件,如点击、拖放、键盘输入等,以测试页面的交互性或模拟用户的操作行为。

    # 模拟点击事件
    await page.evaluate('document.querySelector("button").click()')# 模拟键盘输入事件
    await page.evaluate('document.querySelector("input").value = "Hello, World!"')
    await page.evaluate('document.querySelector("input").dispatchEvent(new Event("input"))')
    
  6. 与页面中的 JavaScript 函数交互:如果页面中定义了 JavaScript 函数,您可以使用 page.evaluate() 来调用这些函数,并传递参数给它们。

    #假设页面中有以下 JavaScript 函数:
    // 页面中定义的 JavaScript 函数
    function greet(name) {return "Hello, " + name + "!";
    }#可以使用 page.evaluate() 来调用这个函数,并传递参数给它:
    # 在 Python 中调用页面中定义的 JavaScript 函数
    result = await page.evaluate('greet("John")')
    print(result)  # 输出:Hello, John!
  7. 执行页面注入脚本:您可以将自定义的 JavaScript 脚本注入到页面中,以实现特定的功能或修改页面行为。

    # 创建新元素并添加到页面中
    await page.evaluate('''const newElement = document.createElement("div");newElement.textContent = "New Element";document.body.appendChild(newElement);
    ''')# 移除现有元素
    await page.evaluate('document.querySelector(".old-element").remove()')
    

总的来说,page.evaluate() 是 Playwright 中一个非常强大和灵活的方法,可以让您在浏览器环境中执行任意 JavaScript 代码,并与 Python 代码进行交互,从而实现各种复杂的任务。

 

这篇关于Playwright库page.evaluate()方法执行JavaScript 表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863990

相关文章

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python