Puppeteer Chrome Puppeter:通过JSHandles还是通过page.execute()做任何事情更好吗?

Puppeteer Chrome Puppeter:通过JSHandles还是通过page.execute()做任何事情更好吗?,puppeteer,Puppeteer,我正在写一个相当复杂的剧本,用木偶演员做一些相当复杂的工作。然而,这一切可能都是通过在木偶演员中使用ElementHandles来完成的。所以,我想知道更好的选择是什么: 只需在page.evaluate()中塞进一大块代码,并结束它 使用page.$() 我假设传递这些元素句柄可能会非常昂贵……考虑这样一种情况,即您希望使用Puppeter访问网页上元素的句柄 直接在内部处理元素要比将元素作为函数传递给函数快2倍以上 此外,将pageFunction作为字符串传递给page.evaluate(

我正在写一个相当复杂的剧本,用木偶演员做一些相当复杂的工作。然而,这一切可能都是通过在木偶演员中使用
ElementHandles
来完成的。所以,我想知道更好的选择是什么:

  • 只需在page.evaluate()中塞进一大块代码,并结束它
  • 使用
    page.$()

  • 我假设传递这些元素句柄可能会非常昂贵……

    考虑这样一种情况,即您希望使用Puppeter访问网页上元素的句柄

    直接在内部处理元素要比将元素作为函数传递给函数快2倍以上

    此外,将
    pageFunction
    作为字符串传递给
    page.evaluate()
    ,而不是作为函数传递,速度甚至更快

    您可以使用inside
    page.evaluate()
    而不是

    最慢的方法是结合使用。使用此方法需要等待时间超过4倍(与本实验中最快的方法相比)

    您可以在下面看到执行的测试和结果:

    await page.evaluate('document.getElementById("result").textContent');           // ≈ 0.41 ms ✔
    await page.evaluate('document.querySelector("#result").textContent');           // ≈ 0.42 ms
    await page.evaluate(() => document.getElementById('result').textContent);       // ≈ 0.42 ms
    await page.evaluate(() => document.querySelector('#result').textContent);       // ≈ 0.44 ms
    await page.evaluate(result => result.textContent, await page.$('#result'));     // ≈ 0.99 ms
    await (await (await page.$('#result')).getProperty('textContent')).jsonValue(); // ≈ 1.69 ms ✘
    
    上述所有测试都运行了1000000次,单次迭代的平均时间如上面的注释所示

    因此,要回答您的问题,成本最低的方法似乎是尽可能在
    page.evaluate()
    中处理代码