如何使用 puppeteer 将“page”元素传递给函数?

chi*_*zui 5 javascript google-chrome puppeteer

我正在尝试从函数内检查页面上是否有元素可用,如果元素在页面上,很好,继续执行代码,如果没有,请记录错误。

使用try 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();
Run Code Online (Sandbox Code Playgroud)

我明白了Error running your code. SyntaxError: Unexpected identifier。我调试了一下,似乎pagecheck函数中是意外的标识符。所以我试图像这样用力传递它:

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();
Run Code Online (Sandbox Code Playgroud)

但我得到了同样的Error running your code. SyntaxError: Unexpected identifier错误...

我究竟做错了什么?

Md.*_*her 4

您可以使用此变体来检查该元素是否在页面中。

if (await page.$(selector) !== null) console.log('found');
else console.log('not found');
Run Code Online (Sandbox Code Playgroud)

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

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

无论何时调用await,它都必须在async函数内部。你不能在任何地方都调用await。所以你的检查函数应该这样调用,

await check("#something", page);
Run Code Online (Sandbox Code Playgroud)

所以我们完全可以用这种方式重写代码片段,你可以继续尝试这个。

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();
Run Code Online (Sandbox Code Playgroud)

此外,异步函数将返回承诺,因此您必须捕获该承诺或使用另一个等待。在这里阅读有关异步等待的更多信息: