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
进行序列化的一些其他值:-0
,NaN
,Infinity
,- 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.evaluate
和executionContext.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();
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。