使用selenium(python)从条件下拉列表中选择一个选项

时间:2016-01-28 17:37:38

标签: python selenium xpath

我试图在工作中自动执行某些管理任务,因此我使用selenium来操纵我们的项目管理平台(quickbase)。

我填充的第一项是select / options下拉列表,我可以使用xpath选择器选择一条记录:

driver.find_element_by_xpath("//select[@id='_fid_67']/option[@value='28']").click()

这很好用。我需要填充的下一个项目也是选择/选项下拉列表。第一个选定选项查询可用选项。在firebug中,看起来他们正在调用函数来查看第二个下拉列表中的结果。所以接下来我尝试只点击选择元素id,它应该调用函数来查询选项。然后让它等待(尝试长达10秒),然后选择选项。

# click the select element to call function
driver.find_element_by_xpath("//select[@id='_fid_74']").click()

# wait for the query function to finish
driver.implicitly_wait(2)

# select the option
driver.find_element_by_xpath("//select[@id='_fid_74']/option[@value='142']").click()

这给了我两个错误之一:

Element not found in the cache - perhaps the page has changed since it was looked up

File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 107, in check_response
    message = value["value"]["message"]
TypeError: string indices must be integers

我还尝试返回一个元素列表,循环遍历它们并检查值是否为' 142'如果是这样,请单击该元素对象。这也给了我一个错误。我尝试过使用xpath:     //select[@id='_fid_74']/option[text()='the text'] 哪个也没用。

我认为它与条件选择有关,因为相同的查询适用于第一个下拉列表(第一个代码块)。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:2)

首先,您应该使用处理select的{​​{3}},它的选项非常简单,并且抽象出复杂性:

from selenium.webdriver.support.select import Select

select = Select(driver.find_element_by_xpath("//select[@id='_fid_74']"))
select.select_by_value("142")
  

字符串索引必须是整数

这是硒2.49中的Select class。目前,您需要降级到2.48:

pip install selenium==2.48 

答案 1 :(得分:0)

使用显式等待而不是隐式等待,如下所示:

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element=wait.until(EC.element_to_be_selected((driver.find_element_by_xpath("//select[@id='_fid_74']/option[@value='142']"))))