如何在重新加载网页时从下拉菜单中选择更改ID

时间:2016-05-30 04:26:16

标签: python html selenium selenium-webdriver

我想使用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>

当我点击下拉框时,只有标签更改的可见性。

1 个答案:

答案 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