【问题标题】:Async / await outer variable access异步/等待外部变量访问
【发布时间】:2020-07-13 01:03:45
【问题描述】:
const puppeteerOTPTrigger = async ({ username, password }) => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto("example.com");
  await Promise.all([page.waitForNavigation(), page.click("div")]);
 
  await page.$eval("#Login_userName", (el) => {
    return (el.value = username); // in this line i am getting the error 
                                     ReferenceError: username is not defined
  });
  await page.$eval("#Login_password", (el) => (el.value = "password")); static value woking 
 
};

在上面的示例中,我无法访问 await 回调函数中的“用户名”变量。

【问题讨论】:

    标签: node.js async-await puppeteer


    【解决方案1】:

    这与async/await 无关。这是因为 puppeteer 是在页面上下文中运行您的回调,而不是在您的程序上下文中。

    您应该将用户名参数作为另一个参数传递给.$eval()。然后,您将能够以这种方式访问​​它作为回调的参数。

    await page.$eval("#Login_userName", (el, name) => {
      return (el.value = name); // use the argument you passed
    }, username);
    

    【讨论】:

    • 谢谢!!这是工作,但你能告诉我它是如何工作的!
    • @NikhilTayal - 您将 username 作为参数传递给 page.$eval()(参见回调后传递的参数)。 $.eval() 然后将该参数传递给您的回调,然后您可以从页面上下文中的回调上下文中访问它。
    • @NikhilTayal - 如果这回答了您的问题,您可以通过单击答案左侧的复选标记向社区表明这一点。这也将为您在此处遵循正确的程序赢得一些声誉积分。
    【解决方案2】:

    这是不可能的,因为 username 在 Nodejs 运行时可用,而 el.value = username 正在浏览器中执行(其中用户名不可用)。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2011-10-10
      • 2019-10-29
      • 2018-12-09
      • 2021-10-11
      相关资源
      最近更新 更多