Return 来自 page.evaluate 的复杂对象使用人偶操纵?

Return a complex object from page.evaluate using puppeteer?

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

所以我有这样的东西:

 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 之外,然后 "send" 放到评估函数中?

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

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()
})