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()
})
我被要求创建一个点击网站上随机链接的任务(为了测试一些东西)。
所以我有这样的东西:
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()
})