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

Python Selenium如何点击类名相同的按钮 单选按钮点击失败求解

问题原因
  • 多数站点为了美化单选按钮样式,会将原生<input type="radio">元素设置为隐藏(opacity为0或display为none),直接对input元素调用click()无法触发交互事件
  • 你使用send_keys修改value属性的操作不符合单选按钮的交互逻辑:单选的选中状态由checked属性控制,和value值无关,send_keys本身是用于向输入框录入内容的方法,不能用来修改元素属性
  • 硬休眠time.sleep稳定性差,可能出现元素还未加载完成就执行操作的情况
可行解决方案

方案1:用JS执行点击(兼容性最高,无视元素隐藏状态)

直接通过execute_script调用元素的点击事件,不需要考虑元素是否可见:

# 选中RCPE「是」选项
driver.execute_script("arguments[0].click();", input_rcpe_yes)
# 选中RCPE「否」选项
driver.execute_script("arguments[0].click();", input_rcpe_no)
# 兽医费用选项同理
driver.execute_script("arguments[0].click();", input_sub_yes)
driver.execute_script("arguments[0].click();", input_sub_no)

方案2:点击关联的label元素

如果单选按钮和label标签关联,可以直接点击label触发选中:

# 根据for属性匹配对应input的label
rcpe_yes_label = driver.find_element(By.CSS_SELECTOR, 'label[for="quote_equine_owner_hasSubscribedRcpe_0"]')
rcpe_yes_label.click()

额外优化建议

下拉选择操作建议用Selenium自带的Select类,比send_keys更稳定:

from selenium.webdriver.support.ui import Select

# 初始化下拉选择器
select_year = Select(input_year)
select_gear = Select(input_gear)

# 按value选择选项
select_year.select_by_value(year)
select_gear.select_by_value(price)
修改后的核心循环代码
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

# 初始化显式等待,最长等待10秒
wait = WebDriverWait(driver, 10)

# 提前等待所有元素加载完成
btn_cookie = wait.until(EC.element_to_be_clickable((By.ID, 'popin_tc_privacy_button')))
btn_cookie.click()

input_year = wait.until(EC.presence_of_element_located((By.ID, 'quote_equine_owner_equineBirthYear')))
input_gear = wait.until(EC.presence_of_element_located((By.ID, 'quote_equine_owner_equineValue')))
input_rcpe_yes = wait.until(EC.presence_of_element_located((By.ID, 'quote_equine_owner_hasSubscribedRcpe_0')))
input_rcpe_no = wait.until(EC.presence_of_element_located((By.ID, 'quote_equine_owner_hasSubscribedRcpe_1')))
input_sub_yes = wait.until(EC.presence_of_element_located((By.ID, 'quote_equine_owner_subscribeVeterinaryCharge_0')))
input_sub_no = wait.until(EC.presence_of_element_located((By.ID, 'quote_equine_owner_subscribeVeterinaryCharge_1')))

# 提取下拉选项
select_year = Select(input_year)
options_year = [option.get_attribute("value") for option in select_year.options]

select_gear = Select(input_gear)
options_gear = [option.get_attribute("value") for option in select_gear.options]

yes_no = ['yes','no']

for i in yes_no:
    if i == 'yes':
        driver.execute_script("arguments[0].click();", input_rcpe_yes)
    else:
        driver.execute_script("arguments[0].click();", input_rcpe_no)
    time.sleep(1)
    for x in yes_no:
        if x == 'yes':
            driver.execute_script("arguments[0].click();", input_sub_yes)
        else:
            driver.execute_script("arguments[0].click();", input_sub_no)
        time.sleep(1)
        for year in options_year:
            select_year.select_by_value(year)
            time.sleep(1)
            if int(year) > 2000:
                for price in options_gear:
                    select_gear.select_by_value(price)
                    time.sleep(1)
                    # 此处添加报价采集逻辑

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:09:02