загрузка страницы после нажатия на элемент в кукловоде

У меня есть страница, загруженная с помощью кукловода, и у меня есть список элементов, отображаемых на этой странице. Каждый из элементов можно щелкнуть, и при щелчке он растянет элемент и добавит дополнительный элемент с дополнительными данными. Вроде как на аккордеоне. Как я могу заставить это работать? Я пробовал несколько вещей вроде:

async function getSite(url) {
  const browser = await puppeteer.launch();

  const page = await browser.newPage();
  await page.goto(url, { waitUntil: "networkidle0" });

  const parentElements = await page.$$(".feeditem");
  await Promise.all(parentElements.map(parentElement => parentElement.click()));

  await page.waitForFunction(
    parentNumber =>
      document.querySelectorAll(".accordion_opened").length === parentNumber,
    { timeout: 20000 },
    parentElements.length
  );

  await page.waitFor(5000);

  const elementsExtcArr = await page.evaluate(() => {
    let elements = Array.from(document.querySelectorAll(".accordion_opened"));
    const elementsExtc = elements.map(i => i.innerHTML);

    return elementsExtc;
  });

  console.log(elementsExtcArr);
  await browser.close();
}

getSite(url);

но ни один из них не работает. Я все еще получаю страницу такой, какой она была до событий кликов. Любая идея?


person obiwankenoobi    schedule 09.02.2019    source источник


Ответы (2)


Вы можете сначала попробовать это:

const elements = await page.$$(".feeditem");
await Promise.all(elements.map(element => element.click()));

let site = await page.evaluate(
  () => document.querySelector("body").innerHTML
);

Если это не помогает (например, если каждый щелчок отправляет запрос XHR и вам нужно подождать еще), вы можете добавить _ 2_, например:

const parentElements = await page.$$(".feeditem");
await Promise.all(parentElements.map(parentElement => parentElements.click()));

await page.waitForFunction(
  parentNumber => document.querySelectorAll('.accordion_opened').length === parentNumber,
  { timeout: 0 },
  parentElements.length
);

let site = await page.evaluate(
  () => document.querySelector("body").innerHTML
);
person vsemozhebuty    schedule 09.02.2019
comment
к сожалению, это не сработало. Я обновил вопрос, указав полный код, возможно, вы заметили что-то, что я пропустил, спасибо. - person obiwankenoobi; 09.02.2019
comment
@obiwankenoobi Какой URL вы используете? - person vsemozhebuty; 10.02.2019
comment
@obiwankenoobi Извините, я допустил опечатку. Пожалуйста, замените document.querySelectorAll('.accordion_opened') наdocument.querySelectorAll('.accordion_opened').length, как в отредактированном ответе, и повторите попытку - person vsemozhebuty; 10.02.2019
comment
нет по-прежнему возвращает пустой массив. URL, с которым я пытаюсь работать: https://www.yad2.co.il/realestate/rent - person obiwankenoobi; 10.02.2019
comment
Когда я пытаюсь открыть сайт в обычном браузере, я получаю следующее сообщение: מתנצלים, המחשב חסום לגישה לאתר. האתר משתמש בשירות אבטחה לצורך מניעת תקיפות מקוונות. ביצעת פעולה אשר הפעילה את שירות האבטחה וחסמה את גישתך. Инцидент מספר פניה: 1fa2753ea52adee59f2e0460463a662a ליצירת קשר עם מוקד שירות לקוחות טלפון: 03-5522222 מוקד טלפוני ארצי ו יי - person vsemozhebuty; 10.02.2019
comment
То же и в firefox. Я только попытался открыть его в первый раз. Кажется, что блокировка основана на стране или IP-сегменте. Прости( - person vsemozhebuty; 10.02.2019
comment
в любом случае метод, использующий $$, похоже, не возвращает никаких значений, но Array.from(document.querySelectorAll(".feeditem")); это делает. Есть ли шанс использовать щелчок по каждому из элементов, используя это? - person obiwankenoobi; 10.02.2019
comment
Ой, может это очередная опечатка? В вашем коде await page.$$("feeditem"); вместо await page.$$(".feeditem");. в селекторе классов). - person vsemozhebuty; 10.02.2019
comment
да, опечатка была проблемой, но теперь щелчок по-прежнему не отображает разделы, которые я пытаюсь отобразить. вызов waitForFunction - это тайм-аут. Кажется, что щелчок просто не работает - person obiwankenoobi; 10.02.2019
comment
Можете ли вы попробовать в консоли браузера, если после всех кликов document.querySelectorAll(".feeditem").length === document.querySelectorAll(".accordion_opened").length, как мы полагаем, это должно быть правдой. Если есть другие элементы с этим классом за пределами нашей области видимости, это проблема. - person vsemozhebuty; 10.02.2019
comment
поэтому я попытался console.log(parentElements), и он вернул ReferenceError: parentElements is not defined, когда мы четко определили его здесь: const parentElements = await page.$$(".feeditem"); Я думаю, что это может быть проблема - person obiwankenoobi; 10.02.2019
comment
Давайте продолжим это обсуждение в чате. - person obiwankenoobi; 10.02.2019

Попробуйте сделать все в контексте браузера:

await page.evaluate(() => {
  for(let el of [...document.querySelectorAll('.feeditem')]){
    el.click()
  }
})
person pguardiario    schedule 11.02.2019