You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:42:02