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

时间:2011-07-21 14:41:57

标签: ruby webdriver selenium-webdriver

我在Ruby上使用Selenium 2 WebDriver。

如何点击隐藏链接,用css(display:none)? 链接是子菜单,鼠标悬停在菜单上时可见。

//编辑:

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

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

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

鼠标悬停菜单时,您可以看到子菜单。以前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
}

3 个答案:

答案 0 :(得分:5)

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

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

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

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

ActionBuilder类(由Driver#action返回)记录为here

答案 1 :(得分:1)

在搜索链接并单击之前

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

应该加载jQuery

答案 2 :(得分:0)

过去,如果我对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