Selenium2 WebDriver Ruby => как нажать на скрытую ссылку - PullRequest
5 голосов
/ 21 июля 2011

Я использую Selenium 2 WebDriver на Ruby.

Как можно нажать на скрытую ссылку с помощью css (отображение: нет)?ссылка находится в подменю и отображается при наведении указателя мыши на меню.

// РЕДАКТИРОВАТЬ:

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

Я изменил ': id' на ': link_text', потому что подменю не имеет идентификаторов,Навигация:

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

Вы можете увидеть подменю, когда наведено меню.Раньше подменю для веб-драйвера не существовало.

с последующим кодом Я вижу ссылку из меню 1 слева внизу FF, но подменю не открывается и прерывается из-за ошибки тайм-аута.

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

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

WebDriver эмулирует действия пользователя и не позволяет щелкать элементы, которые пользователь не сможет щелкнуть.

Поэтому вы должны сделать то, что сделал бы пользователь: наведите курсор мыши на меню перед щелчком.В Ruby вы можете сделать, например:

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

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

Класс ActionBuilder (возвращаемый действием Driver #) задокументирован здесь .

1 голос
/ 27 июля 2011

, прежде чем искать ссылку и щелкнуть по ней

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

jQuery должен быть загружен

0 голосов
/ 29 марта 2013

В прошлом, если мне не очень везло с методами 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...