2011-07-21 1 views
5

RubyでSelenium 2 WebDriverを使用します。Selenium2 WebDriver Ruby =>隠しリンクをクリックする方法

css(表示:なし)で隠しリンクをクリックする方法はありますか? リンクはサブメニューであり、メニュー上にマウスを重ねると表示されます。

// EDIT:サブメニューは何のIDを持っていないため、 ':ID' から 'LINK_TEXTを' 私が変わっ

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

。 ナビゲーション:

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

答えて

5

WebDriverはユーザーの操作をエミュレートし、ユーザーがクリックできない要素をクリックすることはできません。

これで、ユーザーが行う操作を行う必要があります。クリックする前にメニューにマウスを重ねる。 Rubyでは、あなたは:

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

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

hereを文書化されている(ドライバー#アクションによって返された)ActionBuilderクラスを例えば行うことができます。

+0

申し訳ありませんが、私にはエラーがあります。 私の質問で編集を参照してください – Andrej

+0

非常に合理的な音が、私の場合は動作していません。サブメニューはli:hover {display:block}で表示され、WebDriverでElementNotDisplayedErrorを取得します。 – zergu

1

リンクを検索し、それを

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

をクリックする前にjQueryのは、私がActionBuilder方法で多くの幸運を持っていなかった場合、私はちょうど純粋なJavaScriptを使用して、過去に

0

をロードする必要があります。

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 
関連する問題