【问题标题】:Puppeteer js, unable to execute page in $$evalPuppeteer js,无法在 $$eval 中执行页面
【发布时间】:2020-01-08 20:30:43
【问题描述】:

我看到有人问过这个问题,但我无法确定我做错了什么。

错误:UnhandledPromiseRejectionWarning:错误:评估失败:ReferenceError:页面未定义

const page = await browser.newPage();
await page.goto('https://example.com');

const getAllElements = await page.$$eval('.aclass', links => {
  links.map(link => {
    page.hover(link);
    page.screenshot({path: `example${link}.png`});
  })
})

预期的行为是我去 example.com,然后我得到所有 .aclass 元素。将这些作为“链接”返回,然后我映射到每个链接,这应该给我链接中的每个元素。然后我期望能够 page.hover 和 page.screenshot。但是这是我得到页面不是错误的地方定义。知道我做错了什么吗?

【问题讨论】:

  • $$eval() 在页面上下文中执行,而不是 puppeteer。使用page.$$() 获取元素,而不是在 puppeteer 上下文中迭代这些元素。

标签: puppeteer


【解决方案1】:
  1. hoverscreenshot 返回 Promise。
  2. 不要将页面传递给page.$$eval。相反,您可以执行以下操作:
const page = await browser.newPage();
await page.goto('https://example.com');

const getAllElements = await page.$$('.aclass');
for (let [i, link] of getAllElements.entries()) {
    await link.hover();
    await link.screenshot({path: `example${i}.png`});
}

【讨论】:

  • UnhandledPromiseRejectionWarning:错误:JSHandles 只能在创建它们的上下文中进行评估! @mbit
  • @FabricioG 我的错,编辑了答案。 page.hover() 获取选择器而非元素。如果仍然无法正常工作,请告诉我。
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2016-03-19
相关资源
最近更新 更多