【问题标题】:Read (not select) active options from a Multi-Select dropdown using Python Selenium?使用 Python Selenium 从多选下拉列表中读取(不选择)活动选项?
【发布时间】:2021-06-24 19:44:42
【问题描述】:

在多选下拉菜单中选择多个选项有很多问题和答案,但很少有(如果有的话)只涉及读取当前选择的选项。

如何从以下多选下拉菜单中读取“活动”选项?请注意,小部件 A 和小部件 C 处于活动状态,而小部件 B 不处于活动状态。

您似乎会使用Select.all_selected_options。多选容器的 Xpath 是 //*[@id="addActivityTable"]/tbody/tr[17]/td[2]/div/ul

HTML

<table id="addActivityTable" width="100%" border="0" cellspacing="0" cellpadding="0" class="table">
  <tbody>
    <tr>
      <td><b> Vendor Approved Widgets</b></td>
      <td colspan="3">
      <select name="WidgetStatus_DD" id="WidgetStatus_DD" class="text2" multiple="multiple" style="width: 200px; display: none;">
          <option value="multiselect-all"> Select all</option>&nbsp;
          <option value="123" selected="">&nbsp;WIDGET A</option>
          <option value="456">&nbsp;WIDGET B</option>
          <option value="789" selected="">&nbsp;WIDGET C
        <div class="btn-group open">
          <button type="button" class="multiselect dropdown-toggle btn btn-default" data-toggle="dropdown" title="&nbsp;WIDGET A
                                                
                                                    , &nbsp;WIDGET B
                                                
                                                " aria-expanded="true">2 selected <b class="caret"></b></button>
            <ul class="multiselect-container dropdown-menu" mylist="" data-input="#filtersearch" data-autodividers="true" data-inset="true" style="max-height: 200px; overflow: hidden auto;">
                <div class="input-group">
                    <span class="input-group-addon" style="padding: 4px 9px;">
                        <img src="/css/e003.jpg">
                    </span>
                    <input id="filtersearch" class="form-control multiselect-search" type="text" placeholder="Search">
                </div>
                <li>
                    <a href="javascript:void(0);" class="multiselect-all">
                        <label class="checkbox">
                          <input type="checkbox" value="multiselect-all">
                          " Select all"
                        </label>
                    </a>
                </li>
                <li class="active">
                    <a href="javascript:void(0);">
                        <label class="checkbox">
                            <input type="checkbox" value="123"> &nbsp;WIDGET A
                        </label>
                    </a>
                </li>
                <li>
                    <a href="javascript:void(0);">
                        <label class="checkbox">
                            <input type="checkbox" value="456"> &nbsp;WIDGET B
                        </label>
                    </a>
                </li>
                <li class="active">
                    <a href="javascript:void(0);">
                        <label class="checkbox">
                            <input type="checkbox" value="789"> &nbsp;WIDGET C
                        </label>
                    </a>
                </li>
            </ul>
        </td>
     </tr>
  </tbody>
</table>

这是我失败的尝试:

def get_selected_values_from_dropdown(self, xpath):
    try:
        select = Select(WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.XPATH, xpath))))
        return select.all_selected_option.get_attribute("value")
    except NoSuchElementException as e:
        print(f"Dropdown element at {xpath} not found.")

xpath = '//*[@id="addActivityTable"]/tbody/tr[17]/td[2]/div/ul'
record = dict()
if key == "widgets":
    widgets = self.get_selected_values_from_dropdown(xpath)
    record[key] = ", ".join(widgets)

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping


    【解决方案1】:

    要获取活动的选项元素,您可以使用:

    active_options = driver.find_elements_by_xpath("//li[@class='active']//label")
    

    UPD
    更新 HTML 之后。
    我不能确定,因为我看不到其他下拉菜单,但如果这个特定的下拉块唯一定位器是 id="addActivityTable" 上面的代码将是

    active_options = driver.find_elements_by_xpath("//table[id='addActivityTable']//li[@class='active']//label")
    

    或许

    active_options = driver.find_elements_by_xpath("//table[id='addActivityTable']//td[@colspan='3']//li[@class='active']//label")
    

    另外,也许你可以用其他方式来做,像这样:

    active_options = driver.find_elements_by_xpath("//table[id='addActivityTable']//td[@colspan='3']//option[@selected]")
    

    要给出确定的答案,我仍然需要查看该页面上的其他下拉菜单

    【讨论】:

    • 这就是您所要求的,还是您也希望从元素文本中提取小部件字母?可以很简单的完成。
    • 不,我不需要提取字母,只需提取活动选项完整文本。我会看看这个并很快提供反馈。谢谢。
    • 这越来越接近,但不是解决方案。它选择整个页面上的所有活动选项,而不仅仅是特定的下拉菜单。
    • 对。但是你没有提到那里有几个下拉菜单。此外,我在 HTML 块中看不到您与一些独特的定位器共享整个块的任何父元素。
    • 我一直在使用 Xpath 来定位对象,如上所示,以定位 multiselect-container dropdown-menu ul 元素; //*[@id="addActivityTable"]/tbody/tr[17]/td[2]/div/ul.我也在 Google Colab 工作,不习惯在那里调试,否则我会添加更多细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2022-07-21
    相关资源
    最近更新 更多