I'm trying to automate an administration task, so far I have made selenium to click on an element to show a dropdown menu.
When it comes the time to click on one of those menu elements I've got an error saying that the element must be displayed.
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') 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'
As you can see the code waits a lot to get the element loaded. I've also tried to set the element's
is_displayed property to
True but didn't work neither.
Note: the element that's not displayed is the one on the xpath search, it is present because I've logged it with dir(menu)
menu variable is not the menu itself it's one of the spans that are elements of the menu,
doc is the
Perfil html element getting clicked to show the dropdown.
Inspecting the DOM on chrome tools, when you click a
doc a new menu gets created on the tree, I don't know if it's because of an ajax call or vanilla js, I don't think it's really that important how it's created. I can't retrieve it from the page and make a python object from it, it's just not being displayed at least on code.
Why don't you select an option like this
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
If your click is not firing an ajax call to populate your list, you don't actually need to execute the click.