const puppeteer = require('puppeteer'); const { EDUFPMI_URL, EDUFPMI_USERNAME, EDUFPMI_PASSWORD, COURSE_URL } = process.env; const clickElementByXPath = (page, xPath) => page .waitForXPath(xPath) .then(item => item.click()); puppeteer.launch({ headless: true }) .then(async browser => { const page = await browser.newPage(); // Login await page.goto(EDUFPMI_URL, { waitUntil: 'networkidle0' }); await page.type('input#username', EDUFPMI_USERNAME); await page.type('input#password', EDUFPMI_PASSWORD); await page.click('button#loginbtn'); await page.waitForResponse(response => response.url().includes('index.php')); console.log(`Logged in as ${EDUFPMI_USERNAME}`); // Launch a meeting await page.goto(COURSE_URL, { waitUntil: 'networkidle0' }); await page.screenshot({ path: './screenshot1.png' }); const moodlePagePromise = new Promise(resolve => browser.on( 'targetcreated', target => resolve(target.page()) )); await page.click('input#join_button_input'); const moodlePage = await moodlePagePromise; // Join as "Listen only" await clickElementByXPath(moodlePage, '//span[contains(text(),"Listen only")]'); console.log('Joined the meeting'); // Wait 5 seconds await new Promise(resolve => setTimeout(resolve, 5000)); console.log('Time to leave!') // Leave audio and close the browser await clickElementByXPath(moodlePage, '//button[contains(@aria-label,"Leave audio")]'); await new Promise(resolve => setTimeout(resolve, 1500)); await browser.close(); console.log('Left the meeting'); }) .catch(e => console.log(e));