Selenium无法向Google Maps输入框发送内容的技术求助
解决Google Maps输入框仅在窗口聚焦时接受Selenium输入的问题
核心问题分析
你的代码存在几个关键问题:
- undetected_chromedriver的配置方式错误,导致浏览器启动参数未正确生效
- 使用固定
time.sleep而非显式等待,无法确保元素完全加载可交互 - 窗口激活逻辑缺失,未确保浏览器窗口处于前台焦点
修正后的代码
import time from undetected_chromedriver import Chrome, ChromeOptions from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains # 初始化浏览器配置 chrome_options = ChromeOptions() chrome_options.add_argument('--incognito') chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_argument('--no-sandbox') chrome_options.add_argument("--mute-audio") chrome_options.add_argument("--window-size=1400,1000") chrome_options.add_argument( 'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36') # 正确初始化undetected_chromedriver driver = Chrome(options=chrome_options) driver.get("https://maps.google.com") # 显式等待搜索框加载完成并可交互 wait = WebDriverWait(driver, 10) map_input = wait.until(EC.element_to_be_clickable((By.ID, "searchboxinput"))) # 确保窗口获得焦点 driver.switch_to.window(driver.current_window_handle) driver.maximize_window() # 模拟真实用户操作:先点击激活,再逐字符输入(避免被反检测拦截) actions = ActionChains(driver) actions.move_to_element(map_input).click().perform() address = """Rett Syndrome Research Trust Inc 67 Under Cliff Rd Trumbull, CT 6611""" # 逐字符输入,模拟人类输入节奏 for char in address: actions.send_keys(char).perform() time.sleep(0.05) # 触发搜索(按回车键) actions.send_keys(u'\ue007').perform() # 等待搜索结果加载(按需调整) time.sleep(5) driver.quit()
关键修改点说明
- 修正浏览器初始化:undetected_chromedriver的
Chrome类直接接受options参数,无需通过Service传递配置,之前的service.service_args = chrome_options是错误用法。 - 显式等待替代固定休眠:使用
WebDriverWait确保搜索框完全可交互,避免因页面加载延迟导致元素未就绪。 - 窗口焦点激活:通过
driver.switch_to.window(driver.current_window_handle)强制浏览器窗口获得焦点,解决输入依赖窗口聚焦的问题。 - 模拟人类输入节奏:逐字符输入并添加微小延迟,避免被Google的反自动化机制识别拦截。
- 触发搜索:输入完成后模拟按下回车键,确保搜索操作执行。
备选方案:直接通过JS设置输入值
如果上述方法仍无效,可以尝试用JavaScript直接设置输入框值并触发搜索事件:
# 显式等待元素加载后执行JS map_input = wait.until(EC.presence_of_element_located((By.ID, "searchboxinput"))) driver.execute_script("arguments[0].value = arguments[1];", map_input, address) # 触发搜索按钮点击 search_button = wait.until(EC.element_to_be_clickable((By.ID, "searchbox-searchbutton"))) search_button.click()
内容的提问来源于stack exchange,提问作者farhan jatt
相关产品推荐
相关产品推荐

