#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)