使用Selenium访问hotelstars.eu无法定位country元素如何解决?
问题解决方案
报错核心原因
- 搜索表单被嵌入在页面的iframe元素中,你直接在顶层DOM查找
name=country的元素,自然无法定位到 - 你现有代码还存在多处逻辑错误和Selenium API使用错误,也会导致后续运行报错
具体修复方案
1. 先修正browserDriver.py代码
你之前定义的Chrome启动参数没有传入初始化方法,导致配置不生效,修改后代码:
#-*-coding:utf-8-* import os from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--ignore-certificate-errors') options.add_argument('--incognito') # 加这个参数避免自动化特征被站点识别 options.add_argument('--disable-blink-features=AutomationControlled') chromedriver = r"\Users\simon\Documents\chromedriver_win32\chromedriver" os.environ["webdriver.chrome.driver"] = chromedriver # 注意这里要把options参数传入 driver = webdriver.Chrome(chromedriver, options=options)
2. 修正主程序代码
需要先切换到表单所在iframe,同时修正Select操作逻辑、定位方法,以及值匹配问题(当前页面是德语界面,国家选项的value值为DE,不用文本匹配更稳定):
from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import browserDriver as bd import time val_land = 'DE' val_city = 'Stuttgart' val_radius = '100' val_stars = '5' bd.driver.get('https://www.hotelstars.eu/de/deutschland/service/hotelsuche/') bd.driver.implicitly_wait(10) # 接受Cookie WebDriverWait(bd.driver, 10).until(EC.element_to_be_clickable((By.ID, '564'))).click() print('- - - Status: Cookies accepted') # 关键:切换到搜索表单所在的iframe WebDriverWait(bd.driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[contains(@src,"hotelsuche")]'))) print('- - - Status: 已切换到表单iframe') # 选择国家,直接对select标签初始化Select对象即可,不需要遍历option element_land = WebDriverWait(bd.driver, 10).until(EC.presence_of_element_located((By.NAME, 'country'))) select_land = Select(element_land) select_land.select_by_value(val_land) print('- - - Status: 国家选择完成') # 输入城市 element_stadt = bd.driver.find_element(By.ID, 'city') element_stadt.send_keys(val_city) # 选择半径 select_radius = Select(bd.driver.find_element(By.NAME, 'radius')) select_radius.select_by_value(val_radius) print('- - - Status: 半径选择完成') # 选择星级 select_stars = Select(bd.driver.find_element(By.NAME, 'stars')) select_stars.select_by_value(val_stars) print('- - - Status: 星级选择完成') # 点击提交 bd.driver.find_element(By.ID, "sendbtn").click() # 后续如果需要操作顶层页面,执行以下代码切回根DOM # bd.driver.switch_to.default_content()
3. 额外注意事项
- 请确保你的ChromeDriver版本和本地安装的Chrome浏览器版本完全匹配,版本差异过大也会导致元素定位异常
- 显式等待(WebDriverWait)比隐式等待更稳定,推荐所有元素定位都加上显式等待,避免页面还没加载完成就执行查找逻辑
内容的提问来源于stack exchange,提问作者pokerface
相关产品推荐
相关产品推荐

