debug: verbose step-by-step logging in easy_apply modal flow
This commit is contained in:
@@ -48,13 +48,29 @@ export async function apply(page, job, formFiller) {
|
|||||||
let lastProgress = '-1';
|
let lastProgress = '-1';
|
||||||
for (let step = 0; step < LINKEDIN_MAX_MODAL_STEPS; step++) {
|
for (let step = 0; step < LINKEDIN_MAX_MODAL_STEPS; step++) {
|
||||||
const modalStillOpen = await page.$(LINKEDIN_EASY_APPLY_MODAL_SELECTOR);
|
const modalStillOpen = await page.$(LINKEDIN_EASY_APPLY_MODAL_SELECTOR);
|
||||||
if (!modalStillOpen) return { status: 'submitted', meta };
|
if (!modalStillOpen) {
|
||||||
|
console.log(` ✅ Modal closed — submitted`);
|
||||||
|
return { status: 'submitted', meta };
|
||||||
|
}
|
||||||
|
|
||||||
const progress = await page.$eval('[role="progressbar"]',
|
const progress = await page.$eval('[role="progressbar"]',
|
||||||
el => el.getAttribute('aria-valuenow') || el.getAttribute('value') || String(el.style?.width || step)
|
el => el.getAttribute('aria-valuenow') || el.getAttribute('value') || String(el.style?.width || step)
|
||||||
).catch(() => String(step));
|
).catch(() => String(step));
|
||||||
|
|
||||||
|
// Snapshot all buttons visible in modal for debugging
|
||||||
|
const modalButtons = await page.evaluate((sel) => {
|
||||||
|
const modal = document.querySelector(sel);
|
||||||
|
if (!modal) return [];
|
||||||
|
return Array.from(modal.querySelectorAll('button, [role="button"]')).map(b => ({
|
||||||
|
text: b.textContent?.trim().slice(0, 40),
|
||||||
|
aria: b.getAttribute('aria-label'),
|
||||||
|
disabled: b.disabled,
|
||||||
|
})).filter(b => b.text || b.aria);
|
||||||
|
}, LINKEDIN_EASY_APPLY_MODAL_SELECTOR).catch(() => []);
|
||||||
|
console.log(` [step ${step}] progress=${progress} buttons=${JSON.stringify(modalButtons)}`);
|
||||||
|
|
||||||
const unknowns = await formFiller.fill(page, formFiller.profile.resume_path);
|
const unknowns = await formFiller.fill(page, formFiller.profile.resume_path);
|
||||||
|
if (unknowns.length > 0) console.log(` [step ${step}] unknown fields: ${JSON.stringify(unknowns.map(u => u.label))}`);
|
||||||
|
|
||||||
if (unknowns[0]?.honeypot) {
|
if (unknowns[0]?.honeypot) {
|
||||||
await page.click(LINKEDIN_DISMISS_SELECTOR, { timeout: DISMISS_TIMEOUT }).catch(() => {});
|
await page.click(LINKEDIN_DISMISS_SELECTOR, { timeout: DISMISS_TIMEOUT }).catch(() => {});
|
||||||
@@ -70,18 +86,21 @@ export async function apply(page, job, formFiller) {
|
|||||||
|
|
||||||
const hasSubmit = await page.$(LINKEDIN_SUBMIT_SELECTOR);
|
const hasSubmit = await page.$(LINKEDIN_SUBMIT_SELECTOR);
|
||||||
if (hasSubmit) {
|
if (hasSubmit) {
|
||||||
|
console.log(` [step ${step}] clicking Submit`);
|
||||||
await page.click(LINKEDIN_SUBMIT_SELECTOR, { timeout: APPLY_CLICK_TIMEOUT });
|
await page.click(LINKEDIN_SUBMIT_SELECTOR, { timeout: APPLY_CLICK_TIMEOUT });
|
||||||
await page.waitForTimeout(SUBMIT_WAIT);
|
await page.waitForTimeout(SUBMIT_WAIT);
|
||||||
return { status: 'submitted', meta };
|
return { status: 'submitted', meta };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress === lastProgress && step > 2) {
|
if (progress === lastProgress && step > 2) {
|
||||||
|
console.log(` [step ${step}] stuck — progress unchanged at ${progress}`);
|
||||||
await page.click(LINKEDIN_DISMISS_SELECTOR, { timeout: DISMISS_TIMEOUT }).catch(() => {});
|
await page.click(LINKEDIN_DISMISS_SELECTOR, { timeout: DISMISS_TIMEOUT }).catch(() => {});
|
||||||
return { status: 'stuck', meta };
|
return { status: 'stuck', meta };
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasNext = await page.$(LINKEDIN_NEXT_SELECTOR);
|
const hasNext = await page.$(LINKEDIN_NEXT_SELECTOR);
|
||||||
if (hasNext) {
|
if (hasNext) {
|
||||||
|
console.log(` [step ${step}] clicking Next`);
|
||||||
await page.click(LINKEDIN_NEXT_SELECTOR, { timeout: APPLY_CLICK_TIMEOUT }).catch(() => {});
|
await page.click(LINKEDIN_NEXT_SELECTOR, { timeout: APPLY_CLICK_TIMEOUT }).catch(() => {});
|
||||||
await page.waitForTimeout(CLICK_WAIT);
|
await page.waitForTimeout(CLICK_WAIT);
|
||||||
lastProgress = progress;
|
lastProgress = progress;
|
||||||
@@ -90,12 +109,14 @@ export async function apply(page, job, formFiller) {
|
|||||||
|
|
||||||
const hasReview = await page.$(LINKEDIN_REVIEW_SELECTOR);
|
const hasReview = await page.$(LINKEDIN_REVIEW_SELECTOR);
|
||||||
if (hasReview) {
|
if (hasReview) {
|
||||||
|
console.log(` [step ${step}] clicking Review`);
|
||||||
await page.click(LINKEDIN_REVIEW_SELECTOR, { timeout: APPLY_CLICK_TIMEOUT }).catch(() => {});
|
await page.click(LINKEDIN_REVIEW_SELECTOR, { timeout: APPLY_CLICK_TIMEOUT }).catch(() => {});
|
||||||
await page.waitForTimeout(CLICK_WAIT);
|
await page.waitForTimeout(CLICK_WAIT);
|
||||||
lastProgress = progress;
|
lastProgress = progress;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(` [step ${step}] no Next/Review/Submit found — breaking`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user