2012-03-20 10 views
42

Fondamentalmente, quello che sto cercando di fare è cliccare su un pulsante che diventa visibile quando si passa sopra un altro elemento (il suo genitore).Come emulare il passaggio del mouse con Capybara

Ho provato a utilizzare trigger.('mouseover') sul genitore del pulsante nascosto, ma non sembra funzionare.

Ecco un frammento di codice dalla spec:

# label[for ... ] -> the parent element 
page.execute_script("$('label[for=\"department_#{department.id}\"]').trigger(\"mouseover\")")  
# le hidden button 
find(".actions").click  
# some <li> on a list that drops down when clicking the hidden button  
click_on("Edit department") 

e l'errore ...

Failure/Error: click_on("Edit department") 
Selenium::WebDriver::Error::ElementNotVisibleError: 
Element is not currently visible and so may not be interacted with 

Vorrei sapere come posso fare il pulsante .actions visibile sulla pagina, in per fare clic in seguito.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

81

Capybara fornisce Element#hover method dalla versione 2.1:

find('.some_class').hover 

Questo metodo è implementato in Capybara::Selenium::Driver quasi nello stesso modo della risposta di @ AlexD.

notare che per utilizzare #hover in Selenio it's usually better to turn native events on:

Capybara.register_driver :selenium do |app| 
    profile = Selenium::WebDriver::Firefox::Profile.new 
    profile.native_events = true 
    Capybara::Selenium::Driver.new(app, :browser => :firefox, profile: profile) 
end 
+0

Perché questa non è la risposta migliore? – manu

+0

OP (poster originale) ha ottenuto la sua risposta un anno prima e l'ha accettata. Il tempo è passato e questa risposta ora è migliore, ma l'OP deve selezionarla per spostarla verso l'alto. –

+0

questo non funziona con 'Xvfb conduzione -a' :( – brauliobo

18

Alex ha descritto la soluzione di tali problemi nel suo blog: controllarlo fuori http://aokolish.me/blog/2012/01/22/testing-hover-events-with-capybara

RSpec.configure do |config| 
    # ... 
    Capybara.javascript_driver = :webkit 
end 

page.find('#element').trigger(:mouseover) 
+0

'mouseenter' risolto il mio problema alla fine – adritha84

+3

Come faccio a superare l'errore 'Capybara :: NotSupportedByDriverError'? – Hengjie

+3

@Hengjie 'page.execute_script ('$ ("# elemento") grilletto ("mouseenter")')' – Andrew

7

ho trovato un modo per simulare "passaggio del mouse" utilizzando Capybara + il driver Selenio:

module Capybara 
    module Node 
    class Element 
     def hover 
     @session.driver.browser.action.move_to(self.native).perform 
     end 
    end 
    end 
end 
+0

Dove posizioni questo file? – Hengjie

+1

Se si dispone di un 'spec_helper.rb' comune o' test_helper.rb' o qualcosa di simile che è condiviso da tutti i file di test, si può mettere lì. –

4

Utilizzando Capybara + selenio è possibile usare "hover" con questo comando:

page.driver.browser.action.move_to(page.find('YourElement').native).perform 
Problemi correlati