0

Es gibt wartende und nicht wartende Funktionen in Capybara. Ich versuche, das erste so viel wie möglich zu verwenden.Wartefunktion für CSS-Element in Capybara

Gibt es eine Möglichkeit, find (oder eines seiner Derivate) zu verwenden, um nach einem CSS-Element zu suchen, das asynchron erscheint? Leider ist die Funktion page.has_css? eine nicht wartende Funktion.

+1

Die Methode 'find' wartet bereits auf das zu findende Element. Da ein Test keine Logik enthalten sollte, sollten Sie 'page.assert_selector ('# foo',: count => 1)' verwenden, um auf ein Element oder 'page.assert_selector ('# foo',: count => 0) 'auf nichts zu warten. –

+1

@FlorentB. 'page.assert_selector ('# foo',: count => 0)' würde normalerweise 'page.assert_no_selector ('# foo')' geschrieben werden, was auch Situationen wie "Stellen Sie sicher, dass es nicht 3 übereinstimmende Elemente gibt" 'page.assert_no_selector ('# foo', Anzahl: 3)' –

Antwort

2

Ihr Anspruch, dass page.has_css? eine nicht wartende Funktion ist, ist nicht korrekt. page.has_css? wird bis zu Capybara.default_max_wait_time Sekunden warten, bis ein Element auf der Seite angezeigt wird, und true oder false zurückgeben, je nachdem, ob sich das Element innerhalb dieser Zeit auf der Seite befindet oder nicht. Daher Capybara.default_max_wait_time = 5 gegeben

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

wartet darauf, bis zu 5 Sekunden. Sobald ein div mit der ID "my_div" auf der Seite sichtbar ist, wird "auf Seite" gedruckt. Wenn ein passendes Div nicht innerhalb von 5 Sekunden sichtbar wird, wird "nicht auf Seite" gedruckt. Wenn Sie es wollen, länger warten, für einen bestimmten Anruf können Sie default_max_wait_time außer Kraft setzen, indem man die :wait Option

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

Wenn anstatt eine boolean Antwort wollen Sie das Element, um sicherzustellen, existieren Sie ein

tun können
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 

, die für das Element warten, wie zuvor, erscheinen aber eher die Ausnahme als Rückkehr false erhöhen, wenn das Element nicht

wenn Sie das eigentliche Element muss nicht erscheinen können Sie uns e find was auch warten wird. So

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

warten auf das Element angezeigt werden und das Element zurückgeben, wenn gefunden. Wenn das Element nicht innerhalb von default_max_wait_time Sekunden gefunden wird, wird eine Ausnahme ausgelöst.

Hinweis: Grundsätzlich sind die einzigen nicht-Warte Methoden sind all und first und sogar diejenigen gemacht werden, um zu warten, wenn Sie in einem der Zählung Optionen übergeben (:count, :minimum, :maximum, :between), obwohl die Elemente aus zurück Sie sind immer noch nicht nachladbar und können daher weitere Verhaltenseffekte haben, wenn sie für Scoping usw. verwendet werden. Auch Methoden wie click_link, click_button usw. warten, da sie als find(...).click usw. implementiert sind.