Capybara non riconosce elementi DOM aggiunti dinamicamente?
-
28-09-2019 - |
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.
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