From 3a3d9f8d22ac938b9046e1f68f3f49edf1675b11 Mon Sep 17 00:00:00 2001 From: Marius Kavaliauskas Date: Tue, 20 May 2025 14:25:34 +0300 Subject: [PATCH 1/6] clearPopups after each page.goto --- src/core/Job.ts | 9 +++++++++ src/core/JobPost.ts | 3 +++ src/core/LoadBalancer.ts | 10 +++------- src/utils/pageUtils.ts | 27 +++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/core/Job.ts b/src/core/Job.ts index a6719ba..7736017 100644 --- a/src/core/Job.ts +++ b/src/core/Job.ts @@ -9,6 +9,7 @@ import { import { evaluate, isDevelopment } from "../utils/processUtils"; import Config from "../config/Config"; import { runPrompt } from "../utils/commandUtils"; +import { clearPopups } from "../utils/pageUtils"; import * as Puppeteer from "puppeteer"; import { Ora } from "ora"; // @ts-ignore 2023-11-24: https://github.com/enquirer/enquirer/issues/135 still not solved. @@ -125,9 +126,13 @@ export default class Job { `/plans/${jobID}/jobapp`, ); await this.page.goto(jobappURL); + await clearPopups(this.page); + const pageCount = await this.getPageCount(); for (let currentPage = 1; currentPage <= pageCount; currentPage++) { await this.page.goto(`${jobappURL}?page=${currentPage}`); + await clearPopups(this.page); + job.posts.push(...(await this.getJobPosts(job))); } return job; @@ -272,6 +277,7 @@ export default class Job { public async getJobName(jobID: number): Promise { const url = joinURL(this.config.greenhouseUrl, `/plans/${jobID}`); await this.page.goto(url); + await clearPopups(this.page); const jobTitleElement = await this.page.$(".job-name"); const jobAnchor = await jobTitleElement?.$("a"); @@ -296,6 +302,7 @@ export default class Job { `/alljobs/list?page=${page}`, ); await this.page.goto(url); + await clearPopups(this.page); const body = await this.page.$("body"); let innerHTML = await body?.evaluate((element) => element.innerHTML); @@ -392,6 +399,8 @@ export default class Job { `/jobapps/${postID}/edit`, ); await this.page.goto(url); + await clearPopups(this.page); + const jobElement = await this.page.$(".job-name"); if (!jobElement) throw new Error(`Job cannot be found in ${url}.`); return await getIDFromURL(jobElement, "a"); diff --git a/src/core/JobPost.ts b/src/core/JobPost.ts index 481250d..2844cfa 100644 --- a/src/core/JobPost.ts +++ b/src/core/JobPost.ts @@ -1,6 +1,7 @@ import { JobBoard, JobInfo, PostInfo } from "./types"; import { usaCities } from "../config/defaults"; import { + clearPopups, getCSRFToken, getIDFromURL, getInnerText, @@ -200,6 +201,7 @@ export default class JobPost { `/jobapps/${jobPost.id}/edit`, ); await this.page.goto(url1); + await clearPopups(this.page); const element = await this.page.$("*[data-react-class='JobPostsForm']"); if (!element) @@ -344,6 +346,7 @@ export default class JobPost { `/plans/${jobPost.job.id}/jobapp`, ); await this.page.goto(url); + await clearPopups(this.page); const csrfToken = await getCSRFToken(this.page); await sendRequest( diff --git a/src/core/LoadBalancer.ts b/src/core/LoadBalancer.ts index 9b8f99d..5d8236e 100644 --- a/src/core/LoadBalancer.ts +++ b/src/core/LoadBalancer.ts @@ -1,5 +1,6 @@ import { Application, Grader, JobToAssign, GraderRecord } from "./types"; import { UserError } from "../utils/processUtils"; +import { clearPopups } from "../utils/pageUtils"; import { green } from "colors"; import { Ora } from "ora"; import { Page } from "puppeteer"; @@ -289,13 +290,7 @@ export default class LoadBalancer { for (const job of this.jobs) { const url = this.buildUrl(job); await this.page.goto(url, { waitUntil: "networkidle0" }); - - const cookiesOkButton = await this.page.$( - `#footer [data-provides="inform-cookies-popup"] button`, - ); - if (cookiesOkButton) { - await cookiesOkButton.click(); - } + await clearPopups(this.page); await this.findUsername(); let page = 1; @@ -321,6 +316,7 @@ export default class LoadBalancer { await this.page.goto(url + `&page=${page}`, { waitUntil: "networkidle0", }); + await clearPopups(this.page); } } this.spinner.stop(); diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index a3e03cf..2acb914 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -85,3 +85,30 @@ export async function getIDFromURL( const urlParts: string[] = url.split("/"); return parseInt(urlParts[urlParts.length - 1]); } + +export async function clearPopups(page) { + const cookiesOkButton = await page.$( + `#footer [data-provides="inform-cookies-popup"] button`, + ); + if (cookiesOkButton) { + await cookiesOkButton.click(); + } + + // "join upcoming webinar popup" + // doesn't show up for everyone + const popupDismissButton = await page.$( + `button.bb-button._pendo-button-secondaryButton._pendo-button`, + ); + if (popupDismissButton) { + await popupDismissButton.click(); + } + + // "join upcoming webinar popup" + // doesn't show up for everyone + const popupCloseButton = await page.$( + `button._pendo-close-guide`, + ); + if (popupCloseButton) { + await popupCloseButton.click(); + } +} From 2781111071ae55f30e78163b1a3cf9b094c571e8 Mon Sep 17 00:00:00 2001 From: Marius Kavaliauskas Date: Tue, 20 May 2025 14:27:50 +0300 Subject: [PATCH 2/6] bump patch version --- package-lock.json | 4 ++-- package.json | 2 +- snap/snapcraft.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 264a450..f421095 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ght", - "version": "1.11.6", + "version": "1.11.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ght", - "version": "1.11.6", + "version": "1.11.7", "license": "MIT", "dependencies": { "@sentry/node": "7.88.0", diff --git a/package.json b/package.json index ef9d60e..7a8e97a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ght", - "version": "1.11.6", + "version": "1.11.7", "scripts": { "build": "tsc && cp package.json ght ./dist", "dev": "NODE_ENV=development ts-node ./src/index.ts", diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index a38c609..fb5309d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: ght -version: "1.11.6" +version: "1.11.7" license: GPL-3.0 summary: Perform actions in Canonical's Greenhouse automatically. description: An automated browser that does a set of tasks on Canonical's Greenhouse dashboard without the need of interaction with the UI. From 1f6a8b71ca56b119c9672ca791cb52ca82bf0a5e Mon Sep 17 00:00:00 2001 From: Marius Kavaliauskas Date: Tue, 20 May 2025 14:45:55 +0300 Subject: [PATCH 3/6] disable clearPopups in tests --- src/__tests__/Job.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/__tests__/Job.test.ts b/src/__tests__/Job.test.ts index 6ca38e3..32cb3c9 100644 --- a/src/__tests__/Job.test.ts +++ b/src/__tests__/Job.test.ts @@ -6,6 +6,7 @@ import Config from "../config/Config"; jest.mock("../utils/pageUtils", () => ({ ...jest.requireActual("../utils/pageUtils"), getIDFromURL: jest.fn().mockReturnValue(1), + clearPopups: jest.fn(), })); const config = new Config(); From 1f3e93fe23be29ac69b08583896f133417837ea5 Mon Sep 17 00:00:00 2001 From: Marius Kavaliauskas Date: Tue, 20 May 2025 15:29:57 +0300 Subject: [PATCH 4/6] abort pendo requests --- src/controllers/BaseController.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/controllers/BaseController.ts b/src/controllers/BaseController.ts index b74a06f..b915dc0 100644 --- a/src/controllers/BaseController.ts +++ b/src/controllers/BaseController.ts @@ -115,6 +115,14 @@ export abstract class BaseController { await this.screenRecorder.start(); } + await page.setRequestInterception(true); + page.on('request', request => { + if (request.url().includes('pendo')) { + request.abort(); + } + request.continue(); + }); + return { browser, page, From 3f30bbbb6d41e7f28fde2af146f656b359646d27 Mon Sep 17 00:00:00 2001 From: Marius Kavaliauskas Date: Tue, 20 May 2025 15:36:59 +0300 Subject: [PATCH 5/6] fix req intersept --- src/controllers/BaseController.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/BaseController.ts b/src/controllers/BaseController.ts index b915dc0..4040314 100644 --- a/src/controllers/BaseController.ts +++ b/src/controllers/BaseController.ts @@ -119,8 +119,9 @@ export abstract class BaseController { page.on('request', request => { if (request.url().includes('pendo')) { request.abort(); + } else { + request.continue(); } - request.continue(); }); return { From 67a438ab5461c36c3e894723873b2b368f4cd4e7 Mon Sep 17 00:00:00 2001 From: Marius Kavaliauskas Date: Tue, 20 May 2025 15:41:39 +0300 Subject: [PATCH 6/6] more specific request abort --- src/controllers/BaseController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/BaseController.ts b/src/controllers/BaseController.ts index 4040314..e30670c 100644 --- a/src/controllers/BaseController.ts +++ b/src/controllers/BaseController.ts @@ -117,7 +117,7 @@ export abstract class BaseController { await page.setRequestInterception(true); page.on('request', request => { - if (request.url().includes('pendo')) { + if (request.url().includes('pendo.io')) { request.abort(); } else { request.continue();