2012-08-16 7 views
15

Mit Gurke und Capybara, gibt es eine Möglichkeit zu überprüfen, dass eine Zeichenfolge nicht auf einer Seite vorhanden ist?Gurke/Capybara: überprüfen Sie, dass eine Seite keinen Inhalt hat?

Zum Beispiel, wie würde ich das Gegenteil von diesem Schritt schreiben:

Then /^I should see "(.*?)"$/ do |arg1| 
    page.should have_content(arg1) 
end 

Dies passiert, wenn arg1 vorhanden ist.

Wie würde ich einen Schritt schreiben, schlägt fehl, wenn arg1 gefunden wird?

Antwort

24

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_no_text%3F-instance_method

Es gibt eine has_no_content Matcher in Capybara. So können Sie schreiben

Then /^I should not see "(.*?)"$/ do |arg1| 
    page.should have_no_content(arg1) 
    end 
+1

Ich bin erstaunt, wie viel schneller das ist als 'assert! Page.has_content? (Arg)' –

+0

@MichaelDiscenza, Sie haben Recht, finden Sie weitere Informationen - https://github.com/ngauthier/capybara-slow_finder_errors –

-3

Oh, warte, ich habe es herausgefunden. Dies funktioniert:

Then /^I should see "(.*?)"$/ do |arg1| 
    page.has_content?(arg1) == false 
end 
+5

Ihr Code behauptet nicht den Inhalt. Ich denke, wenn Sie falsch für wahr ändern, wird Ihr Test noch bestehen. –

+0

Das hatte mich mehrmals gestolpert. Entweder verwenden Sie 'assert page.has_content ...' oder 'page.should have_content ...' Kann die beiden Stile nicht miteinander kombinieren. Guter Anruf, @ PhilippeRathé. – Tass

8

Sie auch should_not verwenden können, wenn Sie es wollen etwas besser lesen:

Then /^I should not see "(.*?)"$/ do |arg1| 
    page.should_not have_content(arg1) 
end 

Einige weitere Informationen: https://www.relishapp.com/rspec/rspec-expectations/docs

+0

Beachten Sie, dass Dies funktioniert nur bei JavaScript-Tests, wenn Sie Capybara :: RSpecMatchers für Ihre Spezifikation installiert haben. Ich bin hier nur auf dieses Problem gestoßen: http://StackOverflow.com/a/15253235/125377 – Ari

+11

Verwenden Sie 'has_no_content?' Stattdessen. Das wird Capybaras interne Wartezeit auslösen. Andernfalls wird es vorzeitig fehlschlagen, wenn Sie darauf warten, dass der Inhalt von der Seite verschwindet. – keithepley

3

zur Zeit, können Sie verwenden:

Then /^I not see "(.*?)"$/ do |arg1| 
    expect(page).to have_no_content(arg1) 
end 

Und wenn der Inhalt auf der Seite gefunden wird, Ihr Test ist

+0

Dies ist die korrekte Syntax. Wenn Sie expect() verwenden, würde ich Ihre Spezifikation umschreiben, indem Sie "sollte" aus der Beschreibung entfernen. Durchsetzungsfähiger! :) – Rimian

+0

Danke @Rimian. Das habe ich behoben! –

10

In Rspec 3.4 derzeit rot (2016) dies der empfohlene Weg ist zu prüfen, für nicht-Gehalt:

expect(page).not_to have_content(arg1) 
+0

Wo sehen Sie, dass dies über 'expect (page) .to have_no_content (arg1)' empfohlen wird? Es scheint so, als ob es nicht möglich ist, dass not_to nicht darauf wartet, dass der Inhalt auf der Seite erscheint, was 'have_content' tun würde, würde ich denken. – Ibrahim

+0

Verfallswarnungen werden angezeigt, wenn'expect (Seite) .to have_no_content (arg1) ' –

+0

@RobHughes verwendet wird, die Abschreibungswarnungen, von denen Sie sprechen, müssen in rspec 3.5.4/capybara 2.6.2 entfernt worden sein. Pro docs: https://github.com/teamcapybara/capybara#asynchronous-javascript-ajax-and-friends - "Capybaras RSpec-Matcher sind jedoch schlau genug, um mit beiden Formen umzugehen. Die beiden folgenden Anweisungen sind funktional äquivalent: expect (Seite) .not_to have_xpath ('a'), expect (Seite) .to have_no_xpath ('a') ' – seanriordan08