Не могу позволить моему сценарию нажимать, пока не останется ни одного - PullRequest
0 голосов
/ 18 июня 2019

Я написал скрипт на node в сочетании с puppeteer, чтобы очистить названия различных учреждений, пересекающих несколько страниц на веб-сайте .

Мой следующий скрипт может анализировать названия учреждений с целевой страницы, а затем инициировать несколько щелчков мышью при анализе имени с других страниц и, наконец, в какой-то момент выполнения обнаруживает ошибку.

the error:  TypeError: Cannot read property 'click' of undefined
    at main (c:\Users\WCS\Desktop\Node vault\comments.js:18:25)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:118:7)

Я использовал Harcoded for loop, так как на самом деле у меня нет никакой идеи позволить скрипту нажимать кнопку следующей страницы, пока не останется ничего. Я хочу соблюдать любую логику, чтобы мой скрипт сначала искал кнопку следующей страницы. Если он найдет его, он нажмет на эту кнопку и повторите процесс.

Я пробовал с:

const puppeteer = require('puppeteer');
const link = "https://www.incometaxindia.gov.in/Pages/utilities/exempted-institutions.aspx";

(async function main() {
  try {
    const browser = await puppeteer.launch({headless:false});
    const [page]    = await browser.pages();
    await page.goto(link);
    await page.waitForSelector("h1.faqsno-heading");

    for(let i = 1; i < 20; i++){
      const sections = await page.$$("h1.faqsno-heading");
      for (const section of sections) {
          const itemName = await section.$eval("div[id^='arrowex']", el => el.innerText);
          console.log(itemName);
      }
      const nextPage = await page.$$(".ms-paging > a");
      await nextPage[i].click();
      await page.waitForNavigation({waituntil:'networkidle0'});
    }

    await browser.close();
  } catch (e) {
    console.log('the error: ', e);
  }
})();

Кстати, чтобы спасти этот пост от двуличия, я должен признать, что натолкнулся на этот пост , но я не думаю, что сам смогу реализовать логику в своем сценарии.

Ответы [ 2 ]

1 голос
/ 19 июня 2019
  • Решение - Простой способ

Заменить этот код

      const nextPage = await page.$$(".ms-paging > a");
      await nextPage[i].click();
      await page.waitForNavigation({waituntil:'networkidle0'}); 

с этим

      await page.click("[title='Next Page']")
      await page.waitForNavigation({waituntil:'networkidle0'})
  • Решение - Твой путь (Глупая математика!). Настройте индекс по мере того, как вы продолжаете нажимать, так как индекс ваших страниц меняется, но всегда 0-5.
const puppeteer = require('puppeteer');
const link = "https://www.incometaxindia.gov.in/Pages/utilities/exempted-institutions.aspx";

(async function main() {
  try {
    const browser = await puppeteer.launch({headless:false});
    const [page]    = await browser.pages();
    await page.goto(link);
    await page.waitForSelector("h1.faqsno-heading");
     let j=0;
     let NoOfPage=9  // adjust here to get number of pages
    for(let i = 0; j<NoOfPage+1; i++,j++){
        if (j>4) {
            i=4;
        }
      if (i>0) {
      await page.waitForSelector("h1.faqsno-heading",{visible:true});
      const sections = await page.$$("h1.faqsno-heading");

       for (const section of sections) {
          const itemName = await section.$eval("div[id^='arrowex']", el => el.innerText);
          console.log(itemName);

      }

      }

      const nextPage= await page.$$(".ms-paging > a");
      await Promise.all([
      await nextPage[i].click(),
      await page.waitForNavigation({waituntil:'networkidle0'}),
])


    }

    await browser.close();
  } catch (e) {
    console.log('the error: ', e);
  }
})();
  • Некоторые результаты около 19-й страницы
C:\NodeJS\PuppeteerTest\Pup>node stack56652523.js
....
....
HAPPY PUBLIC SCHOOL SAMITI
AABAH3894H
SAGRADA FAMILIA SOCIETY, SOUTH GOA
AAWAS5165K
K V DEVADIGA CHARITABLE TRUST, DAKSHINA KANNADA
AADTK1517B
SHRINE OF INFANT JESUS, CHICKMAGLUR
AAVTS1925P
SRI NANDI VEDACURU CHARITABLE, TRUST
AATTS1842D
SHREE SUBRAHMANYA VANGMAYEE PARISHAD, GOA
AAPTS2410M
SHREE SUBRAHMANYA VANGMAYEE PARISHAD, GOA
AAPTS2410M
WORD FOR THE WORLD FELLOWSHIP
AAAAW6295Q
JANA SEVA TRUST
AACTJ0594Q
VAGDEVI VILAS EDUCATIONAL AND CHARITABLE TRUST
AABTV8264G
1 голос
/ 19 июня 2019

Вы пробовали с простым if условием?

const nextPage = await page.$$(".ms-paging > a");

if(nextPage && nextPage[i]){
  await nextPage[i].click();
  await page.waitForNavigation({waituntil:'networkidle0'});
}

Таким образом, он будет щелкать только при наличии кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...