Я очищаю веб-страницу, и мне нужно загрузить с этой страницы только те файлы, которые соответствуют определенным критериям. Как я могу добиться этого в кукловоде?
Я могу найти элемент с помощью селектора и получить нужные мне атрибуты с помощью page.$$eval
, но я не могу понять, как щелкнуть эту ссылку.
const sectionLinks = await page.$$eval('#mainsection a', aTags => aTags.map(a => a.innerText));
for (const sectionLink of sectionLinks) {
if (sectionLink.toUpperCase() == 'THEONEIWANT') {
console.info('download');
//this is where I want to click the link
}
}
Вы не получаете дескрипторы элементов. Вы возвращаете только их значение innerText
.
Что вы можете сделать, так это сначала получить все элементы, а затем перебрать их следующим образом:
const elements = await page.$$('#mainsection a');
for (const el of elements) {
const innerText = await page.evaluate(el => el.innerText, el);
if (innerText.toUpperCase() == 'THEONEIWANT') {
await el.click();
}
}
Это позволит просмотреть все элементы один за другим, прочитать их значение innerText
, проверить, соответствует ли условие, а затем щелкнуть по нему.
Оптимизация
Это может занять некоторое время, если ссылок много. Вы можете улучшить этот код, используя селектор, который соответствует тексту, который вы ищете (проверьте этот вопрос для получения дополнительной информации), или используя выражение, подобное следующему, чтобы проверить, соответствует ли условие на стороне клиента. Это сделает проверку сразу для всех элементов:
const shouldElementBeClicked = page.evaluate((...args) => args.map(el => el.innerText === '...'), ...elements);
Это приведет к массиву с логическим значением, сигнализирующим о том, удовлетворяет ли элемент в той же позиции в массиве elements
условию.