Перебирайте ссылки на странице и нажимайте в зависимости от условия - PullRequest
1 голос
/ 22 мая 2019

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

Я могу найти элемент с помощью селектора и получить нужные мне атрибуты, используя 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.log('download');
      //this is where I want to click the link
    }
  }

1 Ответ

1 голос
/ 22 мая 2019

Вы не получаете ручки элемента. Вы только возвращаете их 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 условию.

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