当我使用操纵up打开此页面并尝试单击该元素时,如果预期可以单击该元素,则会引发错误。
const puppeteer = require('puppeteer');
const url = "https://www.zapimoveis.com.br/venda/apartamentos/rj+rio-de-janeiro/";
async function run() {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto(url, {waitUntil: 'load'});
const nextPageSelector = "#list > div.pagination > #proximaPagina";
await page.waitForSelector(nextPageSelector, {visible: true})
console.log("Found the button");
await page.click(nextPageSelector)
console.log('clicked');
}
run();
答案 0 :(得分:1)
发现了问题。 当您page.click(selector)或ElementHandle.click()时,Puppeteer滚动到该元素,找到其中心坐标,并最终单击。它使用位于node_modules / puppeteer / lib / JSHandle.js的_clickablePoint函数来查找坐标。
此网站(zapimoveis)的问题在于,滚动到元素视口的速度太慢,因此Puppeteer找不到其(x,y)中心。
单击此元素的一种不错的方法是使用page.evaluate,使用页面javascript单击它。但是,我更喜欢冈比亚的方式。 :)通过以下几行更改await page.click(nextPageSelector)
行:
try { await page.click(nextPageSelector) } catch (error) {} // sacrifice click :)
await page.waitFor(3000); // time for scrolling
await page.click(nextPageSelector); // this will work
答案 1 :(得分:0)
这是您代码的有效版本。
const puppeteer = require('puppeteer');
const url = "https://www.zapimoveis.com.br/venda/apartamentos/rj+rio-de-janeiro/";
async function run() {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto(url);
const nextPageSelector = "#list > div.pagination > #proximaPagina";
console.log("Found the button");
await page.evaluate(selector=>{
return document.querySelector(selector).click();
},nextPageSelector)
console.log('clicked');
}
run();
我个人更喜欢使用page.evaluate,因为page.click在某些情况下也不适合我,您可以直接在页面上执行任何js。
唯一要知道的是语法: -第一个参数:要执行的功能 -第二个参数:要传递给此函数的变量