木偶引发错误,显示“节点不可见...”

时间:2019-09-14 20:59:48

标签: javascript events puppeteer

当我使用操纵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();

2 个答案:

答案 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。

唯一要知道的是语法:  -第一个参数:要执行的功能  -第二个参数:要传递给此函数的变量