Ожидание открытия и очистки iframe слишком медленно для очистки js

Я пытаюсь очистить старый веб-сайт, созданный с помощью tr, br и iframe. До сих пор все шло хорошо, прежде чем я начал хотеть извлекать данные из iframe, см. iFrameScraping setTimeout, но щелчок слишком быстрый, чтобы я мог получить данные. Кто-нибудь знает, как щелкнуть, дождаться отображения содержимого и его очистки, а затем продолжить?

  const newResult = await page.evaluate(async(resultLength) => {
    const elements = document.getElementsByClassName('class');

    for(i = 0; i < resultLength; i++) {
      const companyArray = elements[i].innerHTML.split('<br>');
      let companyStreet,
          companyPostalCode;

      // Get company name
      const memberNumber = elements[i].getElementsByTagName('a')[0].getAttribute('href').match(/[0-9]{1,5}/)[0];
      const companyName = await companyArray[0].replace(/<a[^>]*><span[^>]*><\/span>/, '').replace(/<\/a>/, '');
      const companyNumber = await companyArray[0].match(/[0-9]{6,8}/) ? companyArray[0].match(/[0-9]{6,8}/)[0] : '';

      // Get town name
      const companyTown = await companyArray[1].replace('"', '');

      // Get region name
      const companyRegion = await companyArray[2].replace(/<span[^>]*>Some text:<\/span>/, '');

      // Get phone number
      const telNumber = await elements[i].innerHTML.substring(elements[i].innerHTML.lastIndexOf('</span>')).replace('</span>', '').replace('<br>', '');


      const iFrameScraping = await setTimeout(async({elements, i}) => {
        elements[i].getElementsByTagName('a')[0].click();
        const iFrameContent = await document.getElementById('some-id').contentWindow.document.getElementById('lblAdresse').innerHTML.split('<br>');
        companyStreet = iFrameContent[0].replace('"', '');
        companyPostalCode = iFrameContent[2].replace('"', '');
      }, 2000, {elements, i});

      console.log(companyStreet, companyPostalCode)
    };
  }, pageSearchResults.length);

person Jean-Baptiste    schedule 31.01.2018    source источник


Ответы (1)


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

Я добавляю, чтобы остановить получение всех данных с помощью цикла из оценки, потому что это будет быстро и создаст состояние гонки. Вместо этого я использовал комбинацию page.$$ и цикла for…of. Обратите внимание, что forEach из es6 также вызывают состояние гонки, так как puppeteer не ждет их окончания, чтобы продолжить выполнение.

Вот пример из моего обновленного кода:

 const companies = await page.$$('.repmbr_result_item');
  const companiesLinks = await page.$$('.repmbr_result_item a');

  for(company of companies) {
    const companyEl = await page.evaluate(el => el.innerHTML, company)
    const companyElArray = companyEl.split('<br>');
person Jean-Baptiste    schedule 07.02.2018