kapibara bir elemanın niteliklerini ileri sürer


87

Kabul testi için RSpec2 ve Capybara kullanıyorum.

Capybara'da bağlantının devre dışı olup olmadığını belirtmek isterim. Bunu nasıl yapabilirim?

Yanıtlar:


91

Bağlantıyı nasıl devre dışı bırakıyorsunuz? Eklediğiniz bir sınıf mı? Bir nitelik mi?

# 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

Gerçek xpath seçicileri yanlış olabilir. Xpath'i çok sık kullanmıyorum!


Teşekkürler @idlefingers, xpath kullanarak da iddia etmek istiyorum. Bunu nasıl yapabilirim?
kriysna

Cevabımı güncelledim. Xpath seçicileri yanlışsa, biraz googling yapmanız veya yeni bir soru açmanız gerekir.
idlefingers

Capibara görünümlerle çalışmak için yapılmadığından, bunun görünüm testi için çalışmayacağını unutmayın. (Webrat.)
Peter Ehrlich

145

Diğer bir basit çözüm, aradığınız HTML özelliğine erişmektir []:

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']
# => ""

Not Capybaraotomatik olarak sona asenkron istekleri için beklemek çalışacağız, ancak bazı durumlarda çalışmayabilir:

Eşzamansız olarak güncellenen öğelerle ilgili iddialarda sorun yaşıyorsanız işte bir geçici çözüm:


4
Vrey kullanışlı çözüm. Teşekkürler!
Alexander Kuznetsov

Css konumu olan bir dizem var, örn. find('a#my_element[href]'), bu özelliğin değerini almak mümkün olabilir mi? Gibi find('a#my_element[href]').valueama işe yaramıyor gibi ifadelerle denemek :(
mickael

@mickael Deneyin find('a#my_element[href]').textveya find('a#my_element[href]').native. Bunlardan biri beklediğiniz sonuçları verirse bana bildirin.
bowsersenior

1
Bu yorumların gerçekten eski olduğunun farkındayım, ancak şu şekilde kullandım: page.find ('# my_element') ['href = "<href_value>"'] ve çok işe yaradı
Dono

Zaman uyumsuz bir değişiklikle ilgili bir iddiada bulunmak istiyorsanız, bu sorgunun gerçekleşmesini beklemeyecektir.
sj26

4

Doğru
xpath'i bulmak biraz dağınıktı, işte doğru olan, capybara 0.4.1.1 kullanarak

# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>  

page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")

Yalnızca sınıfsız bir bağlantınız varsa, şunu kullanın:

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')

Bunun gibi bir şey ne yazık ki işe yaramayacak:

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")

Sınıf seçeneği göz ardı edilecektir.


4

Kullanmanızı have_linkve find_link(name)[:disabled]iki ayrı iddia kullanmanızı öneririm . Tek başına ikinci iddiayı gerçekleştirmek daha basit olsa da, bu, eksik bağlantılarla ilgili hata mesajlarının daha güzel görünmesini sağlayarak test sonuçlarınızın okunmasını kolaylaştırır.

expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false

"Example"Bağlantının adı veya kimliği ile değiştirilebileceğini unutmayın .


1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

have_link herhangi bir seçenek sağlamazsanız boş olan bir seçenek karması bekler. Bağlantının sahip olması gereken nitelikleri belirtebilirsiniz - tüm seçenekleri BİR hash'de geçirdiğinizden emin olun.

Bu yardımcı olur umarım

Not: Veri yöntemi gibi öznitelikler için, kısa çizgi sembolü bozduğundan öznitelik adını bir dizge olarak iletmeniz gerekir.


6
Hiç işe yaramadı ve Capybara ile çalışmıyor. Neden 9 kişinin buna olumlu oy verdiğini bilmiyorum.
Andrei Botalov

Bu artık Capybara 2'de çalışmıyor. Capybara <2 kullanan kişiler yukarıdakileri kullanabilir
Tian

@Tian, ​​Capybara'da işe yaramadı <2. Bu yanıta olumsuz oy vermenizi öneririm.
Andrei Botalov

class:geçerli değil
Amir Raminfar

1

Mümkün olduğunda, sürücüler arasında daha tutarlı çalışacak Capybara tarafından sağlanan sarmalayıcıları kullanmaya çalışmalısınız.

Özel durum için disabled, 2.1'de bir paketleyici tanıtıldı: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

Kullanırsanız, hem RackTest hem de Poltergeist'te mantıklı sonuçlar alırsınız:

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>

Testler:

!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

CSS seçicileri yerine bunu kullanarak, Js özellikli bir sürücü kullanmaya başlarsanız, Javascript testlerinin herhangi bir değişiklik olmadan nasıl çalışacağına dikkat edin.

Çalıştırılabilir test dosyası burada .


0

bowsersenior , bir ipucu için teşekkürler

Diğer bir basit çözüm, aradığınız HTML özelliğine [] ile erişmektir.

İşte bir örnek:

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

Rspec3'ün sözdizimini kullanarak bunu şu şekilde yaptım:

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

0

Basitçe page.has_css?yöntemi kullanabilirsiniz

page.has_css?('.class_name') 

trueeleman varsa bu geri dönecektir .

Doğrulamaya dayalı bir eylem yapın.

page.has_css?('.class_name') do
  #some code
end

0

Dokümanlara göre [öznitelik] erişimci sözdizimini kullanabilirsiniz:

find('#selector')['class'] => "form-control text optional disabled"

Engelliler için şunu da yapabilirsiniz:

expect(find('#selector').disabled?).to be(true)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.