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

如何用Python Selenium操作自定义bc-dropdown下拉框切换页面内容?

自定义bc-dropdown组件的Selenium操作方案

问题背景

我有一个自定义的<bc-dropdown>组件,代码如下:

<bc-dropdown class="hydrated" options="Week 1,Week 2,Week 3,Week 4,Week 5,Week 6,Week 7,Week 8,Week 9,Week 10,Week 11,Week 12,Week 13,Week 14,Week 15,Bowls" selected="Week 1" uid="fd5704d7-8531-483b-9f92-96340b80da78">
            <!--r.4-->
            <div class="bc-dropdown bc-wc-select-container bc-week-dropdown-width d-flex justify-content-end">
              <div class="position-relative w-100">
                <div class="bg-white h-100 sport-dropdown w-100">
                  <div class="align-items-center d-flex h-100 justify-content-between my-auto">
                    <p>
                      <strong class="category font-sf-ui-display-medium my-auto pl-3">
                        Week 2</strong>
                    </p>
                    <span class="pr-3">
                      <i class="fa-angle-down fas"></i>
                    </span>
                  </div>
                </div>
                <div class="bc-week-dropdown-width dropdown-menu overflow-auto">
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 1">
                    <strong class="category-text">
                      Week 1</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 2">
                    <strong class="dropdown-item-selected">
                      Week 2</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 3">
                    <strong class="category-text">
                      Week 3</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 4">
                    <strong class="category-text">
                      Week 4</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 5">
                    <strong class="category-text">
                      Week 5</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 6">
                    <strong class="category-text">
                      Week 6</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 7">
                    <strong class="category-text">
                      Week 7</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 8">
                    <strong class="category-text">
                      Week 8</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 9">
                    <strong class="category-text">
                      Week 9</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 10">
                    <strong class="category-text">
                      Week 10</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 11">
                    <strong class="category-text">
                      Week 11</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 12">
                    <strong class="category-text">
                      Week 12</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 13">
                    <strong class="category-text">
                      Week 13</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 14">
                    <strong class="category-text">
                      Week 14</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Week 15">
                    <strong class="category-text">
                      Week 15</strong>
                  </div>
                  <div class="category cursor-pointer dropdown-item font-sf-ui-display-medium" data-value="Bowls">
                    <strong class="category-text">
                      Bowls</strong>
                  </div>
                </div>
              </div>
            </div>
          </bc-dropdown>

尝试修改selected属性(如下代码)无法触发页面变化,且该组件不是原生select,无法使用Selenium的Select类:

dropdown = browser.find_element(By.TAG_NAME, "bc-dropdown")
browser.execute_script("arguments[0].setAttribute('selected',arguments[1])",dropdown, value)

解决方案

方法1:模拟真实用户交互

直接模拟点击下拉框展开,再点击目标选项:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待下拉框触发器可点击并点击展开
dropdown_trigger = WebDriverWait(browser, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "bc-dropdown .sport-dropdown"))
)
dropdown_trigger.click()

# 等待目标选项出现并点击
target_value = "Week 5"  # 替换成需要选中的值
target_option = WebDriverWait(browser, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, f"bc-dropdown .dropdown-item[data-value='{target_value}']"))
)
target_option.click()

这种方法完全复刻用户操作流程,能触发组件绑定的所有事件,是最稳妥的解决方案。

方法2:用JS直接触发选项点击事件

如果模拟点击遇到加载或渲染问题,可以用JS直接触发选项的点击事件:

target_value = "Bowls"  # 替换目标值
# 定位目标选项元素
target_option = browser.find_element(By.CSS_SELECTOR, f"bc-dropdown .dropdown-item[data-value='{target_value}']")
# 执行JS点击
browser.execute_script("arguments[0].click();", target_option)

方法3:调用自定义组件的内部API

自定义Web组件通常会暴露内部方法用于更新状态,可尝试调用对应方法并触发变更事件:

target_value = "Week 3"
dropdown = browser.find_element(By.TAG_NAME, "bc-dropdown")
# 先更新selected属性,再触发change事件
browser.execute_script("""
    arguments[0].selected = arguments[1];
    arguments[0].dispatchEvent(new Event('change'));
""", dropdown, target_value)

如果组件有专门的更新方法(比如setValue、updateSelection),可以替换成对应方法调用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:45:40