it-swarm.com.de

capybara Attribute eines Elements geltend machen

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?

84
kriysna

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!

91
idlefingers

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:

141
bowsersenior

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.

4
Clint

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.

4
Nick McCurdy

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. 

1
kaikuchn

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)
0
pixelearth

Mit der Syntax von Rspec3 habe ich es so gemacht:

expect(page).not_to have_selector(:link_or_button, 'Click here')
0
Camilo Sad

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
0
Aravin

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
0
18augst