我试图在工作中自动执行某些管理任务,因此我使用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']
哪个也没用。
我认为它与条件选择有关,因为相同的查询适用于第一个下拉列表(第一个代码块)。
有人有什么建议吗?
答案 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']"))))