我试图自动化管理任务,到目前为止,我已经让硒点击一个元素来显示下拉菜单。点击与Selenium Webdriver下拉元素菜单
当谈到点击这些菜单元素我有一个错误,指出该元素必须显示的一个时间。
代码:
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
变量不菜单本身是菜单元素的跨度之一,doc
是Perfil
html元素获得点击以显示下拉菜单。
编辑2:
检查在Chrome工具DOM,当你点击一个doc
一个新的菜单大干快上树创建的,我不知道这是否是因为Ajax调用或香草JS的,我不认为这是如此重要的创建。我无法从页面中检索它,并从中创建一个python对象,它至少在代码中不显示。
最后编辑:
我结束了在执行一些JavaScript,使其工作。显然,当Selenium发现菜单项时,触发菜单下拉菜单的第一个元素会失去焦点,并且它会使菜单再次不可见,如果您没有选择菜单项并等待一段时间仍然显示菜单下拉列表,则可以尝试从菜单中选择一个元素,菜单消失。
你为什么睡在'menu'元素查找的两面?如果元素在检索页面元素时不可见,无论您等待多久,webdriver都将无法点击它。 –
@ sr2222当您调用driver.get()时,会检索页面,当您执行doc.click()时,下拉列表将显示在屏幕上并显示在dom树上,我只是消除了未加载下拉菜单的可能性与代码执行一样快。菜单元素存在并可见,至少对人类来说,我可以保证。 – loki
尝试在单击并等待菜单显示后再次提取'doc',并比较前后对象的id属性。我怀疑selenium服务器实际上是在第二次元素提取时引用缓存的webelement对象(因为您的点击操作不会触发页面加载事件,页面对象不会过时)。 –