0

Il existe des fonctions d'attente et de non-attente à Capybara. J'essaie d'utiliser le premier autant que possible.Fonction d'attente pour élément CSS dans Capybara

Existe-t-il un moyen d'utiliser find (ou l'un de ses dérivés) pour rechercher un élément CSS qui apparaît de manière asynchrone? Malheureusement, la fonction page.has_css? est une fonction non-en attente.

+1

La méthode 'find' attend déjà l'élément à trouver. Comme un test ne devrait contenir aucune logique, vous devez utiliser 'page.assert_selector ('# foo',: count => 1)' pour attendre un élément ou 'page.assert_selector ('# foo',: count => 0) 'attendre rien. –

+1

@FlorentB. 'page.assert_selector ('# foo',: count => 0)' serait normalement écrit 'page.assert_no_selector ('# foo')', qui peut également gérer des situations comme "s'assurer qu'il n'y a pas 3 éléments correspondants" - 'page.assert_no_selector ('# foo', compte: 3)' –

Répondre

2

Votre affirmation selon laquelle page.has_css? est une fonction de non-attente n'est pas correcte. page.has_css? attendra jusqu'à Capybara.default_max_wait_time secondes pour qu'un élément apparaisse sur la page et renverra true ou false selon que l'élément figure ou non sur la page dans ce délai. Par conséquent, étant donné Capybara.default_max_wait_time = 5

if page.has_css?("div#my_div") 
    puts "on page" 
else 
    puts "not on page" 
end 

attendra jusqu'à 5 secondes. Dès qu'une div avec l'identifiant de "my_div" est visible sur la page, elle sera imprimée "sur la page". Si un div correspondant ne devient pas visible dans les 5 secondes, il imprime "pas sur la page". Si vous voulez attendre plus longtemps pour un appel spécifique, vous pouvez remplacer default_max_wait_time en passant l'option :wait

if page.has_css?("div#my_div", wait: 10) # will wait up to 10 seconds 
    ... 

Si plutôt que de vouloir une réponse booléenne que vous voulez vous assurer que l'élément que vous EXISTE pouvez effectuer

page.assert_selector(:css, 'div#my_div') # :css is the default so can usually be omitted 
page.assert_css('div#my_div') # minitest 
expect(page).to have_css('div#my_div') # RSpec 

qui attendra l'élément apparaisse comme précédemment, mais soulèvent une exception plutôt que de retourner false si l'élément ne semble pas

Si vous avez besoin de l'élément réel que vous pouvez nous e find qui attendra également. Donc

el = page.find(:css, 'div#my_div') # :css is the default and can usually be omitted 

attendra que l'élément apparaisse et renvoie l'élément lorsqu'il est trouvé. Si l'élément n'est pas trouvé dans les default_max_wait_time secondes, il déclenchera une exception.

Note: En fait, les seules méthodes non-attente sont all et first et même ceux-ci peuvent être faites attendre si vous passez dans l'une des options de comptage (:count, :minimum, :maximum, :between), bien que les éléments sont revenus de elles seront toujours non rechargeables et peuvent donc avoir d'autres effets de comportement si elles sont utilisées pour la portée, etc. Même les méthodes telles que click_link, click_button, etc. attendent puisqu'elles sont implémentées en tant que find(...).click, etc