Playwright locator.evaluateAll方法签名解析与示例咨询
关于Playwright中
Locator.evaluateAll()的详解 1. 你对A、B、C的理解纠正
VS Code提示的泛型参数真实含义如下:
- A:是
evaluateAll最终返回的Promise的resolve类型,默认是any[];而SVGElement | HTMLElement是定位到的节点数组的单个元素类型,并非A的联合类型。简单说,A就是你在回调函数里return内容的类型。 - B:代表传入的
pageFunction参数,该参数的类型是PageFunctionOn<C>,也就是在浏览器上下文执行的函数。 - C:是
PageFunctionOn的泛型三元组,依次对应:- 第一个值:传入页面函数的第一个参数类型,即定位到的所有节点组成的数组
(SVGElement | HTMLElement)[]; - 第二个值:给页面函数传递的额外参数类型(默认是
void,表示不传额外参数); - 第三个值:页面函数的返回值类型,和前面的A对应。
- 第一个值:传入页面函数的第一个参数类型,即定位到的所有节点组成的数组
你之前对A的理解存在偏差,A不是节点类型与数组的联合,而是方法最终返回值的类型。
2. generate_types/overrides.d.ts中两个evaluateAll()签名的含义
Playwright该类型文件里的两个签名,核心是区分是否传递额外参数的场景:
签名1:无额外参数版本
evaluateAll<R>( pageFunction: (nodes: Array<SVGElement | HTMLElement>) => R ): Promise<R>;
用于不需要给页面函数传额外数据的场景:
- 仅接收一个参数
pageFunction:直接拿到定位到的所有节点数组,在浏览器上下文执行逻辑; - 返回
Promise<R>:R是页面函数的返回值类型,会被序列化后传回Node.js上下文。
签名2:带额外参数版本
evaluateAll<R, Arg>( pageFunction: (nodes: Array<SVGElement | HTMLElement>, arg: Arg) => R, arg: Arg ): Promise<R>;
用于需要给页面函数传递外部数据的场景:
- 第一个参数
pageFunction:除了节点数组,还接收一个额外参数arg; - 第二个参数
arg:要传递给页面函数的可序列化数据(数字、对象、数组等均可); - 返回
Promise<R>:同样是页面函数的返回值类型。
3. evaluateAll()的实际使用示例
示例1:提取所有商品项的标题文本
假设页面上的<line-item>元素包含.title类的文本节点,提取所有标题:
const itemTitles = await page.locator("line-item").evaluateAll(nodes => { // 在浏览器上下文直接操作DOM return nodes.map(node => node.querySelector(".title").textContent.trim()); }); console.log(itemTitles); // 输出:["商品A", "商品B", "商品C"]
示例2:计算所有商品的总价
如果每个<line-item>的.price元素显示价格(如"¥89"),计算总价:
const totalPrice = await page.locator("line-item").evaluateAll(nodes => { return nodes.reduce((sum, node) => { const priceNum = parseFloat(node.querySelector(".price").textContent.replace("¥", "")); return sum + priceNum; }, 0); }); console.log(`总价:¥${totalPrice}`); // 输出:总价:¥267
示例3:传入阈值过滤高价商品
从Node.js上下文传入价格阈值,筛选出价格超过阈值的商品标题:
const threshold = 100; const highPriceItems = await page.locator("line-item").evaluateAll((nodes, minPrice) => { return nodes.filter(node => { const price = parseFloat(node.querySelector(".price").textContent.replace("¥", "")); return price > minPrice; }).map(node => node.querySelector(".title").textContent.trim()); }, threshold); // 第二个参数就是传给pageFunction的minPrice console.log(highPriceItems); // 输出价格超过100的商品标题
内容的提问来源于stack exchange,提问作者surfmuggle
相关产品推荐
相关产品推荐

