2012-09-12 56 views
9

我试图自动化管理任务,到目前为止,我已经让硒点击一个元素来显示下拉菜单。点击与Selenium Webdriver下拉元素菜单

enter image description here

当谈到点击这些菜单元素我有一个错误,指出该元素必须显示的一个时间。

代码:

driver = webdriver.Chrome() 
driver.implicitly_wait(10) 
driver.get(url) 
doc = driver.find_element_by_css_selector('td.ms-vb-title > table') 
try: 
    doc.click() 
    time.sleep(4) 
    menu = driver.find_element_by_xpath('//menu/span[5]') 
    time.sleep(4) 
    print dir(menu) 
    menu.click() 
except: 
    traceback.print_exc() 
    driver.quit() 

错误:

Traceback (most recent call last): 
    File "aprobar_docs.py", line 22, in main 
    menu.click() 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", 
line 52, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", 
line 205, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", l 
ine 156, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py" 
, line 147, in check_response 
    raise exception_class(message, screen, stacktrace) 
ElementNotVisibleException: Message: u'Element must be displayed to click' 

正如你所看到的代码等待了很多获得元素加载。我也尝试将元素的is_displayed属性设置为True,但都没有工作。

注:这不是显示的元素是在XPath的搜索的一个,它是存在,因为我已经与DIR(菜单)登录它

编辑:

menu变量不菜单本身是菜单元素的跨度之一,docPerfil html元素获得点击以显示下拉菜单。

编辑2:

检查在Chrome工具DOM,当你点击一个doc一个新的菜单大干快上树创建的,我不知道这是否是因为Ajax调用或香草JS的,我不认为这是如此重要的创建。我无法从页面中检索它,并从中创建一个python对象,它至少在代码中不显示。

最后编辑:

我结束了在执行一些JavaScript,使其工作。显然,当Selenium发现菜单项时,触发菜单下拉菜单的第一个元素会失去焦点,并且它会使菜单再次不可见,如果您没有选择菜单项并等待一段时间仍然显示菜单下拉列表,则可以尝试从菜单中选择一个元素,菜单消失。

+1

你为什么睡在'menu'元素查找的两面?如果元素在检索页面元素时不可见,无论您等待多久,webdriver都将无法点击它。 –

+0

@ sr2222当您调用driver.get()时,会检索页面,当您执行doc.click()时,下拉列表将显示在屏幕上并显示在dom树上,我只是消除了未加载下拉菜单的可能性与代码执行一样快。菜单元素存在并可见,至少对人类来说,我可以保证。 – loki

+0

尝试在单击并等待菜单显示后再次提取'doc',并比较前后对象的id属性。我怀疑selenium服务器实际上是在第二次元素提取时引用缓存的webelement对象(因为您的点击操作不会触发页面加载事件,页面对象不会过时)。 –

回答

8

你为什么不选择这样的

el = driver.find_element_by_id('id_of_select') 
for option in el.find_elements_by_tag_name('option'): 
    if option.text == 'The Options I Am Looking For': 
     option.click() # select() in earlier versions of webdriver 

一个选项,如果你的点击是不触发Ajax调用来填充你的列表,你实际上并不需要执行点击。

+0

@Nllesh Sharma我使用这种方法,但我得到的错误是web元素对象不可迭代。如何在for循环中迭代它,如果它不可迭代 – abhi

+0

@abhi您确定使用find_elementSSSSS_by_tag_name()吗? (只是为了确保你看到了这个嘿嘿) –

0

您需要找到目标的链接。你不要真的点击元素,你点击链接...(或者说,你点击元素与链接里面)。话虽如此,点击链接的最有效的方法是隔离链接元素。

frame = driver.find_element_by_id('this_is_your_frame_name') 
links = frame.find_elements_by_xpath('.//a') 
links[1].click() 

或替代,

for link in links: 
    if link.text() == "Administratar Permisos": 
     link.click() 
相关问题