2012-09-12 112 views
9

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

enter image description here

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.

+1

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. –

+0

@ 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

+0

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). –

Respuesta

8

¿Por qué no seleccionar una opción como esta

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 

Si el clic no está disparando una llamada AJAX para poblar su lista, que en realidad no necesita ejecutar el clic.

+0

@Nllesh Sharma Utilicé este enfoque, pero me aparece un error de que el elemento del elemento web no es iterable. ¿Cómo se está iterando sobre él en el ciclo for si no es iterable? – abhi

+0

@abhi ¿Está seguro de usar find_elementSSSSS_by_tag_name()? (solo para estar seguro de que viste eso S jeje) –

0

Necesita encontrar el enlace del objetivo. Usted no realmente hace clic en elementos, hace clic en enlaces ... (o más bien, hace clic en elementos con enlaces dentro de ellos). Dicho esto, la forma más segura de hacer clic en un enlace es aislar el elemento de enlace.

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

o, alternativamente,

for link in links: 
    if link.text() == "Administratar Permisos": 
     link.click() 
Cuestiones relacionadas