diff --git a/hh_browser.py b/hh_browser.py index 2430907..5b3e84a 100644 --- a/hh_browser.py +++ b/hh_browser.py @@ -37,6 +37,15 @@ SUBMIT_BUTTONS = [ '[data-qa="vacancy-response-popup-form"] button[type="submit"]', 'button:has-text("Отправить")', ] +# Кнопки подтверждения во ВТОРОЙ модалке hh.ru: после клика «Отправить» +# иногда появляется модалка «Отклик будет отправлен» с кнопкой +# «Отправить отклик» — её нужно нажать ещё раз. +CONFIRM_BUTTONS = [ + 'button:has-text("Отправить отклик")', + 'button:has-text("Подтвердить")', + 'button:has-text("Да, отправить")', + '[data-qa="vacancy-response-confirm"]', +] # Живые браузерные контексты и страницы: {(user, account): ...} # Доступны ТОЛЬКО из браузерного потока. @@ -199,6 +208,26 @@ def _save_screenshot(page, screenshot_dir, vid): return None +def _click_second_confirm(page): + """После клика «Отправить» hh.ru иногда показывает вторую модалку + подтверждения («Отклик будет отправлен») — жмём и её. + Возвращает True, если вторая кнопка найдена и нажата.""" + try: + page.wait_for_timeout(1500) + except Exception: + return False + for sel in CONFIRM_BUTTONS: + try: + btn = page.locator(sel).first + if btn.is_visible(timeout=1500): + btn.click() + print(" ✓ Вторая модалка подтверждения — кнопка нажата") + return True + except Exception: + continue + return False + + def open_response_page(account_dir, user, account, vacancy, message, resume_id=None, screenshot_dir=None, submit=False): """Открывает вакансию, жмёт «Откликнуться», выбирает резюме, вставляет текст. @@ -277,6 +306,11 @@ def open_response_page(account_dir, user, account, vacancy, message, if not submitted: shot = _save_screenshot(page, screenshot_dir, vacancy["id"]) return False, "Не нашёл кнопку «Отправить» — проверьте скриншот", shot + # hh.ru иногда показывает вторую модалку подтверждения — жмём и её + try: + _click_second_confirm(page) + except Exception: + pass # Ждём подтверждение и снимаем скриншот результата. # После отправки hh.ru может закрыть модалку/перезагрузить страницу — # ловим любые ошибки, но браузер закрываем ВСЕГДА (finally). @@ -304,6 +338,11 @@ def confirm_send(user, account, vid): btn = page.locator(sel).first if btn.is_visible(timeout=3000): btn.click() + try: + # Вторая модалка подтверждения (если появилась) + _click_second_confirm(page) + except Exception: + pass try: page.wait_for_timeout(1500) except Exception: