class: ExecutionContext

该类表示 JavaScript 执行的上下文。JavaScript 上下文的例子是:

  • 每个 frame 都有一个单独的执行上下文
  • 所有 workers 都有自己的上下文

executionContext.evaluate(pageFunction, …args)

  • pageFunction <[function]|[string]> Function to be evaluated in executionContext
  • ...args <…[Serializable]|[JSHandle]> Arguments to pass to pageFunction
  • returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of pageFunction

如果传递给 executionContext.evaluate 的函数返回一个[Promise],那么 executionContext.evaluate 将等待承诺解析并返回它的值。

  1. const executionContext = await page.mainFrame().executionContext();
  2. const result = await executionContext.evaluate(() => Promise.resolve(8 * 7));
  3. console.log(result); // 输出 "56"

一个字符串也可以被传入而不是一个函数。

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

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

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

executionContext.evaluateHandle(pageFunction, …args)

  • pageFunction <[function]|[string]> 函数在 executionContext 中被运行
  • ...args <…[Serializable]|[JSHandle]> 传递给 pageFunction 的参数
  • returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of pageFunction as in-page object (JSHandle)

executionContext.evaluateexecutionContext.evaluateHandle 唯一的区别在于executionContext.evaluateHandle 返回页内对象(JSHandle)。

如果传递给 executionContext.evaluateHandle 的函数返回一个 [Promise],那么executionContext.evaluateHandle将等待承诺解析并返回它的值。

  1. const context = await page.mainFrame().executionContext();
  2. const aHandle = await context.evaluateHandle(() => Promise.resolve(self));
  3. aHandle; // 处理全局对象。

一个字符串也可以被传入而不是一个函数。

  1. const aHandle = await context.evaluateHandle('1 + 2'); // 处理'3'对象。

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

  1. const aHandle = await context.evaluateHandle(() => document.body);
  2. const resultHandle = await context.evaluateHandle(body => body.innerHTML, aHandle);
  3. console.log(await resultHandle.jsonValue()); // 输出 body 的 innerHTML
  4. await aHandle.dispose();
  5. await resultHandle.dispose();

executionContext.frame()

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

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

executionContext.queryObjects(prototypeHandle)

  • prototypeHandle <[JSHandle]> 对象原型的句柄
  • returns: <[JSHandle]> 这个原型的一个对象数组的句柄

该方法重复查找 JavaScript 堆,找到具有给定原型的所有对象。

  1. // 创建一个 Map 对象
  2. await page.evaluate(() => window.map = new Map());
  3. // 获取 Map 对象原型的句柄
  4. const mapPrototype = await page.evaluateHandle(() => Map.prototype);
  5. // 将所有映射实例查询到一个数组中
  6. const mapInstances = await page.queryObjects(mapPrototype);
  7. // 计算堆中映射对象的数量
  8. const count = await page.evaluate(maps => maps.length, mapInstances);
  9. await mapInstances.dispose();
  10. await mapPrototype.dispose();