108 lines
4.2 KiB
JavaScript
108 lines
4.2 KiB
JavaScript
const puppeteer = require('puppeteer');
|
|
const IFRAME_SELECTOR = 'iframe[title="Hoofdinhoud"]';
|
|
const wait = require("./wait");
|
|
const config = require("./config.js");
|
|
|
|
//Er zijn een aantal helperfuncties die nog verwijderd moeten worden
|
|
//zo is de functie van de contentFrame te verwijderen want staat dubbel in evaluatestartpakket.js
|
|
//de iframeselector is eveneens van belang om te verwijderen want staat ook dubbel in evaluatestartpakket.js
|
|
|
|
|
|
|
|
async function coursesEnrolled(page) {
|
|
/*connection to local host
|
|
const browser = await puppeteer.connect({
|
|
browserURL: "http://localhost:9222", // Connect to the browser's debugging address
|
|
});
|
|
|
|
// Get all open pages (tabs)
|
|
const pages = await browser.pages();
|
|
console.log(`Found ${pages.length} open pages on the browser.`);
|
|
|
|
// Interact with the last tab (or any tab of choice)
|
|
let page = pages[pages.length - 1]; // Choose the last opened tab
|
|
console.log("Current URL:", page.url()); */
|
|
|
|
let contentFrame= await getContentFrame(page);
|
|
const uitvouwenButton = await contentFrame.$(config.uitvouwenSelector);
|
|
if (uitvouwenButton) {
|
|
await uitvouwenButton.click();
|
|
console.log("uitvouwen button clicked");
|
|
await wait(2000);
|
|
contentFrame= await getContentFrame(page)
|
|
}
|
|
|
|
//logic to collapse all sections except the one with the excluded title
|
|
const collapseArrows = await contentFrame.$$(config.collapsArrowSelector);
|
|
const excludedArrow = await contentFrame.$(config.excludeFromCollapsingSelector);
|
|
const excludedTbody = await excludedArrow.evaluate(el => el.closest('tbody'));
|
|
for (const arrow of collapseArrows) {
|
|
const isExcluded = await arrow.evaluate((el, excludedTbody) => {
|
|
const title = el.getAttribute('title');
|
|
const tbody = el.closest('tbody');
|
|
return title === 'Sectie samenvouwen AFSTUDEERVEREISTEN BACHELOR GESCHIEDENIS' || tbody === excludedTbody;
|
|
}, excludedTbody);
|
|
|
|
if (!isExcluded) {
|
|
const isStillInDOM = await arrow.evaluate(el => document.body.contains(el));
|
|
if (isStillInDOM) {
|
|
await arrow.click();
|
|
await wait(500); // Adjust the wait time as needed
|
|
}
|
|
}
|
|
}
|
|
|
|
contentFrame= await getContentFrame(page)
|
|
|
|
const rowData = await contentFrame.$$eval(
|
|
'span',
|
|
(spans) => {
|
|
const uniqueEntries = new Set();
|
|
return spans
|
|
.filter((span) => span.innerText.trim().includes('Academiejaar'))
|
|
.map((span) => {
|
|
const tr = span.closest('tr');
|
|
if (!tr) return null;
|
|
const tds = tr.querySelectorAll('td');
|
|
const getInnerHtml = (element) => {
|
|
const aElement = element.querySelector('a');
|
|
return aElement ? aElement.innerHTML.trim() : element.innerHTML.trim();
|
|
};
|
|
const studiegidsNummer = tds[0] ? getInnerHtml(tds[0].querySelector('span')) : '';
|
|
const opleidingsOnderdeel = tds[1] ? getInnerHtml(tds[1].querySelector('span')) : '';
|
|
const studiepunten = tds[2] ? getInnerHtml(tds[2].querySelector('span')) : '';
|
|
if (uniqueEntries.has(studiegidsNummer)) return null;
|
|
uniqueEntries.add(studiegidsNummer);
|
|
return {
|
|
studiegidsNummer,
|
|
opleidingsOnderdeel,
|
|
studiepunten,
|
|
};
|
|
})
|
|
.filter((entry) => entry);
|
|
}
|
|
);
|
|
|
|
const totalStudiepunten = sumStudiepunten(rowData);
|
|
return {rowData, totalStudiepunten};
|
|
|
|
}
|
|
|
|
function sumStudiepunten(rowData) {
|
|
return rowData.reduce((total, row) => {
|
|
const studiepunten = parseFloat(row.studiepunten) || 0;
|
|
return total + studiepunten;
|
|
}, 0);
|
|
}
|
|
|
|
async function getContentFrame(page) {
|
|
await page.waitForSelector(IFRAME_SELECTOR);
|
|
const iframe = await page.$(IFRAME_SELECTOR);
|
|
if (!iframe) {
|
|
throw new Error("Could not find iframe on the AA-page");
|
|
}
|
|
console.log("iframe found on AA-page");
|
|
return await iframe.contentFrame();
|
|
}
|
|
|
|
module.exports = coursesEnrolled; |