Я пытался очистить данные из таблицы, используя puppeteer
, но всегда получаю пустой массив. Пожалуйста, помогите, так как я новичок с puppeteer
и уже потратил на это много дней. Процесс следующий.
- вход на веб-сайт
- После входа открывается раздражающий баннер (иногда код застревает там)
- Перейдите на другую страницу, чтобы получить доступ к данным финансового отчета.
Нажмите кнопку (Оплаченные счета) и измените фильтр диапазона дат для загрузки данных, нажав кнопку Фильтр.
Очистите таблицу данных и воспроизведите ее в виде таблицы. (Позже это будет перемещено в базу данных)
Я пробовал много разных способов, и он возвращает пустой массив, или иногда консоль ничего не показывает.
Пожалуйста см. структуру данных на сайте.
<div class="scroll-wrapper" data-ng-init="reportController.adjustScroll()">
<div class="scroll-top">
<div class="dummy-div" style="width: 743px;">
<table class="table-report">
<thead>
<tr>
<th class="td-4 text-left" ng-class="{'active': reportController.propertyName === 'ContableAccount'}" ng-click="reportController.sortBy('ContableAccount')">
CONTA
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
<th class="td-7 text-left" ng-class="{'active': reportController.propertyName === 'Description'}" ng-click="reportController.sortBy('Description')">
DESCRIÇÃO
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
<th class="td-5 text-left" ng-class="{'active': reportController.propertyName === 'Supplier'}" ng-click="reportController.sortBy('Supplier')">
FORNECEDOR
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
<th class="td-3 text-left active" ng-class="{'active': reportController.propertyName === 'DueDate'}" ng-click="reportController.sortBy('DueDate')">
VENCIMENTO
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
<!-- ngIf: reportController.listParameters.Paid -->
<th class="td-3 text-left" ng-class="{'active': reportController.propertyName === 'Total'}" ng-click="reportController.sortBy('Total')">
TOTAL
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
<th class="td-3 text-left" ng-class="{'active': reportController.propertyName === 'Paid'}" ng-click="reportController.sortBy('Paid')">
PAGO
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
<th class="td-3 text-left" ng-class="{'active': reportController.propertyName === 'Balance'}" ng-click="reportController.sortBy('Balance')">
SALDO
<span class="sortorder sprite-report arrow-order-grey" ng-class="{reverse: reverse}"></span>
</th>
</tr>
</thead>
</table>
</div>
</div>
<div class="scroll-bottom">
<div class="content-div ng-isolate-scope" infinite-scroll="reportController.getMoreRecords()" infinite-scroll-distance="1">
<table class="table-report">
<tbody>
<!-- ngRepeat: item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse -->
<tr ng-repeat="item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse" class="ng-scope">
<td class="td-4 text-ellipsis ng-binding" title="Mercadoria para Revenda">Mercadoria para Revenda</td>
<td class="td-7 text-ellipsis ng-binding" title="Pedido de Compra Nº 1966">Pedido de Compra Nº 1966</td>
<td class="td-5 text-ellipsis ng-binding" title="Oderco Distribuidora Eletronicos Ltda">Oderco Distribuidora Eletronicos Ltda</td>
<td class="td-3 text-ellipsis ng-binding" title="27/05/2020">27/05/2020</td>
<!-- ngIf: reportController.listParameters.Paid -->
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 436,02">R$ 436,02</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 0,00">R$ 0,00</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 436,02">R$ 436,02</td>
</tr>
<!-- end ngRepeat: item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse -->
<tr ng-repeat="item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse" class="ng-scope">
<td class="td-4 text-ellipsis ng-binding" title="Mercadoria para Revenda">Mercadoria para Revenda</td>
<td class="td-7 text-ellipsis ng-binding" title="Pedido de Compra Nº 1965">Pedido de Compra Nº 1965</td>
<td class="td-5 text-ellipsis ng-binding" title="GIBSON SOLUÇÕES EM TECNOLOGIA LTDA">GIBSON SOLUÇÕES EM TECNOLOGIA LTDA</td>
<td class="td-3 text-ellipsis ng-binding" title="27/05/2020">27/05/2020</td>
<!-- ngIf: reportController.listParameters.Paid -->
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 480,52">R$ 480,52</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 0,00">R$ 0,00</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 480,52">R$ 480,52</td>
</tr>
<!-- end ngRepeat: item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse -->
<tr ng-repeat="item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse" class="ng-scope">
<td class="td-4 text-ellipsis ng-binding" title="Água">Água</td>
<td class="td-7 text-ellipsis ng-binding" title="SAAE">SAAE</td>
<td class="td-5 text-ellipsis ng-binding" title=""></td>
<td class="td-3 text-ellipsis ng-binding" title="27/05/2020">27/05/2020</td>
<!-- ngIf: reportController.listParameters.Paid -->
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 35,77">R$ 35,77</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 0,00">R$ 0,00</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 35,77">R$ 35,77</td>
</tr>
<!-- end ngRepeat: item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse -->
<tr ng-repeat="item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse" class="ng-scope">
<td class="td-4 text-ellipsis ng-binding" title="Mensalidade Escritório">Mensalidade Escritório</td>
<td class="td-7 text-ellipsis ng-binding" title="ESCRITORIO ITAPIRENSE">ESCRITORIO ITAPIRENSE</td>
<td class="td-5 text-ellipsis ng-binding" title=""></td>
<td class="td-3 text-ellipsis ng-binding" title="21/05/2020">21/05/2020</td>
<!-- ngIf: reportController.listParameters.Paid -->
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 240,00">R$ 240,00</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 0,00">R$ 0,00</td>
<td class="td-3 text-right text-ellipsis ng-binding" title="R$ 240,00">R$ 240,00</td>
</tr>
<!-- end ngRepeat: item in reportController.listDataLocal | orderBy:reportController.propertyName:reportController.reverse -->
</tbody>
</table>
<!-- ngIf: reportController.lastPage -->
<table class="table-report footer ng-scope" ng-if="reportController.lastPage">
<tbody>
<tr>
<td class="td-12 text-left" colspan="3">Exibindo <span class="number ng-binding">4</span> registros</td>
<td class="td-7"> </td>
<!-- ngIf: reportController.listParameters.Paid -->
<td class="td-3 ng-binding">R$ 1.192,31</td>
<td class="td-3 ng-binding">R$ 0,00</td>
<td class="td-3 ng-binding">R$ 1.192,31</td>
</tr>
</tbody>
</table>
<!-- end ngIf: reportController.lastPage -->
</div>
</div>
</div>
Это мой код кукловода с комментариями.
const puppeteer = require("puppeteer");
(async () => {
try {
const websiteUrl = "mySite.com";
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// prevent detection as robot
page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.0 Safari/537.36");
await page.goto(websiteUrl);
//set the browser to be in desktop size and do not hide the login menu
await page.setViewport({ width: 2400, height: 1171 });
await page.waitForSelector("#login§ds_login");
//Type login details using fields IDS
await page.type("#login§ds_login", "myUsername");
await page.type("#login§ds_password", "myPassword");
await Promise.all([page.waitForNavigation(), page.click("#login§bt_login")]);
await page.waitForSelector('button[title="Fechar"]');
await page.click('button[title="Fechar"]');
await page.goto("page-where-tableIs.com", { waitUntil: "domcontentloaded" });
// Click on Button that says Paid Bills
await page.waitForSelector(".filter > .filters-container > .alternate-buttons > .buttons-center > .btn:nth-child(2)");
await page.click(".filter > .filters-container > .alternate-buttons > .buttons-center > .btn:nth-child(2)");
// select Date Range and click on filter button
await page.waitForSelector(".action-bar-container > .filters-container > .filter-date > .from > .ng-pristine");
await page.type(".action-bar-container > .filters-container > .filter-date > .from > .ng-pristine", "01012020");
await page.type(".action-bar-container > .filters-container > .filter-date > .to > .ng-pristine", "01052020");
await page.click(".filters-container > .filter-date > .confirm-filter > button > .sprite-new-erp");
// IF SWTICH ON CONSOLE DOESNT LOG ANYTHING
// await page.waitForNavigation({
// waitUntil: "networkidle0"
// });
// I TRIED THIS AN ALTERNATIVE FOR THE ONE ABOVE AND IF TURNED ON NOTHING IS LOGGED TO CONSOLE
// await page.waitForSelector("tbody tr");
// Test Area (I've tried many codes as below and everything return an EMPTY ARRAY)
const test01 = await page.evaluate(() => Array.from(document.querySelectorAll("tbody tr")).map(partner => partner.textContent));
console.log(test01);
const test02 = await page.evaluate(() =>
Array.from(document.querySelectorAll("tbody tr")).map(rows => {
const getData = child => rows.querySelector(`.td-${child}`).getAttribute("title");
return [getData(2), getData(7), getData(5), getData(3), getData(7)];
})
);
console.log(test02);
const test03 = await page.evaluate(() =>
Array.from(document.querySelectorAll("tbody tr")).map(rows => {
const getData = child => rows.querySelector(`.td-5:nth-child(${child})`).getAttribute("title");
return [getData(2), getData(7), getData(5), getData(3), getData(7)];
})
);
console.log(test03);
const test04 = await page.evaluate(() =>
Array.from(document.querySelectorAll("tbody > tr")).map(rows => {
const getData = rows => team.querySelector(`td.td-${child}.text-ellipsis.ng-binding`).getAttribute("title");
return [getData(2), getData(7), getData(5), getData(3), getData(7)];
})
);
console.log(test04);
const test05 = page.evaluate(() => {
const rows = document.querySelectorAll(".table-report tr td");
return Array.from(rows, row => {
const columns = row.querySelectorAll(".table-report tr th");
return Array.from(columns, column => column.innerText);
});
});
console.log(test05);
const simpleTest = await page.evaluate(() => Array.from(document.querySelectorAll("tbody tr")));
console.log(simpleTest);
const simpletest2 = simpleTest.writeToJson();
console.log(simpletest2);
} catch (e) {
console.log("error", e);
}
await browser.close();
})();