Нажмите на каждый тег 'a' на странице кукловода - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь заставить кукловода перейти ко всем тегам на странице и загрузить их, добавить их в массив и вернуть. Моя версия кукловода - 1.5.0. Вот мой код:

module.exports.scrapeLinks = async (page, linkXpath) => {

    page.waitForNavigation();
    linksElement = await page.$x(linkXpath);
    var url_list_arr = [];
    console.log(linksElement.length);
    i=1;
    for(linksElementItem in linksElement)
    {
        const linksData = await page.$x('(' + linkXpath + ')[' + (i + 1) +']');
        if (linksData.length > 0) {
            linksData[0].click();
            console.log(page.url());
            url_list_arr.push(page.url());
        } 
        else {
          throw new Error('Link not found');
        }



    }

    return url_list_arr;

};

Однако с этим кодом я получаю

UnhandledPromiseRejectionWarning: Ошибка: узел либо не виден, либо не HTMLElement

Я также узнал через документы, что невозможно использовать xpath для функции page.click. Есть ли способ достичь этого?

Также нормально, если есть функция для получения всей ссылки со страницы, но я не смог найти ее в документации.

1 Ответ

0 голосов
/ 25 июня 2018

Чтобы получить дескриптор для всех a тегов в массиве:

const aTags= await page.$$('a')

Перебрать их с помощью:

for (const aTag of aTags) {...}

Внутри цикла вы можете взаимодействовать с каждым из них elementHandle отдельно.

Обратите внимание, что

await aTag.click()

уничтожит (сборщик мусора) все elementHandles при переходе по контексту страницы. В этом случае вам нужен обходной путь, такой как загрузка начальной страницы внутри цикла, чтобы всегда начинать с нового экземпляра.

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