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):
|
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:
|
for sel in selectors:
|
||||||
try:
|
try:
|
||||||
field = sb.find_element(sel, timeout=3)
|
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)
|
sb.sleep(0.3)
|
||||||
field.send_keys(text)
|
field.send_keys(text)
|
||||||
sb.sleep(2)
|
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:
|
try:
|
||||||
sb.find_element('[role="option"]', timeout=3).click()
|
field.send_keys(Keys.ESCAPE)
|
||||||
sb.sleep(0.8)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
print(f"[GF] {field_name} gesetzt: {text}")
|
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")
|
], nach_name, "Nach")
|
||||||
|
|
||||||
# ── 4. Suchen-Button klicken ────────────────────────────────────────
|
# ── 4. Suchen-Button klicken ────────────────────────────────────────
|
||||||
|
from selenium.webdriver.common.keys import Keys
|
||||||
gesucht = False
|
gesucht = False
|
||||||
|
# Variante A: bekannte Selektoren
|
||||||
for sel in ['button[aria-label*="Suchen"]', 'button[aria-label*="Search"]',
|
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:
|
try:
|
||||||
sb.find_element(sel, timeout=2).click()
|
sb.find_element(sel, timeout=2).click()
|
||||||
print(f"[GF] Suche gestartet via {sel}")
|
print(f"[GF] Suche via Selector: {sel}")
|
||||||
gesucht = True
|
gesucht = True
|
||||||
break
|
break
|
||||||
except Exception:
|
except Exception:
|
||||||
continue
|
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)
|
sb.sleep(14)
|
||||||
title = sb.get_title()
|
title = sb.get_title()
|
||||||
body = sb.get_text("body")
|
body = sb.get_text("body")
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue