我想使用selenium webdriver从下拉菜单中选择“802.11n”,但每次重新加载页面时都会更改“sbSelector_xxx”ID。
<div id="RADIO_5GHz_adv" style="display: block;">
<table class="block" border="0">
<tbody>
<tr>
<tr id="show_80211Mode_5G">
<th>
<td>
<div class="styled-select">
<select id="80211Mode_5" onchange="ChangeWidthList('5')" name="80211Mode_5" sb="70855846" style="display: none;">
<option value="802.11a">802.11a only</option>
<option value="802.11n">802.11n only</option>
<option value="802.11an">Mixed 802.11a/n</option>
<option value="802.11ac">802.11ac only</option>
<option value="802.11nac">Mixed 802.11n/ac</option>
<option value="802.11anac">Mixed 802.11a/n/ac</option>
</select>
<div id="sbHolder_70855846" class="sbHolder" style="width:200px">
<a id="sbToggle_70855846" class="sbToggle" href="#"></a>
<a id="sbSelector_70855846" class="sbSelector" href="#" style="width:170px">802.11n only</a>
<ul id="sbOptions_70855846" class="sbOptions" style="width: 200px; display: none;">
<li>
<a href="802.11a" rel="802.11a">802.11a only</a>
</li>
<li>
<a class="sbFocus" href="802.11n" rel="802.11n">802.11n only</a>
</li>
<li>
<a href="802.11an" rel="802.11an">Mixed 802.11a/n</a>
</li>
<li>
<a href="802.11ac" rel="802.11ac">802.11ac only</a>
</li>
<li>
<a href="802.11nac" rel="802.11nac">Mixed 802.11n/ac</a>
</li>
<li>
<a href="802.11anac" rel="802.11anac">Mixed 802.11a/n/ac</a>
</li>
</ul>
</div>
</div>
我在使用selenium webdriver的python中这样做。我想使用脚本自动化从下拉框中选择“802.11ac”选项。
单击下拉框(使用Firebug)后的HTML
<div class="styled-select">
<select id="80211Mode_5" onchange="ChangeWidthList('5')" name="80211Mode_5" sb="99213187" style="display: none;">
<option value="802.11a">802.11a only</option>
<option value="802.11n">802.11n only</option>
<option value="802.11an">Mixed 802.11a/n</option>
<option value="802.11ac">802.11ac only</option>
<option value="802.11nac">Mixed 802.11n/ac</option>
<option value="802.11anac">Mixed 802.11a/n/ac</option>
</select>
<div id="sbHolder_99213187" class="sbHolder" style="width:200px">
<a id="sbToggle_99213187" class="sbToggle sbToggleOpen" href="#"></a>
<a id="sbSelector_99213187" class="sbSelector" href="#" style="width:170px">802.11n only</a>
<ul id="sbOptions_99213187" class="sbOptions" style="width: 200px; top: 30px; max-height: 151.4px; display: block;">
<li>
<a class="" href="802.11a" rel="802.11a">802.11a only</a>
</li>
<li>
<li>
<li>
<li>
<li>
</ul>
</div>
</div>
当我点击下拉框时,只有标签更改的可见性。
答案 0 :(得分:2)
有多种方法可以做到这一点。 1种方法是使用选择器的类名。
driver.find_element_by_class_name('sbSelector')
如果您不想按类名执行此操作,或者它不是唯一的,您仍然可以通过使用Xpath检查它是否包含sbSelector_来使用该ID。
driver.find_element_by_xpath('//a[contains(@id, "sbSelector_")'])
当然,您还可以检查应包含802.11n的元素的文本
driver.find_element_by_xpath('//a[contains(text(), "802.11n")]')
修改添加了点击隐藏元素的方法
您尝试单击的元素位于此元素内:
<select id="80211Mode_5" onchange="ChangeWidthList('5')" name="80211Mode_5" sb="31295123" style="display: none;">
注意style =“display:none;”。这意味着元素不会显示在页面上。这就是Selenium无法单击此元素并抛出ElementNotVisibleException的原因。这是为了防止您点击用户通常无法点击的元素。如果您坚持单击此隐藏元素,则可以执行一个javascript命令来执行此操作。
element = driver.find_element_by_class_name('sbSelector')
driver.execute_script("arguments[0].click();", element)
编辑2 要获得所有元素,请使用:
elements = driver.find_elements_by_css_selector("ul[class='sbOptions'] > li > a")
for element in elements:
# Do stuff with the elements in your list