【问题标题】:Puppeteer weird scope behaviorPuppeteer 奇怪的作用域行为
【发布时间】:2020-03-26 11:28:05
【问题描述】:

我正在尝试使用 puppeteer 自动填写表单,但它一直抛出 ReferenceError: text is not defined,即使它之前定义了 1 行并且 console.log 成功显示它。

这是引发错误的行: await page.$eval('#chat-message-text', el => el.value = text); 如果我用el.value = 'blablabla' 之类的东西填充它,效果会很好。

最奇怪的是console.log(text); 也能正常工作,然后它会抛出一个错误。

puppeteer.launch({ headless: false }).then(async browser => {

  const page = await browser.newPage()
  var cookie = [here are my cookies]

  await page.setCookie(...cookie)
  await page.goto('https://example.com')
  await page.waitFor(5000);

  await page.solveRecaptchas()
  console.log('Captcha was solved');
  await page.waitFor(5000);

  var text = JSON.parse(fs.readFileSync('/Users/apple/Desktop/test/text.json', 'utf8'));
  console.log("Sending text");
  console.log(text);
  await page.$eval('#chat-message-text', el => el.value = text);
  await page.waitFor(1000);
  await page.waitForSelector('button[class="btn btn-primary send-chat-btn"]');
  await page.click('button[class="btn btn-primary send-chat-btn"]');
  await page.waitFor(2000);
  await browser.close()
})

完整的错误日志:

(node:86035) UnhandledPromiseRejectionWarning: Error: Evaluation failed: ReferenceError: text is not defined
    at __puppeteer_evaluation_script__:1:19
    at ExecutionContext._evaluateInternal (/Users/apple/Desktop/test/node_modules/puppeteer/lib/ExecutionContext.js:122:13)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
  -- ASYNC --
    at ExecutionContext.<anonymous> (/Users/apple/Desktop/test/node_modules/puppeteer/lib/helper.js:111:15)
    at ElementHandle.evaluate (/Users/apple/Desktop/test/node_modules/puppeteer/lib/JSHandle.js:54:42)
    at ElementHandle.<anonymous> (/Users/apple/Desktop/test/node_modules/puppeteer/lib/helper.js:112:23)
    at ElementHandle.$eval (/Users/apple/Desktop/test/node_modules/puppeteer/lib/JSHandle.js:505:40)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
  -- ASYNC --
    at ElementHandle.<anonymous> (/Users/apple/Desktop/test/node_modules/puppeteer/lib/helper.js:111:15)
    at DOMWorld.$eval (/Users/apple/Desktop/test/node_modules/puppeteer/lib/DOMWorld.js:156:21)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
  -- ASYNC --
    at Frame.<anonymous> (/Users/apple/Desktop/test/node_modules/puppeteer/lib/helper.js:111:15)
    at Page.$eval (/Users/apple/Desktop/test/node_modules/puppeteer/lib/Page.js:345:29)
    at Page.<anonymous> (/Users/apple/Desktop/test/node_modules/puppeteer/lib/helper.js:112:23)
    at puppeteer.launch.then (/Users/apple/Desktop/test/app/test2.js:151:14)
    at <anonymous>
(node:86035) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:86035) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

【问题讨论】:

  • 试试这个:await page.$eval('#chat-message-text', el =&gt; el.value = text, text);
  • 相同。我认为问题在于有 2 个不同的范围 1)node.js 2)浏览器和文本仅在 1)中定义但不在 2)中,我无法弄清楚将其传递给浏览器的热度
  • 我不这么认为,您无权访问 eval 范围内的文本变量,您必须像上面那样传递它
  • 这是来自官方api文档:page.$eval(selector, pageFunction[, ...args]) 我要试试await page.$eval('#chat-message-text', el =&gt; el.value = text[text]);
  • 同样的错误.....

标签: javascript node.js scope undefined puppeteer


【解决方案1】:
await page.$eval('#chat-message-text', (el, text) => el.value = text, TEXT);

【讨论】:

  • 哦,对不起,我忘了把文本的用法(el,文本),但我告诉你这是问题xd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
相关资源
最近更新 更多