Ich benutze RSpec2 und Capybara für die Abnahmeprüfung.
Ich möchte behaupten, dass der Link in Capybara deaktiviert ist oder nicht. Wie kann ich das machen?
Wie kann der Link deaktiviert werden? Ist es eine Klasse, die Sie hinzufügen? Ein Attribut?
# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")
# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")
# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible
Die tatsächlichen Xpath-Selektoren sind möglicherweise falsch. Ich benutze xpath nicht oft!
Eine andere einfache Lösung ist, mit []
auf das gewünschte HTML-Attribut zuzugreifen:
find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"
find('a#my_element')['href']
# => "http://example.com
# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""
Beachten Sie, dass Capybara
automatisch versucht, auf das Ende asynchroner Anforderungen zu warten. In einigen Fällen kann dies jedoch nicht funktionieren:
Hier ist eine Problemumgehung, wenn Sie Probleme mit Assertions für Elemente haben, die asynchron aktualisiert werden:
Es war ein bisschen chaotisch, den richtigen xpath herauszufinden, hier ist der richtige,
unter Verwendung von Capybara 0.4.1.1
# <a href="/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>
page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")
Wenn Sie nur einen Link ohne Klasse haben, verwenden Sie
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
So etwas wird leider nicht funktionieren:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
Die Klassenoption wird ignoriert.
Ich empfehle die Verwendung von have_link
und find_link(name)[:disabled]
in zwei separaten Assertions. Die zweite Aussage ist zwar einfacher durchzuführen, macht jedoch Fehlermeldungen zu fehlenden Links schöner, sodass Ihre Testergebnisse leichter lesbar sind.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
Beachten Sie, dass "Example"
in den Namen oder die ID des Links geändert werden kann.
Wann immer möglich, sollten Sie versuchen, die von Capybara bereitgestellten Wrapper zu verwenden, die konsistenter für alle Treiber funktionieren.
Für den speziellen Fall disabled
wurde in 2.1 ein Wrapper eingeführt: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210
Wenn Sie es verwenden, erhalten Sie sowohl bei RackTest als auch bei Poltergeist vernünftige Ergebnisse:
HTML:
<input type="text" id="disabled-false" ></div>
<input type="text" id="disabled-true" disabled></div>
<input type="text" id="disabled-js-true" ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
document.getElementById('disabled-js-true').disabled = true
document.getElementById('disabled-js-false').disabled = false
</script>
Tests:
!all(:field, 'disabled-false', disabled: false).empty? or raise
all(:field, 'disabled-false', disabled: true ).empty? or raise
all(:field, 'disabled-true', disabled: false).empty? or raise
!all(:field, 'disabled-true', disabled: true ).empty? or raise
all(:field, 'disabled-js-true', disabled: true ).empty? or raise
all(:field, 'disabled-js-false', disabled: false).empty? or raise
Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false', disabled: false).empty? or raise
all(:field, 'disabled-false', disabled: true ).empty? or raise
all(:field, 'disabled-true', disabled: false).empty? or raise
!all(:field, 'disabled-true', disabled: true ).empty? or raise
!all(:field, 'disabled-js-true', disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise
Beachten Sie, wie die Javascript-Tests ohne CSS-Selektoren funktionieren, wenn Sie einen Js-fähigen Treiber verwenden.
Run-Testdatei hier .
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link erwartet einen Hash von Optionen, der leer ist, wenn Sie keine angeben. Sie können alle Attribute angeben, die der Link haben soll - stellen Sie sicher, dass Sie alle Optionen in EINEM Hash übergeben.
Hoffe das hilft
PS: Bei Attributen wie data-method müssen Sie den Attributnamen als Zeichenfolge übergeben, da der Bindestrich das Symbol unterbricht.
Entsprechend the docs können Sie die Accessor-Syntax [attribut] verwenden:
find('#selector')['class'] => "form-control text optional disabled"
Für Behinderte können Sie auch Folgendes tun:
expect(find('#selector').disabled?).to be(true)
Mit der Syntax von Rspec3 habe ich es so gemacht:
expect(page).not_to have_selector(:link_or_button, 'Click here')
Sie können einfach die page.has_css?
-Methode verwenden
page.has_css?('.class_name')
dies gibt true
zurück, wenn ein Element vorhanden ist.
Führen Sie eine auf Validierung basierende Aktion aus.
page.has_css?('.class_name') do
#some code
end
bowsersenior , danke für einen Hinweis
Eine andere einfache Lösung besteht darin, auf das HTML-Attribut zuzugreifen, das Sie mit [] suchen.
Hier ist ein Beispiel:
let(:action_items) { page.find('div.action_items') }
it "action items displayed as buttons" do
action_items.all(:css, 'a').each do |ai|
expect(ai[:class]).to match(/btn/)
end
end