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.