@beardworf

Как пропушить данные в массив?

Существует массив arrLinks
var arrLinks = [];
const puppeteer = require('puppeteer');


Далее идет описание функции main()
async function main() {

    let URL = 'https://www.ozon.ru/category/telefony-i-smart-chasy-15501/';

    const browser = await puppeteer.launch({
        headless: false,
        args: [
            '--start-maximized'
        ]
    });

    const page = await browser.newPage();
    await page.setViewport({
        width: 1366,
        height: 768
    });

    await page.goto(URL);
    await page.waitFor(4000);

    await autoScroll(page, arrLinks);
    await page.waitFor(4000);
    
    // скроллит страницу вниз и вызывает функцию, которая записывает ссылки пагинаций в массив
    async function autoScroll(page, arrLinks) {
        await page.evaluate(async () => {
            await new Promise((resolve) => {
                var totalHeight = 0;
                var distance = 130;
                var timer = setInterval(() => {
                    var scrollHeight = document.body.scrollHeight;
                    window.scrollBy(0, distance);
                    totalHeight += distance;

                    if(totalHeight >= scrollHeight){
                        clearInterval(timer);
                        resolve();
                    }
                }, 100);
            });
        });

        await page.waitFor(5000);
        console.log(arrLinks);
        await getPaginationLinks(page, arrLinks);
        console.log(arrLinks);
      
    }


    async function getPaginationLinks(page, arrLinks) {
        await page.evaluate((arrLinks) => {
            
            const paginationContainer = document.querySelector('#__layout > div > div.block-vertical > div.container > div:nth-child(2) > div:nth-child(2) > div:nth-child(3) > div:nth-child(3) > div[data-test-id="pagination-container-bottom"]');
            const paginationElements = Array.from(paginationContainer.querySelectorAll('a[data-test-id="pagination-item"]'));
            paginationElements.forEach(paginationElement => {
                arrLinks.push(paginationElement.href);
            });
        }, arrLinks);   
    }
}

Ну и сам вызов функции main()
main();

Смысл в том, что при вызове main прога идет по url и вызывает функцию скролла страницы, передавая пустой массив arrLinks, после того, как вся страница проскроллиться, я через консоль проверяю содержание массива arrLinks и он пустой, как и должно быть. Следующей строкой вызываю функцию getPaginationLinks(), где перебираю массив paginationElements и на каждую итерацию пушу ссылку каждого элемента массива, после чего функция заканчивает работу. Но массив как был пустой, так и не пропушил в себя значения, которые были указаны в функции. В чем тут косяк?
  • Вопрос задан
  • 181 просмотр
Пригласить эксперта
Ответы на вопрос 1
Krasnodar_etc
@Krasnodar_etc
fundraiseup
А попробуйте вернуть промис, который возвращается из evaluate в функции getPaginationLinks
// async можно убрать в таком случае
function getPaginationLinks(page, arrLinks) {
        return page.evaluate((arrLinks) => {
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы