【问题标题】:Return a complex object from page.evaluate using puppeteer?从 page.evaluate 中返回一个复杂对象?
【发布时间】:2018-11-19 07:23:42
【问题描述】:

我被要求创建一个点击网站上随机链接的任务(为了测试一些东西)。

所以我有这样的东西:

 await page.evaluate((a, shuf) =>
                                {
                                  function shuffle(array)
                                   {
                                     //...
                                     return array;
                                   }

    //let's get the first one
    let anchor = shuffle([...document.querySelectorAll('a')].filter(...)[0];

    (anchor).click();

 });

1) 请注意,我必须内联 shuffle 函数,否则它不知道。有没有办法将此函数放在 page.evaluate 之外,并将其“发送”到评估函数?

2) 我不想在评估函数中单击它的锚点 ((anchor).click();)。我想返回 anchor 的 DOM 对象并进行一些其他操作然后单击它。问题是 DOM 是一个未序列化的复杂对象,所以我无法返回它。有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: web-scraping puppeteer


    【解决方案1】:

    1) 您需要将 shuffle() 添加到浏览器上下文中:

    await page.evaluate(() => {
      window.shuffle = array => {
        return array.reverse()
      }
    })
    

    现在你可以在评估中使用它了:

    let shuffled = await page.evaluate((array) => window.shuffle(array), [1,2,3,4,5])
    

    2) 也许是这样的?

    await page.evaluate(() => {
      window.anchors = [...document.querySelectorAll('a[href]')]
      return 'something else'
    })
    
    await page.evaluate(() => {
      window.anchors[0].click()
    })
    

    【讨论】:

    • 谢谢。我不知道离开page对象后,所有的道具都会在稍后的那个页面上可用。
    猜你喜欢
    • 2018-03-04
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2011-01-22
    • 2022-07-27
    相关资源
    最近更新 更多