Estoy tratando de automatizar una tarea de administración, hasta ahora he hecho que el selenio haga clic en un elemento para mostrar un menú desplegable.Haga clic en un menú del elemento desplegable con Selenium Webdriver
Cuando llegue el momento de hacer clic en uno de los elementos de menú que tengo un error que indica que el elemento se debe mostrar.
Código:
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()
error:
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'
Como se puede ver el código espera mucho para conseguir el elemento cargado. También intenté establecer la propiedad del elemento is_displayed
en True
, pero no funcionó.
Nota: el elemento que no se muestra es la que está en la búsqueda de XPath, que está presente porque he conectado con dir (menú)
Editar:
La variable menu
no es el menú en sí es uno de los tramos que son elementos del menú, doc
es el elemento Perfil
html que se hace clic para mostrar el menú desplegable.
Edición 2:
Inspección de la DOM en las herramientas de cromo, al hacer clic en un doc
un nuevo menú se crea en el árbol, no sé si es porque de una llamada AJAX o js vainilla, No creo que sea realmente tan importante cómo se creó. No puedo recuperarlo de la página y hacer un objeto de Python a partir de él, simplemente no se muestra al menos en el código.
edición final:
que terminó la ejecución de código JavaScript para hacer que funcione. Aparentemente, cuando Selenium encuentra el elemento del menú como el primer elemento que activa el menú desplegable, pierde el foco y vuelve invisible el menú; si no selecciona un elemento del menú y espera durante un tiempo, se muestra el menú desplegable, si intente seleccionar un elemento del menú; el menú desaparece.
por qué estás durmiendo en ambos lados de la 'de búsqueda elemento menu'?Si el elemento no está visible cuando recupera el elemento de página, webdriver no podrá hacer clic en él, sin importar cuánto espere. –
@ sr2222 La página se recupera cuando llamas a driver.get(), el menú desplegable se muestra en la pantalla y aparece en el árbol dom cuando haces doc.click(), simplemente eliminé la posibilidad de que no se cargara el menú desplegable tan rápido como se ejecuta el código. El elemento del menú está presente y visible, al menos para los humanos, puedo garantizarlo. – loki
Trate de extraer 'doc' de nuevo después de hacer clic y esperar a que se muestre el menú, y compare el atributo' id' de los objetos anteriores y posteriores. Tengo una sospecha furtiva de que el servidor de selenio está haciendo referencia a un objeto webelement en caché en la extracción de su segundo elemento (dado que su acción de clic no desencadena un evento de carga de página, el objeto de página no se queda obsoleto). –