无法使用Python中的Selenium访问下拉列表选项

时间:2016-07-13 15:59:21

标签: javascript python html selenium xpath

我是新手在Python中使用Selenium而我正在尝试访问Barclays Live网站上的索引数据。一旦我登录并加载页面,我就会尝试从页面的下拉列表中选择“Custom1”。与列表关联的HTML代码中的选择对象如下所示:

<select name="customViewId" class="formtext" onchange="submitFromSelect('username');return false;">
    <option value="">&nbsp;</option>
    <option value="Favorite Indices">Favorite Indices</option>
    <option value="Custom1">Custom1</option>
    <option value="CB group">CB group</option>
    <option value="Kevin Favorites">Kevin Favorites</option>
    <option value="LB Gov/Cdt intermediate">LB Gov/Cdt intermediate</option>
</select>

这是我的代码,直到我尝试访问此对象:

from selenium import webdriver
from selenium.webdriver.support.select import Select

#Get chrome driver and connect to Barclays live site
browser = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\chromedriver.exe")
browser.get('https://live.barcap.com/')

#Locate username box and enter username
username = browser.find_element_by_name("user")
username.send_keys("username")

#Locate password box and send password
password = browser.find_element_by_name("password")
password.send_keys("password")

#Click login button
login = browser.find_element_by_id("submit")
login.click()

#Open page where you can select indices
browser.get("https://live.barcap.com/BC/barcaplive?menuCode=MENU_IDX_1061")

我已经尝试了一些我发现的解决方案,通常会出现错误“无法找到元素:”,然后是我尝试访问select对象的任何方法。我似乎无法通过名称,xpath或使用Select()函数访问它。我已经尝试在代码中放置等待时间以防元素尚未加载,并且没有运气。我期望工作的一些例子,但不是:

select_box = browser.find_element_by_name("customViewId")
select_box = browser.find_element_by_xpath("//select[option[@value='Custom1']]"

我的背景不是编程,如果这是一个愚蠢的问题,请放轻松。在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

  

select元素确实位于iframe中。

这意味着您应该 switch进入框架的上下文,然后才能找到元素:

browser.switch_to.frame("frame_name_or_id")
select_box = browser.find_element_by_name("customViewId")

如果您需要从框架的上下文中返回,请使用:

browser.switch_to.default_content()

至于操纵选择框部分,有更好的方法 - 使用Select class

from selenium.webdriver.support.select import Select

select_box = Select(browser.find_element_by_name("customViewId"))
select_box.select_by_visible_text("CB group")

答案 1 :(得分:0)

通过向其发送密钥来更改选择元素的一种方法。

首先找到select元素,然后向其发送密钥。您通常只需要前1-3个字母就可以从元素中获得正确的(唯一的)结果。

select_elem = browser.find_element_by_name("customViewId")
select_elem.send_keys("cu")

另一种选择是发送箭头键或类似的东西,或者在选择上执行.click(),然后从下拉列表中选择或发送键,如果发送键而不先点击则不起作用。< / p>

此外,您还可以找到与其他元素相关的元素,例如:

select_box = browser.find_element_by_name("customViewId")
option = select_box.find_element_by_xpath("/[option[@value='Custom1']]") #example only - untested for this case

最后,另一种选择是使用browser.execute_script任意执行一些JavaScript来改变元素 - 但编写JS代码来做到这一点可能超出了范围。

YMMV取决于特定页面/方法。

答案 2 :(得分:0)

我也尝试过像上面这样的各种方法来解决这个问题。 不幸的是,我无法使用上述方法解决这个问题。 但是,我的问题已经解决了使用发送点击事件到动作元素。

select = browser.find_element_by_xpath("//select[@id='reservation_period']")
for option in select.find_elements_by_xpath(".//option"):
    if option.text == "2 Days":
        option.click()
        break
    select.send_keys(Keys.ARROW_DOWN)