如何使用Puppeteer将“页面”元素传递给函数?

5
我正在尝试从函数内部检查页面上是否存在元素,如果该元素在页面上,则继续执行代码,否则记录错误日志。
使用尝试 Puppeteer 页面,这是我尝试的方法:
const browser = await puppeteer.launch();
const page = await browser.newPage();

const check = element => {
  try {
    await page.waitFor(element, {timeout: 1000});
  } catch(e) {
    console.log("error : ", e)
    await browser.close();
  }
}

await page.goto('https://www.example.com/');
check("#something");

console.log("done")
await browser.close();

我遇到了一个错误:Error running your code. SyntaxError: Unexpected identifier。我进行了一些调试,似乎check函数内的page是意外的标识符。所以我尝试强制传递它,像这样:

const browser = await puppeteer.launch();
const page = await browser.newPage();

const check = (element, page) => {
  try {
    await page.waitFor(element, {timeout: 1000});
  } catch(e) {
    console.log("error : ", e)
    await browser.close();
  }
}

await page.goto('https://www.example.com/');
check("#something", page);

console.log("done")
await browser.close();

但我获取了相同的错误信息:运行代码时出错。SyntaxError: 意外标识符...

我做错了什么?

1个回答

4
您可以使用此变量来检查元素是否在页面中。
if (await page.$(selector) !== null) console.log('found');
else console.log('not found');

现在回到你的代码,它会抛出错误,因为这个函数不是async的。

    const check = async element => { // <-- make it async
      try {
        await page.waitFor(element, {timeout: 1000});
      } catch(e) {
        console.log("error : ", e)
        await browser.close();
      }
    }

无论何时您调用await,它必须在async函数内部。您不能随处调用await。因此,您的检查函数应该像这样调用:

await check("#something", page);

所以,我们可以这样重写代码片段,你可以直接尝试使用这个。
const browser = await puppeteer.launch();
const page = await browser.newPage();
const check = async(element, page) => (await page.$(element) !== null); // Make it async, return true if the element is visible
await page.goto('https://www.example.com/');

// now lets check for the h1 element on example.com
const foundH1 = await check("h1", page);
console.log(`Element Found? : ${foundH1}`);

// now lets check for the h2 element on example.com
const foundH2 = await check("h2", page);
console.log(`Element Found? : ${foundH2}`);

await browser.close();

同时,异步函数将返回一个Promise,因此您需要捕获该Promise或使用另一个await。在这里阅读有关async/await的更多信息:

黄金答案!谢谢! - chitzui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接