class: ExecutionContext

未匹配的标注

该类表示JavaScript执行的上下文。 [Page] 可能具有许多执行上下文:
-每个 frame 具有“默认”执行上下文,即
  始终在将 frame 加载到 DOM 之后创建。此上下文由frame.executionContext() 方法返回。
-扩展(Extensions) 的内容脚本可创建其他执行上下文。

除了 pages ,执行上下文还可以在 workers 中找到。

executionContext.evaluate(pageFunction[, ...args])

  • pageFunction <[function]|[string]> 在executionContext中求值的函数。
  • ...args <...[Serializable]|[JSHandle]> 传递给pageFunction的参数。
  • returns: <[Promise]<[Serializable]>> Promise,解析为pageFunction的返回值。
    如果传递给executionContext.evaluate的函数返回 [Promise],则executionContext.evaluate将等待该 promise 并返回其值。

如果传递给executionContext.evaluate的函数返回非序列化(Serializable)值,则executionContext.evaluate解析为undefined。 DevTools 协议还支持传输无法通过JSON进行序列化的一些其他值:-0NaNInfinity- Infinity和 bigint 常量。

const executionContext = await page.mainFrame().executionContext();
const result = await executionContext.evaluate(() => Promise.resolve(8 * 7));
console.log(result); // prints "56"

也可以传递字符串。

console.log(await executionContext.evaluate('1 + 2')); // prints "3"

[JSHandle] 实例可以作为参数传递给executionContext.evaluate
`executionContext.evaluate:

const oneHandle = await executionContext.evaluateHandle(() => 1);
const twoHandle = await executionContext.evaluateHandle(() => 2);
const result = await executionContext.evaluate((a, b) => a + b, oneHandle, twoHandle);
await oneHandle.dispose();
await twoHandle.dispose();
console.log(result); // prints '3'.

executionContext.evaluateHandle(pageFunction[, ...args])

  • pageFunction <[function]|[string]> 在executionContext中求值的函数。
  • ...args <...[Serializable]|[JSHandle]> 传给pageFunction的参数。
  • returns: <[Promise]<[JSHandle]>> Promise,它作为页内对象 JSHandle 解析为pageFunction的返回值。

executionContext.evaluateexecutionContext.evaluateHandle之间的唯一区别是executionContext.evaluateHandle返回页内对象(JSHandle)。
如果传递给executionContext.evaluateHandle的函数返回[Promise],则executionContext.evaluateHandle将等待 promise 处理并返回其值。

const context = await page.mainFrame().executionContext();
const aHandle = await context.evaluateHandle(() => Promise.resolve(self));
aHandle; // Handle for the global object.

也可以传递字符串。

const aHandle = await context.evaluateHandle('1 + 2'); // Handle for the '3' object.

[JSHandle] 实例作为参数传递给executionContext.evaluateHandle

const aHandle = await context.evaluateHandle(() => document.body);
const resultHandle = await context.evaluateHandle(body => body.innerHTML, aHandle);
console.log(await resultHandle.jsonValue()); // 打印 body's innerHTML
await aHandle.dispose();
await resultHandle.dispose();

executionContext.frame()

  • returns: <?[Frame]>与此执行上下文关联的 Frame 。

    注意并非每个执行上下文都与一个 frame 相关联。例如,workers 和扩展具有与 frame 不关联的执行上下文。

executionContext.queryObjects(prototypeHandle)

  • prototypeHandle <[JSHandle]> 对象原型的句柄。
  • returns: <[Promise]<[JSHandle]>> 使用此原型的对象数组的句柄。

该方法迭代 JavaScript 堆并查找具有给定原型的所有对象。

// 创建一个 Map 对象
await page.evaluate(() => window.map = new Map());
// 获取 Map 对象原型的句柄
const mapPrototype = await page.evaluateHandle(() => Map.prototype);
// 将所有地图实例查询到数组中
const mapInstances = await page.queryObjects(mapPrototype);
// 计算堆中的地图对象数量
const count = await page.evaluate(maps => maps.length, mapInstances);
await mapInstances.dispose();
await mapPrototype.dispose();

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/puppeteer/3.1.0...

译文地址:https://learnku.com/docs/puppeteer/3.1.0...

上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~