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

2024-10-03 13:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试自动化一些非常无聊的事情(因为我犯了太多的错误,我想尽可能把它们减少到零),本质上,我得到的资产必须通过一个可怕的过程一个一个地输入到我们的系统中。这就是我现在的问题:

我的目标是在下拉列表中选择“手机”选项(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>

这是页面(公司web表单)中的组合框代码,我正在尝试选择它,但我当前的代码和尝试(一些来自堆栈溢出的其他帖子)目前为止都失败了,这是我迄今为止尝试的:

^{pr2}$

这是我的第一次尝试(同一代码的多次迭代),结果是Python没有列出任何错误,但没有选择我想要的选项,因此我从这里得到建议:

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

结果是:

Traceback (most recent call last): File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\Scripts\Add Asset.py", line 77, in selectDropDownList = browser.find_element_by_id("ctl00_CPH1_cmbClasses_DropDown > option[value='CELL PHONE']").click() File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 269, in find_element_by_id return self.find_element(by=By.ID, value=id_) File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 752, in find_element 'value': value})['value'] File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute self.error_handler.check_response(response) File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"ctl00_CPH1_cmbClasses_DropDown > option[value='CELL PHONE']"} (Session info: chrome=52.0.2743.116) (Driver info: 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')

结果是:

Traceback (most recent call last): File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\Scripts\Add Asset.py", line 78, in Select(browser.find_element_by_id('ctl00_CPH1_cmbClasses_DropDown')).select_by_value('CELL PHONES') File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\support\select.py", line 39, in init webelement.tag_name) selenium.common.exceptions.UnexpectedTagNameException: Message: Select only works on elements, not on


Tags: dividbyvaluestylelielementfind
3条回答

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

假设dropdown是可见的,使用下面的xpath来匹配'CELL PHONES'

browser.find_element_by_xpath('//div/ul[@class='rcbList']/li[@class='rcbItem'][.='CELL PHONES']')

在这里发表文章的每个人都提出了一些修修补补和很好的建议之后,以下是对我有效的解决方案:

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()

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

^{pr2}$

在那之后,我遇到了一个问题,即使我有下拉列表,它仍然显示不可见;我通过让脚本等待一秒钟来解决这个问题,以便他可以注册选项:

time.sleep(1)

最后我选择了以下项目:

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

您的问题是这个元素不是Select,而是<div>,因此不能使用Selenium的Select类。在

我看不到您正在使用的页面,但我认为id=ctl00的<div>是您必须单击才能显示下拉列表的元素?在

如果是,那么您必须通过id找到该元素,单击它,然后找到另一个包含文本“CELL PHONE”或任何您想要的元素<li>,例如使用xpath。在

this WebDriver docs page will help you

相关问题 更多 >