diff --git a/lib/apply/ashby.mjs b/lib/apply/ashby.mjs index 1e0b3ec..0650754 100644 --- a/lib/apply/ashby.mjs +++ b/lib/apply/ashby.mjs @@ -15,15 +15,14 @@ export async function apply(page, job, formFiller) { verifySelector: '#_systemfield_name', beforeSubmit: async (page, formFiller) => { if (!formFiller.profile.resume_path) return; - // Ashby wraps resume upload in a custom component — find the actual file input - const fileInput = await page.$('#_systemfield_resume input[type="file"]') || - await page.$('input[type="file"][name*="resume"]') || + // #_systemfield_resume IS the file input (not a container) + const fileInput = await page.$('input[type="file"]#_systemfield_resume') || await page.$('input[type="file"]'); if (fileInput) { const hasFile = await fileInput.evaluate(el => !!el.value); if (!hasFile) { await fileInput.setInputFiles(formFiller.profile.resume_path).catch(() => {}); - await page.waitForTimeout(1500); + await page.waitForTimeout(2000); } } }, diff --git a/lib/form_filler.mjs b/lib/form_filler.mjs index b8f9eb6..6808dc7 100644 --- a/lib/form_filler.mjs +++ b/lib/form_filler.mjs @@ -573,12 +573,17 @@ Answer:`; const radios = await container.$$('input[type="radio"][aria-label*="resume"], input[type="radio"][aria-label*="Resume"]'); if (radios[0]) await radios[0].click().catch(() => {}); } else if (snap.resumeRadios.length === 0 && snap.hasFileInput && resumePath) { - const fileInput = await container.$('input[type="file"]'); - if (fileInput) { - // Skip if the file input doesn't accept our resume format (e.g. image-only uploads) - const accept = await fileInput.getAttribute('accept').catch(() => '') || ''; + // Prefer resume-specific file inputs, skip autofill inputs + const fileInput = await container.$('input[type="file"]#resume') || + await container.$('input[type="file"]#_systemfield_resume') || + await container.$('input[type="file"][id*="resume" i]') || + await container.$('input[type="file"][name*="resume" i]'); + // Fallback to first non-autofill file input + const target = fileInput || await container.$('input[type="file"]:not([class*="autofill"])'); + if (target) { + const accept = await target.getAttribute('accept').catch(() => '') || ''; const acceptsResume = !accept || /pdf|doc|docx/i.test(accept); - if (acceptsResume) await fileInput.setInputFiles(resumePath).catch(() => {}); + if (acceptsResume) await target.setInputFiles(resumePath).catch(() => {}); } }