我是新手在Python中使用Selenium而我正在尝试访问Barclays Live网站上的索引数据。一旦我登录并加载页面,我就会尝试从页面的下拉列表中选择“Custom1”。与列表关联的HTML代码中的选择对象如下所示:
<select name="customViewId" class="formtext" onchange="submitFromSelect('username');return false;">
<option value=""> </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']]"
我的背景不是编程,如果这是一个愚蠢的问题,请放轻松。在此先感谢您的帮助。
答案 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)