fix: Google Flights — Keyboard-Nav für Autocomplete, JS-Fallback für Such-Button

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Cursor 2026-02-25 21:17:23 +07:00
parent c8dcce6c17
commit 27f78c9a40

View file

@ -159,18 +159,29 @@ def _consent_google(sb):
def _gf_fill_field(sb, selectors, text, field_name):
"""Hilfsfunktion: Textfeld in Google Flights füllen + ersten Vorschlag klicken."""
"""
Textfeld in Google Flights füllen.
Nutzt Keyboard-Navigation (ArrowDown + Return) statt DOM-Klick,
weil Google-Autocomplete-Dropdowns sonst offen bleiben.
"""
from selenium.webdriver.common.keys import Keys
for sel in selectors:
try:
field = sb.find_element(sel, timeout=3)
field.clear()
# Feld leeren via JS (robuster als .clear() bei React-Inputs)
sb.execute_script("arguments[0].value = '';", field)
field.click()
sb.sleep(0.3)
field.send_keys(text)
sb.sleep(2)
# Ersten Autocomplete-Vorschlag klicken
# Ersten Vorschlag per Tastatur auswählen (zuverlässiger als Klick)
field.send_keys(Keys.ARROW_DOWN)
sb.sleep(0.5)
field.send_keys(Keys.RETURN)
sb.sleep(1)
# Escape falls Dropdown noch offen
try:
sb.find_element('[role="option"]', timeout=3).click()
sb.sleep(0.8)
field.send_keys(Keys.ESCAPE)
except Exception:
pass
print(f"[GF] {field_name} gesetzt: {text}")
@ -246,17 +257,46 @@ def scrape_google_flights(von, nach, tage=30, aufenthalt_tage=60,
], nach_name, "Nach")
# ── 4. Suchen-Button klicken ────────────────────────────────────────
from selenium.webdriver.common.keys import Keys
gesucht = False
# Variante A: bekannte Selektoren
for sel in ['button[aria-label*="Suchen"]', 'button[aria-label*="Search"]',
'button[jsname="vLv7Lb"]', 'button[type="submit"]']:
'button[jsname="vLv7Lb"]', 'button[type="submit"]',
'button[class*="search"]']:
try:
sb.find_element(sel, timeout=2).click()
print(f"[GF] Suche gestartet via {sel}")
print(f"[GF] Suche via Selector: {sel}")
gesucht = True
break
except Exception:
continue
# Variante B: JS — Button mit Text "Suchen" / "Search" finden
if not gesucht:
try:
clicked = sb.execute_script("""
var btns = document.querySelectorAll('button');
for (var b of btns) {
var t = (b.textContent || b.innerText || '').trim();
if (t === 'Suchen' || t === 'Search') { b.click(); return true; }
}
return false;
""")
if clicked:
print("[GF] Suche via JS-Text-Klick")
gesucht = True
except Exception:
pass
# Variante C: Enter-Taste auf body (löst Formular-Submit aus)
if not gesucht:
try:
sb.driver.find_element("css selector", "body").send_keys(Keys.RETURN)
print("[GF] Suche via Enter-Taste")
gesucht = True
except Exception:
pass
sb.sleep(14)
title = sb.get_title()
body = sb.get_text("body")