Sto tentando di automatizzare un'attività di amministrazione, finora ho fatto in modo che il selenio faccia clic su un elemento per mostrare un menu a discesa.Fare clic su un menu a tendina con Selenium Webdriver
Quando arriva il momento di fare clic su uno di questi elementi di menu ho un errore che dice che l'elemento deve essere visualizzato.
Codice:
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()
Errore:
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'
Come si può vedere il codice attende molto per ottenere l'elemento caricato. Ho anche provato a impostare la proprietà is_displayed
dell'elemento su True
ma non ha funzionato neanche.
Nota: l'elemento che non è visualizzato è quello sulla ricerca XPath, è presente perché ho collegato con dir (menu)
Edit:
La variabile menu
non è il menu stesso è uno degli span che sono elementi del menu, doc
è l'elemento html Perfil
che viene cliccato per mostrare il menu a discesa.
Edit 2:
Ispezione del DOM su strumenti di cromo, quando si fa clic su un doc
un nuovo menu viene creato sul legno della croce, non so se è a causa di una chiamata AJAX o js vaniglia, Non penso sia davvero così importante come sia stato creato. Non riesco a recuperarlo dalla pagina e creare un oggetto python da esso, non viene visualizzato almeno sul codice.
Edit finale:
ho finito per l'esecuzione di alcune Javascript per farlo funzionare. Apparentemente, quando il selenio trova la voce di menu, il primo elemento che attiva il menu a discesa perde la messa a fuoco e rende di nuovo il menu invisibile, se non selezioni una voce di menu e attendi per qualche istante che il menu a discesa sia ancora mostrato, se prova a selezionare un elemento dal menu, il menu scompare.
Perché dormite su entrambi i lati dell'elemento di ricerca 'menu'?Se l'elemento non è visibile quando si recupera l'elemento della pagina, il webdriver non sarà in grado di fare clic su di esso, indipendentemente dalla durata dell'attesa. –
@ sr2222 La pagina viene recuperata quando si chiama driver.get(), il menu a discesa viene visualizzato sullo schermo e presente nell'albero dei dom quando si fa doc.click(), ho appena eliminato la possibilità che il menu a discesa non venga caricato veloce come il codice viene eseguito. L'elemento del menu è presente e visibile, almeno per gli umani, posso garantirlo. – loki
Prova a estrarre 'doc' nuovamente dopo aver fatto clic e attendi che il menu venga visualizzato, e confronta l'attributo' id' degli oggetti da prima e dopo. Ho un vago sospetto che il server di selenio stia effettivamente facendo riferimento a un oggetto webelement memorizzato nella cache sulla seconda estrazione di elementi (poiché l'azione di clic non attiva un evento di caricamento della pagina, l'oggetto della pagina non diventa obsoleto). –