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:
parent
c8dcce6c17
commit
27f78c9a40
1 changed files with 47 additions and 7 deletions
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue