Javascript 如何单击从page.evaluate返回的元素?

Javascript 如何单击从page.evaluate返回的元素?,javascript,puppeteer,Javascript,Puppeteer,如何单击从页面返回的元素。评估 constAllCategoryElements=等待页面。评估(()=>{ 常量等位基因=[…document.querySelectorAll(“.mySelector”); 返回元素。筛选器((元素)=>{ const ul=元素查询选择器(“ul”); return!ul | |!ul.children.length; }); }); for(所有类别元素的常量类别处理){ 等待categoryHandle.click();//错误:categoryHan

如何单击从
页面返回的元素。评估

constAllCategoryElements=等待页面。评估(()=>{
常量等位基因=[…document.querySelectorAll(“.mySelector”);
返回元素。筛选器((元素)=>{
const ul=元素查询选择器(“ul”);
return!ul | |!ul.children.length;
});
});
for(所有类别元素的常量类别处理){
等待categoryHandle.click();//错误:categoryHandle没有click方法
}

基本上,我想要的是一个元素数组,然后我可以单击它(在评估之外)。如果我没有弄错的话,元素必须是ElementHandle类型。

元素不能使用
页面返回。请评估
,因为它们不可序列化。改用
页面。evaluateHandle

page.evaluate和page.evaluateHandle之间的唯一区别是page.evaluateHandle在页面对象(JSHandle)中返回

例如:

这里不返回元素

const元素=wait page.evaluate(()=>document.querySelector('a');
在这里,元素将是JSHandle的一个实例:

const元素=wait page.evaluateHandle(()=>document.querySelector('a');

可以使用获取ElementHandle。

要使用所有元素,需要同时使用function和evaluateHandle

// Get the "viewport" of the page, as reported by the page.
const jsHandle = await page.evaluateHandle(() => {
const allElements = [...document.querySelectorAll(".mySelector")];
  return allElements.filter((element) => {
    const ul = element.querySelector("ul");
    return !ul || !ul.children.length;
  });
 });
 await page.evaluate(all => {
  for (const elm of all) {
       elm.click();
     }
  } , jsHandle);

我不明白这个答案。尤其是你刚刚复制粘贴了我的代码。这是个错误吗?打字错误你能说得更清楚一点吗?给我举个例子会很有帮助。考虑到我需要点击结果elements@RolandJegorov添加了更多详细信息这是不正确的。evaluate可以返回元素,在我的示例中就是这样。文档-
如果传递到page.evaluate的函数返回一个不可序列化的值,则page.evaluate解析为未定义的
。但事实并非如此。相反,我得到的是
元素[]
。我的问题要求返回的是一个元素数组,我可以点击它。@RolandJegorov您只需在任何网站上使用一个最低限度的工作示例(我在这里提供)来测试您的假设,即木偶医生是不正确的,观察结果,也许可以更正您的陈述。由于您尚未提供该网站,我无法复制您的结果并验证您的声明。