const puppeteer = require("puppeteer"); const luxon = require("luxon"); const fs = require("fs"); const path = require("path"); const dotenv = require("dotenv").config({ path: __dirname + "/.env" }); const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); const utils = require("./utils"); (async () => { console.log( `===========< STARTED ${utils.getPakistanStandardTime( luxon.DateTime.now() )} >=========` ); const syncDate = luxon.DateTime.now().toFormat("yyyy-MM-dd"); const screenshotDirectory = path.join(__dirname, `screenshots/psw/${syncDate}`); if (!fs.existsSync(screenshotDirectory)) { fs.mkdirSync(screenshotDirectory, { recursive: true }); } /** * loading config data */ const config = JSON.parse(fs.readFileSync(__dirname + "/config.json")); const environment = process.env["ENVIRONMENT"]; // launch browser and open page const chromeProfilePath = path.resolve( __dirname, config[environment]["chrome_profile_path"] ); const browser = await puppeteer.launch( utils.getBrowserConfig(chromeProfilePath, environment) ); const page = await browser.newPage(); await page.setViewport({ width: 1600, height: 900, }); // Inject CSS to show the cursor await page.evaluate(() => { const style = document.createElement("style"); style.innerHTML = "* { cursor: auto !important; }"; document.head.appendChild(style); }); await page.goto("https://www.google.com", { waitUntil: "domcontentloaded", timeout: 0 }); // wait for 3 sec console.log("Waiting 3 sec and taking screenshot"); await new Promise((resolve) => setTimeout(resolve, 3 * 1000)); // take screenshot let screenshotPath = path.join( screenshotDirectory, `${luxon.DateTime.now().toMillis()}.png` ); await page.screenshot({ path: screenshotPath, fullPage: true }); await page.goto( config[environment].psw_url, { waitUntil: "domcontentloaded", timeout: 0 }); // wait for 3 sec console.log("Waiting 3 sec and taking screenshot."); await new Promise((resolve) => setTimeout(resolve, 3 * 1000)); // take screenshot screenshotPath = path.join( screenshotDirectory, `${luxon.DateTime.now().toMillis()}.png` ); await page.screenshot({ path: screenshotPath, fullPage: true }); await page.waitForSelector("tbody tr.ItemStyle", { timeout: 30000 }); const data = await page.evaluate(() => { const rows = document.querySelectorAll( "tbody tr.ItemStyle, tbody tr.AlternatingItemStyle" ); return Array.from(rows).map(row => { const cells = row.querySelectorAll("td"); const finNo = cells[0]?.querySelector("label")?.innerText.trim() || cells[0]?.innerText.trim(); return { financialInstrumentNo: finNo, date: cells[1]?.innerText.trim(), authorizedDealer: cells[2]?.innerText.trim(), consigneeName: cells[3]?.innerText.trim(), invoiceValue: cells[4]?.innerText.trim(), currency: cells[6]?.innerText.trim(), status: cells[7]?.innerText.trim(), balance: cells[8]?.innerText.trim() }; }); }); // wait for 3 sec console.log("Waiting 3 sec and taking screenshot.."); await new Promise((resolve) => setTimeout(resolve, 3 * 1000)); // take screenshot screenshotPath = path.join( screenshotDirectory, `${luxon.DateTime.now().toMillis()}.png` ); await page.screenshot({ path: screenshotPath, fullPage: true }); const jsonDir = path.join(config[environment].psw_fi_invoices_path, "data/unprocessed"); fs.mkdirSync(jsonDir, { recursive: true }); const outputFile = path.join(jsonDir, `${luxon.DateTime.now().toMillis()}.json`); fs.writeFileSync(outputFile, JSON.stringify(data, null, 2)); console.log(`Saved JSON to ${outputFile}`); console.log("Waiting 5 sec and taking screenshot before closing browser..."); // wait for 5 sec await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); // take screenshot screenshotPath = path.join( screenshotDirectory, `${luxon.DateTime.now().toMillis()}.png` ); await page.screenshot({ path: screenshotPath, fullPage: true }); await page.close(); await browser.close(); })();