2011-12-19 24 views
4

私がテストしているアプリは、最初に隠された要素がいくつかあります。あなたは.btn_thread_options要素の上に置くとCapybaraセレンドライバ、要素をホバリング

.thread_options{ 
    display: none; 
} 
.btn_thread_options:hover .thread_options{ 
    display: inline; 
} 

、いくつかのリンクが表示されて、私はカピバラがクリックしたいこと:別の要素の上にマウスを移動するとき彼らはCSSを経由して表示されます。 click_link "Send Response"を使用して何もせずにこれらをクリックしようとすると、私にエラーを与える:

Failure/Error: click_link("Send Response") 
Selenium::WebDriver::Error::ElementNotVisibleError: 
    Element is not currently visible and so may not be interacted with 

page.execute_script("$('.btn_thread_options').trigger('mouseover')") 

が(同じ結果)のいずれかを動作しないようにそれをクリックする他の方法を使用しようとしています。

NORマウスオーバーするためにそれを強制しようとする最初の項目をクリックするん:

page.find(".btn_thread_options").click 

が、これは正常に動作するために取得する方法はありますか?

+0

必要がありますか?または、不透明度を0に設定すれば十分ですか?そうでない場合は、jquery show()をクリックする前に削除し、hide()を削除するステップを実行します。 – Gazler

+0

隠し要素がフォームを送信するので、私は 'opacity:0'は実際には機能しないと思います。私は人々が間違って空白に見えるものをクリックしてしまわないようにします。 。今のところ私の回避策は、あなたが言及しているように、mouseoverとmouseoutでjqueryで非表示にすることです...しかし、私はちょうどCSSでそれを保つことができたらうれしいでしょう:p – nzifnab

答えて

6

これはカピバラへaddedされています:なし:あなたは、ディスプレイを

find(:css, "#menu").hover 
+0

お知りになりたい!あなたは2年前からこの疑問を突き止めたにもかかわらず、私はまだそれが将来役に立つと思うでしょう:) – nzifnab

+0

jsを実行することによってそれを偽造するよりも良い方法です!ありがとう! –

3

マウスオーバーするのではなく、直接要素を表示してみることができます。

page.execute_script("$('.thread_options').css('display','inline')") 

おそらくignore_hidden_elementsの設定も調べてください。デフォルトはfalseですが、おそらくtrueに設定されています。

または、表示なしの代わりに、マージンを大きな負の値に設定します。

/* Move the element off the screen */ 
.thread_options{ 
    margin: -9999px 0 -9999px 0; 
} 
/* Set the desired display margins 
.btn_thread_options:hover .thread_options{ 
    margin: 10px 0 10px 0; 
} 
+0

私はそれが私のために働いたので、 、execute_script wth css 'display'、 'block' – JohnMerlino

+1

私は本当にユーザーの行動を模倣していないので、この回答には満足していません...しかし、それは私が正しく働くことができる唯一のものです。他の解決策は定期的に失敗するでしょう。しかし、私は何も得られていないので、私はそれを受け入れます:p – nzifnab

1

私は、Capybara + the Seleniumドライバを使用して「マウス・ホバー」をシミュレートする方法を見つけました。このコードは、私のために働いている:

module Capybara 
    module Node 
    class Element 
     def hover 
     @session.driver.browser.action.move_to(self.native).perform 
     end 
    end 
    end 
end 
関連する問題