Извлечение данных из элементов с помощью puppeteer

#javascript #node.js #puppeteer

#javascript #node.js #puppeteer

Вопрос:

Мне нужно, чтобы программа щелкала по 10 элементам, после щелчка выполняла поиск селектора ( #txtProdDescricao ).

URL: wavenfe.com.br/viewria/nfeApplication/simple/produto.html

Данные для тестового доступа:
Логин: wave
Пароль: 1234

Я использую puppeteer, если добавлю код, подобный этому:

     const list = await page.$eval("tbody > tr > td:nth-child(1) > span > a", element => {
        const produtos = []
            element.forEach((element, index) => {
                dados = {}
                element.click()
                dados.nome = document.querySelector('#txtProdDesc').value
                dados.codigo = document.querySelector('#txtProdCodigo').value
                produtos.push(dados)
        })
        return produtos
    })
    console.log(list)
 

Он возвращает меня на консоль:

 [
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' },
  { nome: '', codigo: '3005' }
]
 

То есть он не нажимает на элементы и не переходит к следующему, чтобы получить новые данные.

Если случайно я попытаюсь напрямую через навигатор, это принесет мне тот же результат, который я напечатал выше. Однако в браузере, чтобы решить эту проблему, я просто помещаю setTimeout() . Но если я помещу setTimeout в puppeteer, консоль вернет меня [] .

Как мне заставить скрипт нажимать на каждый элемент и извлекать данные для этого конкретного продукта?

Может кто-нибудь мне помочь, пожалуйста, я новичок.

Комментарии:

1. Можете ли вы поделиться URL-адресом сайта, чтобы мы могли его попробовать? Возможно, вам придется подождать, пока что-то не произойдет, чтобы получить значение элемента. Трудно сказать, что происходит на вашем сайте.

2. Да! URL: wavenfe.com.br/viewria/nfeApplication/simple/produto.html Данные для тестового доступа: Логин: wave Пароль: 1234

Ответ №1:

Каждый раз, когда вы нажимаете на ссылку, страница отправляет запрос XHR, получает данные и обновляет входные данные. Поэтому вам нужно дождаться ответов или изменений входных значений. Но, возможно, самый простой вариант — правильно добавить тайм-ауты в асинхронный обратный вызов:

 // Make the callback async:
const list = await page.$eval("tbody > tr > td:nth-child(1) > span > a", async (element) => {
    const produtos = []
    // Use for...of loop:
    for (const elem of element) {
        dados = {}
        elem.click()
        // Add a timeout:
        await new Promise(resolve => setTimeout(resolve, 5000))
        // Go on:
        dados.nome = document.querySelector('#txtProdDesc').value
        dados.codigo = document.querySelector('#txtProdCodigo').value
        produtos.push(dados)
    }
    return produtos
})
console.log(list)