使用Selenium和Python选择带有<div>标签的组合框选项

时间:2016-09-13 13:16:26

标签: python selenium

我一直在尝试自动化一些非常无聊的东西(因为我一直在犯错是多么乏味,我想尽可能地将它们减少到零),实质上我得到的资产必须输入我们的系统一个接一个地通过一个可怕的过程。这是我现在的问题:

我的目标是选择&#39; CELL PHONES&#39;在下拉列表中(ctl00_CPH1_cmbClasses_DropDown)。此外,出于安全原因以及它是受保护的公司页面(我已经处理登录和导航直到这一点),我只能显示代码的片段,以免损害它。

编辑1(修改此项以添加更多HTML代码)

<td class="rcbInputCell rcbInputCellLeft" style="width:100%;"><input name="ctl00$CPH1$cmbClasses" type="text" class="rcbInput radPreventDecorate" id="ctl00_CPH1_cmbClasses_Input" value="" /></td><td class="rcbArrowCell rcbArrowCellRight"><a id="ctl00_CPH1_cmbClasses_Arrow" style="overflow: hidden;display: block;position: relative;outline: none;">select</a></td>
                </tr>
            </table><div class="rcbSlide" style="z-index:6000;"><div id="ctl00_CPH1_cmbClasses_DropDown" class="RadComboBoxDropDown RadComboBoxDropDown_WebBlue " style="display:none;width:140px;"><div class="rcbScroll rcbWidth" style="width:100%;"><ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;"><li class="rcbItem"></li><li class="rcbItem">CELL PHONES</li><li class="rcbItem">CELLULAR PHONE SCRAP (WITHOUT BATTERIES)</li><li class="rcbItem">COMPUTER - DESKTOP</li><li class="rcbItem">COMPUTER -TOWER</li><li class="rcbItem">COMPUTERS</li><li class="rcbItem">COMPUTERS - SFF</li><li class="rcbItem">COPPER BEARING - LOW GRADE</li><li class="rcbItem">Desktop</li><li class="rcbItem">FLOPPY DISK DRIVES</li><li class="rcbItem">GARBAGE - NON HAZARDOUS</li><li class="rcbItem">LAPTOPS</li><li class="rcbItem">LCD Monitor</li><li class="rcbItem">MISC. ELECTRONICS</li><li class="rcbItem">MISCELLANEOUS</li><li class="rcbItem">MODEMS</li><li class="rcbItem">NETWORK EQUIPMENT</li><li class="rcbItem">OCC</li><li class="rcbItem">PHONES - DIGITAL</li><li class="rcbItem">PRINTERS</li><li class="rcbItem">SERVERS</li><li class="rcbItem">SERVERS - TOWER</li><li class="rcbItem">Telecom Equipment</li><li class="rcbItem">Telephone</li><li class="rcbItem">Telephone Accessory</li><li class="rcbItem">TEST EQUIPMENT</li><li class="rcbItem">WIRE &amp; CABLE - MISC. </li></ul></div></div></div><input id="ctl00_CPH1_cmbClasses_ClientState" name="ctl00_CPH1_cmbClasses_ClientState" type="hidden" />
        </div>

这是来自页面(公司网页表单)的组合框代码,我试图选择它但是我目前的代码和尝试(其中一些来自Stack Overflow中的其他帖子)到目前为止都失败了,这就是我所尝试的到目前为止:

def fast_multiselect(driver, element_id, labels):
select = browser.find_element_by_id('ctl00_CPH1_cmbClasses_DropDown')
for option in select.find_element_by_name('CELL PHONE'):
    if option.text in labels:
        option.click()

这是我的第一次尝试(相同代码的几次迭代),结果是Python没有列出任何错误,但没有选择我想要的选项,所以按照这里的建议我去了:

selectDropDownList = browser.find_element_by_id("ctl00_CPH1_cmbClasses_DropDown > option[value='CELL PHONE']").click()

这就是结果:

  

追踪(最近一次通话):     文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ Scripts \ Add Asset.py&#34;,第77行,in       selectDropDownList = browser.find_element_by_id(&#34; ctl00_CPH1_cmbClasses_DropDown&gt;选项[value =&#39; CELL PHONE&#39;]&#34;)。click()     在find_element_by_id中的文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py&#34;,第269行       return self.find_element(by = By.ID,value = id_)     文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py&#34;,第752行,在find_element中       &#39;价值&#39;:价值})[&#39;价值&#39;]     文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py&#34;,236行,执行中       self.error_handler.check_response(响应)     文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py&#34;,第192行,在check_response中       提出exception_class(消息,屏幕,堆栈跟踪)   selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{&#34;方法&#34;:&#34; id&#34;,&#34;选择器&#34;:&#34 ; ctl00_CPH1_cmbClasses_DropDown&gt;选项[value =&#39; CELL PHONE&#39;]&#34;}     (会议信息:chrome = 52.0.2743.116)     (驱动程序信息:chromedriver = 2.23.409699(49b0fa931cda1caad0ae15b7d1b68004acd05129),platform = Windows NT 10.0.10586 x86_64)

我继续前进,这是我的最后一次尝试:

Select(browser.find_element_by_id('ctl00_CPH1_cmbClasses_DropDown')).select_by_value('CELL PHONES')

结果是:

  

追踪(最近一次通话):     文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ Scripts \ Add Asset.py&#34;,第78行,in       选择(browser.find_element_by_id(&#39; ctl00_CPH1_cmbClasses_DropDown&#39;))。select_by_value(&#39; CELL PHONES&#39;)     文件&#34; C:\ Users \ AMSUser \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ site-packages \ selenium \ webdriver \ support \ select.py&#34;,第39行,初始化       webelement.tag_name)   selenium.common.exceptions.UnexpectedTagNameException:消息:选择仅适用于元素,而不适用于

4 个答案:

答案 0 :(得分:1)

经过一些修补和来自这里发布的每个人的好建议后,这个解决方案对我有用:

dropArrow = browser.find_element_by_id('ctl00_CPH1_cmbClasses_Arrow') 
dropArrow.click() 
time.sleep(1) 
dropdown1 = browser.find_element_by_xpath('//*[@id="ctl00_CPH1_cmbClasses_DropDown"]/div/ul/li[.="CELL PHONES"]') 
dropdown1.click()

关于发生了什么的简短解释,我的第一个问题是列表不可见,通过点击下拉列表解决了这个问题:

dropArrow = browser.find_element_by_id('ctl00_CPH1_cmbClasses_Arrow') 
dropArrow.click()

在那之后,我遇到了一个问题,即使我把下拉列表放下来,它仍然说它不可见;我通过让脚本等待一秒来解决这个问题,这样他就可以用以下方式注册选项:

time.sleep(1)

最后我选择了以下项目:

dropdown1 = browser.find_element_by_xpath('//*[@id="ctl00_CPH1_cmbClasses_DropDown"]/div/ul/li[.="CELL PHONES"]') 
dropdown1.click()

答案 1 :(得分:0)

您的问题是此元素不是Select而是<div>,因此您无法使用Selenium的Select类。

我没有看到您正在使用的页面,但我认为{id = ctl00_CPH1_cmbClasses_DropDown的<div>是您必须单击以显示下拉列表的元素?

如果是,则必须通过id找到该元素,单击它,然后找到包含文本“CELL PHONE”或其他任何内容的另一个元素<li>,例如使用xpath。

this WebDriver docs page will help you

答案 2 :(得分:0)

在此之前,请确保您的下拉列表是可见的,因为有一个div显示:none。,第二个div。

假设下拉列表可见,请使用以下xpath匹配“CELL PHONES”

using (var cn = new SqlConnection(cs))
{
  cn.InfoMessage += (sender, eventArgs) => Console.WriteLine("    Message: "+ eventArgs.Message);

答案 3 :(得分:0)

这是我在“选择”不起作用时使用的方式。

dd_arrow = WebDriverWait(browser, delay).until(
    EC.presence_of_element_located((By.ID, '#DD arrow element ID')))
dd_arrow.click()

available_options = browser.find_element_by_id(
    '#Id of actual DD list').find_element_by_css_selector('ul')

for opts in available_options.find_elements_by_css_selector('li'):

    if opts.get_attribute('textContent') == #Required item:
        opts.click()
        break

 if #Required_item in opts.get_attribute('textContent'):
        opts.click()
        break