使用Python Selenium从多选下拉菜单中读取(而不是选择)活动选项



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

如何能够;活动的";从以下多选下拉菜单中读取选项?注意,Widget A和Widget C是活动的,而Widget B不是。

您似乎会使用Select.all_selected_options。多选容器的X路径是//*[@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)

要获得活动选项元素,可以使用以下方法:

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]")

为了给出一个确定的答案,我仍然需要看到页面上的其他下拉菜单

最新更新