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您只需在任何网站上使用一个最低限度的工作示例(我在这里提供)来测试您的假设,即木偶医生是不正确的,观察结果,也许可以更正您的陈述。由于您尚未提供该网站,我无法复制您的结果并验证您的声明。