Selenium2 WebDriver Ruby =>如何点击隐藏的链接

我在Ruby上使用Selenium 2 WebDriver。

如何点击隐藏的链接,用css(显示:无)? 链接是子菜单,鼠标hover在菜单上时可见。

//编辑:

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

我将’:id’更改为’:link_text’,因为子菜单没有id。 导航:

  

当鼠标hover菜单时,您可以看到子菜单。 以前webdriver的子菜单不存在。

跟随代码我看到FF左下方menu1中的链接,但是子菜单没有打开并且因超时错误而中断。

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

WebDriver模拟用户操作,不允许单击用户无法单击的元素。

所以你应该做用户会做的事情:在点击之前将鼠标hover在菜单上。 在Ruby中你可以做到:

 menu = driver.find_element(:id => "menu") submenu = driver.find_element(:id => "submenu") driver.action.move_to(menu).click(submenu).perform 

这里记录了ActionBuilder类(由Driver#action返回)。

在搜索链接并单击它之前

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

应该加载jQuery

在过去,如果我对ActionBuilder方法没有太多运气,我只使用纯javascript:

 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