2011-07-21 12 views
5

Uso Selenium 2 WebDriver en Ruby.Selenium2 WebDriver Ruby => cómo hacer clic en un enlace oculto

¿Cómo es posible, haga clic en el enlace oculto, con css (mostrar: ninguno)? el enlace es un submenú y está visible cuando el mouse pasa al menú.

// EDIT:

Selenium::WebDriver::Error::NoSuchElementError: Unable to locate element: {"method":"link text","selector":"submenu2"} 

I cambiado ': id' a ': LINK_TEXT', debido a que el submenú no tienen identificadores. la navegación:

<ul id="nav-main"> 
-<li class="menu active"> 
    <p> 
     <a href="/menu1">menu1</a> 
    </p> 
    -<ul> <-- begin display:none 
    -<li> 
     <p> 
      <a href="/submenu1">submenu1</a> 
     </p> 
     </li> 
    +<li> 
    </ul> <--end submenu 
    </li> 
</ul> 

se puede ver el submenú, cuando el menú encima del ratón. Antes no existe el submenú para el controlador web.

con el código seguido Veo el enlace del menú 1 en FF abajo a la izquierda, pero el submenú no se abre y se rompe con un error de tiempo de espera.

menu = @driver.find_element(:link_text => "menu") 
@driver.action.move_to(menu).perform 
wait.until { 
    @driver.find_element(:link_text => "submenu").click 
} 

Respuesta

5

WebDriver emula las acciones del usuario y no permite hacer clic en los elementos que un usuario no podría hacer clic.

Así que debe hacer lo que haría un usuario: mueva el mouse sobre el menú antes de hacer clic. En Rubí se podría hacer ej .:

menu = driver.find_element(:id => "menu") 
submenu = driver.find_element(:id => "submenu") 

driver.action.move_to(menu).click(submenu).perform 

La clase ActionBuilder (devuelto por la acción del conductor #) está documentada here.

+0

lo siento, pero tengo un error. vea EDIT en mi pregunta – Andrej

+0

Suena muy razonable pero no funciona en mi caso. El submenú se muestra mediante li: hover {display: block} y sigo obteniendo ElementNotDisplayedError en WebDriver. – zergu

1

antes de buscar el enlace y haga clic en él

@driver.execute_script('jQuery(":hidden","#nav-main").show()') 

jQuery debe ser cargado

0

En el pasado, si no he tenido mucha suerte con los métodos ActionBuilder, acabo de utilizar JavaScript puro:

def mouse_over_and_out(element) 
    @driver.execute_script("if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}", element) 
    yield element 
    @driver.execute_script("if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseout', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseout');}", element) 
end 

def wait_for_visibility(element) 
    wait = Selenium::WebDriver::Wait.new(:timeout => 15) 
    wait.until do 
    element.visible? 
    end 
    element 
end 

mouse_over_and_out(@driver.find_element(:css => "ul#nav-main li")) do |menu| 
    submenu = menu.find_element(:css => "ul li a") 
    wait_for_visibility(submenu).click 
end 
Cuestiones relacionadas