per-step screenshot + html snapshots, matches-only list, full German UI, CSV export
* apply: Recorder.step_snap(page, name) captures both a JPEG screenshot and the page HTML for every major moment; every provider now calls step_snap at each logical step so failure reports contain the exact DOM and rendered state at every stage of the flow * ZIP report: each snapshot becomes snapshots/NN_<label>.jpg + snapshots/NN_<label>.html for AI-assisted debugging * web: Wohnungsliste zeigt nur noch Flats, die die eigenen Filter treffen; Match-Chip entfernt (Liste ist jetzt implizit matchend) * UI komplett auf Deutsch: Protokoll statt Logs, Administrator statt admin, Trockenmodus statt dry-run, Automatik pausiert statt circuit open, Alarm statt Alert, Abmelden statt Logout * Wohnungen-Header: Zeile 1 Info (Alarm + Filter), Zeile 2 Schalter mit echten Radio-Paaren (An/Aus) für Automatisch bewerben und Trockenmodus; hx-confirm auf den kritischen Radios; per-form CSS für sichtbaren Check-State * Protokoll: von/bis-Datumsfilter (Berliner Zeit) + CSV-Download (/logs/export.csv) mit UTC + lokaler Zeit Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
04b591fa9e
commit
7444f90d6a
16 changed files with 360 additions and 202 deletions
|
|
@ -17,29 +17,34 @@ class Degewo(Provider):
|
|||
r = ctx.recorder
|
||||
p = ctx.profile
|
||||
async with open_page(url, recorder=r) as page:
|
||||
r.step("cookies.check")
|
||||
await r.step_snap(page, "cookies.check")
|
||||
cookie_accept_btn = page.locator("#cookie-consent-submit-all")
|
||||
if await cookie_accept_btn.is_visible():
|
||||
await cookie_accept_btn.click()
|
||||
r.step("cookies.accepted")
|
||||
await r.step_snap(page, "cookies.accepted")
|
||||
|
||||
r.step("page.404_check")
|
||||
await r.step_snap(page, "page.404_check")
|
||||
if page.url == "https://www.degewo.de/immosuche/404":
|
||||
await r.step_snap(page, "abort.not_found", status="warn")
|
||||
return ApplicationResult(False, message=_("ad_offline"))
|
||||
|
||||
r.step("ad.deactivated_check")
|
||||
await r.step_snap(page, "ad.deactivated_check")
|
||||
if await page.locator("span", has_text="Inserat deaktiviert").is_visible():
|
||||
await r.step_snap(page, "abort.deactivated", status="warn")
|
||||
return ApplicationResult(False, message=_("ad_deactivated"))
|
||||
|
||||
r.step("page.moved_check")
|
||||
await r.step_snap(page, "page.moved_check")
|
||||
if await page.locator("h1", has_text="Diese Seite ist umgezogen!").is_visible():
|
||||
await r.step_snap(page, "abort.moved", status="warn")
|
||||
return ApplicationResult(False, message=_("ad_offline"))
|
||||
|
||||
r.step("form.open"); await page.get_by_role("link", name="Kontakt").click()
|
||||
r.step("iframe.locate")
|
||||
await r.step_snap(page, "form.open")
|
||||
await page.get_by_role("link", name="Kontakt").click()
|
||||
|
||||
await r.step_snap(page, "iframe.locate")
|
||||
form_frame = page.frame_locator("iframe[src*='wohnungshelden']")
|
||||
|
||||
r.step("form.fill_personal")
|
||||
await r.step_snap(page, "form.fill_personal")
|
||||
await form_frame.locator("#salutation").fill(p.salutation)
|
||||
await form_frame.get_by_role("option", name=p.salutation, exact=True).click()
|
||||
await form_frame.locator("#firstName").fill(p.firstname)
|
||||
|
|
@ -49,11 +54,11 @@ class Degewo(Provider):
|
|||
await form_frame.locator("input[title='Anzahl einziehende Personen']").fill(str(p.person_count))
|
||||
await page.wait_for_timeout(1000)
|
||||
|
||||
r.step("form.wbs_section")
|
||||
await r.step_snap(page, "form.wbs_section")
|
||||
wbs_question = form_frame.locator("input[id*='wbs_available'][id$='Ja']")
|
||||
if await wbs_question.is_visible():
|
||||
if not p.is_possessing_wbs:
|
||||
r.step("wbs_required_abort", "warn")
|
||||
await r.step_snap(page, "wbs_required_abort", status="warn")
|
||||
return ApplicationResult(False, _("wbs_required"))
|
||||
await wbs_question.click()
|
||||
await form_frame.locator("input[title='WBS gültig bis']").fill(p.wbs_valid_till_dt().strftime("%d.%m.%Y"))
|
||||
|
|
@ -66,24 +71,26 @@ class Degewo(Provider):
|
|||
await form_frame.locator("ng-select[id*='fuer_wen_ist_wohnungsanfrage']").click()
|
||||
await page.wait_for_timeout(1000)
|
||||
await form_frame.get_by_role("option", name="Für mich selbst").click()
|
||||
await r.step_snap(page, "form.filled")
|
||||
|
||||
if not ctx.submit_forms:
|
||||
r.step("submit.dry_run")
|
||||
await r.step_snap(page, "submit.dry_run")
|
||||
return ApplicationResult(success=True, message=_("application_success_dry"))
|
||||
|
||||
r.step("submit.click"); await form_frame.locator("button[data-cy*='btn-submit']").click()
|
||||
await r.step_snap(page, "submit.click")
|
||||
await form_frame.locator("button[data-cy*='btn-submit']").click()
|
||||
await page.wait_for_timeout(3000)
|
||||
|
||||
r.step("success.check")
|
||||
await r.step_snap(page, "success.check")
|
||||
if await page.locator("h4", has_text="Vielen Dank für das Übermitteln Ihrer Informationen. Sie können dieses Fenster jetzt schließen.").is_visible():
|
||||
return ApplicationResult(success=True)
|
||||
elif await self._missing_fields_warning(page):
|
||||
r.step("missing_fields_detected", "warn")
|
||||
await r.step_snap(page, "missing_fields_detected", status="warn")
|
||||
return ApplicationResult(success=False, message=_("missing_fields"))
|
||||
elif await self._already_applied_warning(page):
|
||||
r.step("already_applied_detected", "warn")
|
||||
await r.step_snap(page, "already_applied_detected", status="warn")
|
||||
return ApplicationResult(success=False, message=_("already_applied"))
|
||||
r.step("success.not_found", "warn")
|
||||
await r.step_snap(page, "success.not_found", status="warn")
|
||||
return ApplicationResult(success=False, message=_("submit_conformation_msg_not_found"))
|
||||
|
||||
async def _already_applied_warning(self, page) -> bool:
|
||||
|
|
|
|||
|
|
@ -21,37 +21,42 @@ class Gesobau(Provider):
|
|||
return ApplicationResult(False, _("missing_fields"))
|
||||
|
||||
async with open_page(url, recorder=r) as page:
|
||||
r.step("extract.immomio_link")
|
||||
await r.step_snap(page, "extract.immomio_link")
|
||||
immomio_link = await page.get_by_role("link", name="Jetzt bewerben").get_attribute("href")
|
||||
|
||||
r.step("auth.goto"); await page.goto("https://tenant.immomio.com/de/auth/login")
|
||||
await r.step_snap(page, "auth.goto")
|
||||
await page.goto("https://tenant.immomio.com/de/auth/login")
|
||||
await page.wait_for_timeout(1000)
|
||||
|
||||
r.step("auth.login")
|
||||
await r.step_snap(page, "auth.login")
|
||||
await page.locator('input[name="email"]').fill(p.immomio_email)
|
||||
await page.get_by_role("button", name="Anmelden").click()
|
||||
await page.wait_for_timeout(1000)
|
||||
await page.locator("#password").fill(p.immomio_password)
|
||||
await page.locator("#kc-login").click()
|
||||
await page.wait_for_timeout(1000)
|
||||
await r.step_snap(page, "auth.done")
|
||||
|
||||
r.step("back.to_immomio", detail=immomio_link or "")
|
||||
await r.step_snap(page, "back.to_immomio", detail=immomio_link or "")
|
||||
await page.goto(immomio_link)
|
||||
await page.wait_for_timeout(1000)
|
||||
|
||||
r.step("cookies.check")
|
||||
await r.step_snap(page, "cookies.check")
|
||||
cookie_accept_btn = page.get_by_role("button", name="Alle erlauben")
|
||||
if await cookie_accept_btn.is_visible():
|
||||
await cookie_accept_btn.click()
|
||||
await r.step_snap(page, "cookies.accepted")
|
||||
|
||||
r.step("apply.click"); await page.get_by_role("button", name="Jetzt bewerben").click()
|
||||
await r.step_snap(page, "apply.click")
|
||||
await page.get_by_role("button", name="Jetzt bewerben").click()
|
||||
await page.wait_for_timeout(3000)
|
||||
await r.step_snap(page, "apply.clicked")
|
||||
|
||||
r.step("already_applied.check")
|
||||
await r.step_snap(page, "already_applied.check")
|
||||
if page.url == "https://tenant.immomio.com/de/properties/applications":
|
||||
return ApplicationResult(False, message=_("already_applied"))
|
||||
|
||||
r.step("answer_questions.click")
|
||||
await r.step_snap(page, "answer_questions.click")
|
||||
answer_questions_btn = page.get_by_role("button", name="Fragen beantworten")
|
||||
if await answer_questions_btn.is_visible():
|
||||
await answer_questions_btn.click()
|
||||
|
|
@ -61,9 +66,9 @@ class Gesobau(Provider):
|
|||
await answer_questions_btn.click()
|
||||
await page.wait_for_timeout(2000)
|
||||
|
||||
r.step("success.check")
|
||||
await r.step_snap(page, "success.check")
|
||||
if not await answer_questions_btn.is_visible():
|
||||
return ApplicationResult(True)
|
||||
|
||||
r.step("success.not_found", "warn")
|
||||
await r.step_snap(page, "success.not_found", status="warn")
|
||||
return ApplicationResult(False, _("submit_conformation_msg_not_found"))
|
||||
|
|
|
|||
|
|
@ -17,31 +17,36 @@ class Gewobag(Provider):
|
|||
r = ctx.recorder
|
||||
p = ctx.profile
|
||||
async with open_page(url, recorder=r) as page:
|
||||
r.step("cookies.check")
|
||||
await r.step_snap(page, "cookies.check")
|
||||
btn = page.get_by_text("Alle Cookies akzeptieren")
|
||||
if await btn.is_visible():
|
||||
await btn.click()
|
||||
r.step("cookies.accepted")
|
||||
await r.step_snap(page, "cookies.accepted")
|
||||
|
||||
r.step("ad.exists_check")
|
||||
await r.step_snap(page, "ad.exists_check")
|
||||
if await page.get_by_text("Mietangebot nicht gefunden").first.is_visible():
|
||||
await r.step_snap(page, "abort.not_found", status="warn")
|
||||
return ApplicationResult(False, message=_("not_found"))
|
||||
|
||||
r.step("ad.still_open_check")
|
||||
await r.step_snap(page, "ad.still_open_check")
|
||||
if await page.locator('#immo-mediation-notice').is_visible():
|
||||
await r.step_snap(page, "abort.deactivated", status="warn")
|
||||
return ApplicationResult(False, message=_("ad_deactivated"))
|
||||
|
||||
r.step("form.open"); await page.get_by_role("button", name="Anfrage senden").first.click()
|
||||
await r.step_snap(page, "form.open")
|
||||
await page.get_by_role("button", name="Anfrage senden").first.click()
|
||||
|
||||
r.step("form.senior_check")
|
||||
await r.step_snap(page, "form.senior_check")
|
||||
if await self._is_senior_flat(page):
|
||||
await r.step_snap(page, "abort.senior_flat", status="warn")
|
||||
return ApplicationResult(False, _("senior_flat"))
|
||||
|
||||
r.step("form.special_wbs_check")
|
||||
await r.step_snap(page, "form.special_wbs_check")
|
||||
if await self._is_special_needs_wbs(page):
|
||||
await r.step_snap(page, "abort.special_wbs", status="warn")
|
||||
return ApplicationResult(False, _("special_need_wbs_flat"))
|
||||
|
||||
r.step("iframe.locate")
|
||||
await r.step_snap(page, "iframe.locate")
|
||||
form_iframe = page.frame_locator("#contact-iframe")
|
||||
|
||||
async def fill_field(locator, filling):
|
||||
|
|
@ -73,7 +78,7 @@ class Gewobag(Provider):
|
|||
await sec.locator("input[type='file']").set_input_files(files)
|
||||
await page.wait_for_timeout(2000)
|
||||
|
||||
r.step("form.fill_personal")
|
||||
await r.step_snap(page, "form.fill_personal")
|
||||
await select_field("#salutation-dropdown", p.salutation)
|
||||
await fill_field("#firstName", p.firstname)
|
||||
await fill_field("#lastName", p.lastname)
|
||||
|
|
@ -87,7 +92,7 @@ class Gewobag(Provider):
|
|||
await fill_field("input[id*='anzahl_kinder']", str(p.children_count))
|
||||
await fill_field("input[id*='gesamtzahl_der_einziehenden_personen']", str(p.person_count))
|
||||
|
||||
r.step("form.wbs_fill")
|
||||
await r.step_snap(page, "form.wbs_fill")
|
||||
await check_checkbox("[data-cy*='wbs_available'][data-cy*='-Ja']")
|
||||
await fill_field("input[id*='wbs_valid_until']", p.wbs_valid_till_dt().strftime("%d.%m.%Y"))
|
||||
await select_field("input[id*='wbs_max_number_rooms']", f"{p.wbs_rooms} Räume")
|
||||
|
|
@ -96,21 +101,23 @@ class Gewobag(Provider):
|
|||
await fill_field("input[id*='telephone_number']", p.telephone)
|
||||
await check_checkbox("input[id*='datenschutzhinweis']")
|
||||
await upload_files("el-application-form-document-upload", files=None)
|
||||
await r.step_snap(page, "form.filled")
|
||||
|
||||
if not ctx.submit_forms:
|
||||
r.step("submit.dry_run")
|
||||
await r.step_snap(page, "submit.dry_run")
|
||||
return ApplicationResult(True, _("application_success_dry"))
|
||||
|
||||
r.step("submit.click"); await form_iframe.get_by_role("button", name="Anfrage versenden").click()
|
||||
await r.step_snap(page, "submit.click")
|
||||
await form_iframe.get_by_role("button", name="Anfrage versenden").click()
|
||||
await page.wait_for_timeout(5000)
|
||||
|
||||
r.step("success.check", detail=page.url)
|
||||
await r.step_snap(page, "success.check", detail=page.url)
|
||||
if page.url.startswith("https://www.gewobag.de/daten-uebermittelt/"):
|
||||
return ApplicationResult(True)
|
||||
elif await self._is_missing_fields_warning(page):
|
||||
r.step("missing_fields_detected", "warn")
|
||||
await r.step_snap(page, "missing_fields_detected", status="warn")
|
||||
return ApplicationResult(False, _("missing_fields"))
|
||||
r.step("success.not_found", "warn")
|
||||
await r.step_snap(page, "success.not_found", status="warn")
|
||||
return ApplicationResult(False, _("submit_conformation_msg_not_found"))
|
||||
|
||||
async def _is_senior_flat(self, page):
|
||||
|
|
|
|||
|
|
@ -17,39 +17,48 @@ class Howoge(Provider):
|
|||
r = ctx.recorder
|
||||
p = ctx.profile
|
||||
async with open_page(url, recorder=r) as page:
|
||||
r.step("cookies.check")
|
||||
await r.step_snap(page, "cookies.check")
|
||||
cookie_accept_btn = page.get_by_role("button", name="Alles akzeptieren")
|
||||
if await cookie_accept_btn.is_visible():
|
||||
await cookie_accept_btn.click()
|
||||
r.step("cookies.accepted")
|
||||
await r.step_snap(page, "cookies.accepted")
|
||||
else:
|
||||
r.step("cookies.absent")
|
||||
|
||||
r.step("page.404_check", detail=page.url)
|
||||
if page.url == "https://www.howoge.de/404":
|
||||
await r.step_snap(page, "abort.not_found", status="warn")
|
||||
return ApplicationResult(False, message=_("not_found"))
|
||||
|
||||
r.step("form.open")
|
||||
await r.step_snap(page, "form.open")
|
||||
await page.get_by_role("link", name="Besichtigung anfragen").click()
|
||||
|
||||
r.step("form.wbs_hint"); await page.get_by_text("Ja, ich habe die Hinweise zum WBS zur Kenntnis genommen.").click()
|
||||
await r.step_snap(page, "form.wbs_hint")
|
||||
await page.get_by_text("Ja, ich habe die Hinweise zum WBS zur Kenntnis genommen.").click()
|
||||
await page.get_by_role("button", name="Weiter").click()
|
||||
r.step("form.income_hint"); await page.get_by_text("Ja, ich habe den Hinweis zum Haushaltsnettoeinkommen zur Kenntnis genommen.").click()
|
||||
|
||||
await r.step_snap(page, "form.income_hint")
|
||||
await page.get_by_text("Ja, ich habe den Hinweis zum Haushaltsnettoeinkommen zur Kenntnis genommen.").click()
|
||||
await page.get_by_role("button", name="Weiter").click()
|
||||
r.step("form.bonitaet_hint"); await page.get_by_text("Ja, ich habe den Hinweis zur Bonitätsauskunft zur Kenntnis genommen.").click()
|
||||
|
||||
await r.step_snap(page, "form.bonitaet_hint")
|
||||
await page.get_by_text("Ja, ich habe den Hinweis zur Bonitätsauskunft zur Kenntnis genommen.").click()
|
||||
await page.get_by_role("button", name="Weiter").click()
|
||||
r.step("form.name"); await page.locator("#immo-form-firstname").fill(p.firstname)
|
||||
|
||||
await r.step_snap(page, "form.fill")
|
||||
await page.locator("#immo-form-firstname").fill(p.firstname)
|
||||
await page.locator("#immo-form-lastname").fill(p.lastname)
|
||||
await page.locator("#immo-form-email").fill(p.email)
|
||||
|
||||
if not ctx.submit_forms:
|
||||
r.step("submit.dry_run")
|
||||
await r.step_snap(page, "submit.dry_run")
|
||||
return ApplicationResult(True, _("application_success_dry"))
|
||||
|
||||
r.step("submit.click"); await page.get_by_role("button", name="Anfrage senden").click()
|
||||
await r.step_snap(page, "submit.click")
|
||||
await page.get_by_role("button", name="Anfrage senden").click()
|
||||
|
||||
r.step("success.check")
|
||||
await r.step_snap(page, "success.check")
|
||||
if await page.get_by_role("heading", name="Vielen Dank.").is_visible():
|
||||
return ApplicationResult(True)
|
||||
r.step("success.not_found", "warn")
|
||||
await r.step_snap(page, "success.not_found", status="warn")
|
||||
return ApplicationResult(False, _("submit_conformation_msg_not_found"))
|
||||
|
|
|
|||
|
|
@ -17,19 +17,18 @@ class Stadtundland(Provider):
|
|||
r = ctx.recorder
|
||||
p = ctx.profile
|
||||
async with open_page(url, recorder=r) as page:
|
||||
r.step("cookies.check")
|
||||
await r.step_snap(page, "cookies.check")
|
||||
cookie_accept_btn = page.get_by_text("Alle akzeptieren")
|
||||
if await cookie_accept_btn.is_visible():
|
||||
await cookie_accept_btn.click()
|
||||
r.step("cookies.accepted")
|
||||
else:
|
||||
r.step("cookies.absent")
|
||||
await r.step_snap(page, "cookies.accepted")
|
||||
|
||||
r.step("page.offline_check")
|
||||
await r.step_snap(page, "page.offline_check")
|
||||
if await page.get_by_role("heading", name="Hier ist etwas schief gelaufen").is_visible():
|
||||
await r.step_snap(page, "abort.offline", status="warn")
|
||||
return ApplicationResult(False, message=_("ad_offline"))
|
||||
|
||||
r.step("form.fill")
|
||||
await r.step_snap(page, "form.fill")
|
||||
await page.locator("#name").fill(p.firstname)
|
||||
await page.locator("#surname").fill(p.lastname)
|
||||
await page.locator("#street").fill(p.street)
|
||||
|
|
@ -40,17 +39,20 @@ class Stadtundland(Provider):
|
|||
await page.locator("#email").fill(p.email)
|
||||
await page.locator("#privacy").check()
|
||||
await page.locator("#provision").check()
|
||||
await r.step_snap(page, "form.filled")
|
||||
|
||||
if not ctx.submit_forms:
|
||||
r.step("submit.dry_run")
|
||||
await r.step_snap(page, "submit.dry_run")
|
||||
return ApplicationResult(True, _("application_success_dry"))
|
||||
|
||||
r.step("submit.review"); await page.get_by_role("button", name="Eingaben prüfen").click()
|
||||
r.step("submit.send"); await page.get_by_role("button", name="Absenden").click()
|
||||
await r.step_snap(page, "submit.review")
|
||||
await page.get_by_role("button", name="Eingaben prüfen").click()
|
||||
await r.step_snap(page, "submit.send")
|
||||
await page.get_by_role("button", name="Absenden").click()
|
||||
await page.wait_for_timeout(2000)
|
||||
|
||||
r.step("success.check")
|
||||
await r.step_snap(page, "success.check")
|
||||
if await page.locator("p").filter(has_text="Vielen Dank!").is_visible():
|
||||
return ApplicationResult(True)
|
||||
r.step("success.not_found", "warn")
|
||||
await r.step_snap(page, "success.not_found", status="warn")
|
||||
return ApplicationResult(success=False, message=_("submit_conformation_msg_not_found"))
|
||||
|
|
|
|||
|
|
@ -17,17 +17,16 @@ class Wbm(Provider):
|
|||
r = ctx.recorder
|
||||
p = ctx.profile
|
||||
async with open_page(url, recorder=r) as page:
|
||||
r.step("page.404_check")
|
||||
await r.step_snap(page, "page.404_check")
|
||||
if await page.get_by_role("heading", name="Page Not Found").is_visible():
|
||||
await r.step_snap(page, "abort.not_found", status="warn")
|
||||
return ApplicationResult(False, message=_("not_found"))
|
||||
|
||||
r.step("cookies.check")
|
||||
await r.step_snap(page, "cookies.check")
|
||||
cookie_accept_btn = page.get_by_text("Alle zulassen")
|
||||
if await cookie_accept_btn.is_visible():
|
||||
await cookie_accept_btn.click()
|
||||
r.step("cookies.accepted")
|
||||
else:
|
||||
r.step("cookies.absent")
|
||||
await r.step_snap(page, "cookies.accepted")
|
||||
|
||||
r.step("chatbot.remove")
|
||||
try:
|
||||
|
|
@ -35,13 +34,15 @@ class Wbm(Provider):
|
|||
except Exception as e:
|
||||
r.step("chatbot.remove_failed", "warn", str(e))
|
||||
|
||||
r.step("ad.offline_check")
|
||||
await r.step_snap(page, "ad.offline_check")
|
||||
if page.url == "https://www.wbm.de/wohnungen-berlin/angebote/":
|
||||
await r.step_snap(page, "abort.offline", status="warn")
|
||||
return ApplicationResult(False, message=_("ad_offline"))
|
||||
|
||||
r.step("form.open"); await page.locator('.openimmo-detail__contact-box-button').click()
|
||||
await r.step_snap(page, "form.open")
|
||||
await page.locator('.openimmo-detail__contact-box-button').click()
|
||||
|
||||
r.step("form.wbs_section")
|
||||
await r.step_snap(page, "form.wbs_section")
|
||||
if p.is_possessing_wbs:
|
||||
await page.locator('label[for="powermail_field_wbsvorhanden_1"]').click()
|
||||
await page.locator("input[name*='[wbsgueltigbis]']").fill(p.wbs_valid_till_dt().strftime("%Y-%m-%d"))
|
||||
|
|
@ -52,7 +53,7 @@ class Wbm(Provider):
|
|||
else:
|
||||
await page.locator('label[for="powermail_field_wbsvorhanden_2"]').click()
|
||||
|
||||
r.step("form.personal")
|
||||
await r.step_snap(page, "form.personal")
|
||||
await page.locator("#powermail_field_anrede").select_option(p.salutation)
|
||||
await page.locator("#powermail_field_name").fill(p.lastname)
|
||||
await page.locator("#powermail_field_vorname").fill(p.firstname)
|
||||
|
|
@ -62,20 +63,22 @@ class Wbm(Provider):
|
|||
await page.locator("#powermail_field_e_mail").fill(p.email)
|
||||
await page.locator("#powermail_field_telefon").fill(p.telephone)
|
||||
await page.locator("#powermail_field_datenschutzhinweis_1").check(force=True)
|
||||
await r.step_snap(page, "form.filled")
|
||||
|
||||
if not ctx.submit_forms:
|
||||
r.step("submit.dry_run")
|
||||
await r.step_snap(page, "submit.dry_run")
|
||||
return ApplicationResult(success=True, message=_("application_success_dry"))
|
||||
|
||||
r.step("submit.click"); await page.get_by_role("button", name="Anfrage absenden").click()
|
||||
await r.step_snap(page, "submit.click")
|
||||
await page.get_by_role("button", name="Anfrage absenden").click()
|
||||
|
||||
r.step("success.check")
|
||||
await r.step_snap(page, "success.check")
|
||||
if await page.get_by_text("Wir haben Ihre Anfrage für das Wohnungsangebot erhalten.").is_visible():
|
||||
return ApplicationResult(True)
|
||||
elif await self._missing_fields_warning(page):
|
||||
r.step("missing_fields_detected", "warn")
|
||||
await r.step_snap(page, "missing_fields_detected", status="warn")
|
||||
return ApplicationResult(False, _("missing_fields"))
|
||||
r.step("success.not_found", "warn")
|
||||
await r.step_snap(page, "success.not_found", status="warn")
|
||||
return ApplicationResult(success=False, message=_("submit_conformation_msg_not_found"))
|
||||
|
||||
async def _missing_fields_warning(self, page) -> bool:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue