【问题标题】:How to view text options within a dropdown menu如何在下拉菜单中查看文本选项
【发布时间】:2017-11-01 22:20:09
【问题描述】:

选择列表的 HTML 如下所示:

<select name="date_range_month_start" id="date_range_month_start" data-width="109px" data-search="true" style="width: 109px; display: none;">
                    <option value="0">January</option>
                    <option value="9">October</option>
                    <option value="10" selected="selected">November</option>
                    <option value="11">December</option>
                 </select>

<div class="chosen-container chosen-container-single chosen-container-single-nosearch" style="width: 109px;" title="" id="date_range_month_start_chosen">
        <a class="chosen-single" tabindex="-1">
            <span>January</span>
                    <div><b></b>
                    </div>
                  </a>
    <div class="chosen-drop">...</div>
    </div>

但是当我运行时:

month = driver.find_element_by_id('date_range_month_start_chosen')
month.click() ## make dropdown list visible in browser
mySelect = Select(driver.find_element_by_css_selector("#date_range_month_start"))
print([o.text for o in mySelect.options])

它打印: ['', '', '', '', '', '', '', '', '', '', '', ''] 我也尝试了其他一些方法,但到目前为止,在打印此下拉菜单中的文本值时完全不成功。

【问题讨论】:

  • 你能修正一下格式吗?我为你做了这个,但是当你添加额外的月份时你似乎已经恢复了它(顺便说一下,这对于最小的可验证示例来说不是必需的)
  • 请包含id为date_range_month_start_chosen的元素,包括其相关的副作用。
  • 问题是 SELECT 不可见,至少在您粘贴的 HTML 中不可见。您将需要找到如何使其可见。单击不可见元素不会使其可见。您无需打开下拉菜单即可访问其选项。

标签: python selenium selenium-webdriver drop-down-menu webdriver


【解决方案1】:

这里有几点:

  1. 使用Select 类来处理selectoptions 标签。
  2. 我们应该尝试只通过Select类型的对象来选择option
  3. 这是供您参考的代码块:

    selectmonth = Select(driver.find_element_by_id('date_range_month_start'))
    for option in selectmonth.options:
        print(option.text)      
    

更新

如果您因style="width: 109px; display: none; 而遇到ElementNotVisibleException,请使用此代码块:

element = driver.find_element_by_id('date_range_month_start')   
driver.execute_script("return arguments[0].removeAttribute('style');", element)
selectmonth = Select(driver.find_element_by_id('date_range_month_start'))
for option in selectmonth.options:
    print(option.text)      

【讨论】:

  • 正如 DebanjanB 所指出的,您的下拉菜单不是由 select 标签实现的,它可能由一些插件实现,例如 jQuery 下拉插件,因为这样的下拉菜单是模拟 UI 和行为,如选择标签实现的下拉菜单做过。对于 Select 类,它只能在选择标签实现的下拉列表中工作。所以你不应该在这里使用 Select 类。
  • @yong 这是&lt;select&gt; 标签被禁用的罕见情况。因此,确切的解决方案将取决于我们通过遵循广义解决方案观察到的错误,即尝试通过选择对象类型来选择一个选项。
  • 从此类模拟器下拉列表中选择选项的正确步骤,首先单击下拉列表,使所有选项显示出来,然后找到该选项并单击它。 (不要从选择节点的子节点中找到选项,选择节点是不可见的,应该有另一个DOM节点来显示所有选项,找出那个DOM节点,你会得到如何定位你想要的选项选择)
【解决方案2】:

当元素在屏幕上不可见时,Selenium 会这样做。

您的style 标签中有display: none。我想你会发现,如果你删除它,你就会看到你所期望的。

我认为这是因为 selenium 是为模拟用户行为而构建的 - 用户无法阅读未显示的文本。

【讨论】:

  • 我尝试在下拉菜单中使用click() 后运行它,这样它对用户可见,但结果仍然相同。
  • 知道这一点很重要。请将此添加到您的问题中,以便考虑。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多