从puppeteer返回page.evaluate的复杂对象?

时间:2018-11-18 15:48:59

标签: web-scraping puppeteer

我被要求创建一个任务,该任务单击网站上的随机链接(以进行测试)。

所以我有这样的东西:

Select Department,
       Count(distinct EmployeeID) as Employees,
       Min(Salary) as Min,
       Max(Salary) as Max
  From Employees
 Group by Department;

1)注意,我必须内联 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(); }); 函数,因为否则,它不知道。有什么方法可以将此函数放在shuffle之外,然后“发送”到评估函数?

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

1 个答案:

答案 0 :(得分:1)

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

 req.then(function(resp) {
  var prefix = 'wi wi-';
  var code = resp.weather[0].id;
  var icon = weatherIcons[code].icon;

  // If we are not in the ranges mentioned above, add a day/night prefix.
  if (!(code > 699 && code < 800) && !(code > 899 && code < 1000)) {
    icon = 'day-' + icon;
  }

  // Finally tack on the prefix.
  icon = prefix + icon;
});

现在您可以在评估中使用它:

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

2)也许像这样吗?

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