Domanda

mi sembra di avere problemi testare i javascript cose chiazza di petrolio che faccio con jQuery quando si utilizza Capybara e selenio. Il comportamento previsto è per una forma da generare dinamicamente quando un utente fa clic sul collegamento "risorsa add". Capybara sarà in grado di fare clic sul collegamento, ma non riesce a riconoscere i nuovi elementi del modulo (vale a dire "risorsa [name]").

C'è un modo per ricaricare il DOM per Capybara, o c'è qualche elemento di questo gioiello che ho appena non ho imparato ad ora?

Grazie in anticipo!

== Modifica ==

Al momento provare la mia fortuna con il selenio di:

wait_for_element 

metodo.

== Modifica ==

Continuo a ricevere un " 'wait_for_element` metodo non definito per la classe nill" quando si tenta di fare quanto segue:

@selenium.wait_for_element

Sembra che quel metodo specifico, o forse wait_for con un enorme selettore di accesso alla elemento DOM mi aspetto è il modo corretto di agire, ma ora cercando di ottenere la sessione di selenio sta cominciando a essere un enorme mal di testa.

È stato utile?

Soluzione

Io uso il driver WebDriver based per Capybara in RSpec, che ho configurare e utilizzare come questo e sarà sicuramente gestire JS e non ha bisogno di un ricaricamento della dom. La chiave sta usando una wait_until e una condizione che sarà vero quando la vostra risposta AJAX è terminato.

before(:each) do
  select_driver(example)  
  logout
  login('databanks') 
end

 def select_driver(example)
   if example.metadata[:js]
    Capybara.current_driver = :selenium
  else
    Capybara.use_default_driver
  end
end

it "should let me delete a scenario", :js=>true do
    select("Mysite Search", :from=>'scenario_id')  
    wait_until{ page.has_content?('mysite_searchterms')}    
    click_on "delete"     
    wait_until{ !page.has_content?('mysite_searchterms')}   
    visit '/databanks'
    page.should_not have_content('Mysite Search')
  end

Ho anche capito un hack per rallentare WebDriver ieri sera, in questo modo, se si desidera guardare le cose in slo-mo:

   #set a command delay
   require 'selenium-webdriver'

   module ::Selenium::WebDriver::Remote
     class Bridge
       def execute(*args)
         res = raw_execute(*args)['value']
         sleep 0.5
         res
       end
     end
   end  

Come qualcun altro ha detto, se hai trovato un timeout in attesa per l'elemento, si poteva guardare aumentando in questo modo:

Capybara.default_wait_time = 10

Altri suggerimenti

Dalla documentazione Capybara:

  

Quando si lavora con asincrono   JavaScript, si potrebbe incontrare   situazioni in cui si sta tentando di   interagire con un elemento che non è   ma presente nella pagina. Capybara   si occupa automaticamente con questo   attesa di elementi a comparire sulla   pagina.

Si potrebbe avere una certa fortuna aumentando il tempo di attesa:

Capybara.default_wait_time = 10

Se questo non aiuta, allora vi sarebbe encorage a contatto qualcuno dal progetto su GitHub, scrittura alla mailing list o presentare una relazione problema.

Anche wait_until eliminato dal Capybara 2.0. Ancora che è utile e afferrare il codice da sotto:

 def wait_until(delay = 1)   
 seconds_waited = 0   
 while ! yield && seconds_waited < Capybara.default_wait_time     
    sleep delay     
    seconds_waited += 1   
  end   
  raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield 
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top