Capybara kullanarak bir form alanının doğru şekilde önceden doldurulup doldurulmadığını nasıl kontrol edebilirim?


146

Kapibara ile sorunsuz bir şekilde doldurabileceğim uygun etiketli bir alanım var:

fill_in 'Your name', with: 'John'

Doldurmadan önce sahip olduğu değeri kontrol etmek istiyorum ve anlayamıyorum.

fill_inAşağıdaki satırdan sonra eklersem:

find_field('Your name').should have_content('John')

Sayfayı kaydederek doğruladığım gibi hemen önceki doldurma çalışmasına rağmen bu test başarısız oldu.

Neyi kaçırıyorum?

Yanıtlar:


180

Belirli bir değere sahip bir öğe olup olmadığını kontrol etmek için bir xpath sorgusu kullanabilirsiniz input(örneğin, 'John'):

expect(page).to have_xpath("//input[@value='John']")

Daha fazla bilgi için http://www.w3schools.com/xpath/xpath_syntax.asp adresine bakın .

Belki daha güzel bir yol için:

expect(find_field('Your name').value).to eq 'John'

DÜZENLEME: Bugünlerde muhtemelen have_selector kullanacağım

expect(page).to have_selector("input[value='John']")

Sayfa nesnesi desenini kullanıyorsanız (kullanmanız gerekir!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"

Ah, .valuebiraz özledim. Teşekkürler!
Marc-André Lafortune

Aynı sorunu yaşıyordum, ancak form alanı yerine div ile. Aynı soruna sahip olan herkes için, find_field (). Değeri yerine find_by_id (). Metnini kullanın. Bu değerin yalnızca form alanlarında çalıştığını fark etmem yaşlarımı aldı …
John Y

8
İkinci yolla ilgili sorun, Capybara'nın yoklama döngüsünü kullanmaması ve bu nedenle, alan daha uzun süre çalışan JS kodu tarafından ayarlandığında anında başarısız olmasıdır. İlk yol, bunu statik olarak oluşturulmuş bir form üzerinde denemediğiniz sürece tercih edilmektir.
fqxp

1
@Fqxp'nin RSpec Matchers'ı ve yeni beklenti sözdizimini kullanan daha iyi bir cevabı olduğunu düşünüyorum. Belgelerde gördüklerimden find_fieldve diğerleri Node::Finders, düğümleri bulmak ve beklentiden ziyade bunlar üzerinde eylemler gerçekleştirmek için kullanılır. Elbette bu bir kural değil, ancak basit bir şey için dahili çözüme gitmek daha iyi bir fikir. Sadece söylüyorum!
Agent47DarkSoul

Doğru, şu anda tercih edilen yol olmasını bekleyin, ancak sözdizimi bu sorudan yaklaşık bir ay sonra yayınlandı.
DVG

316

Başka bir güzel çözüm şudur:

page.should have_field('Your name', with: 'John')

veya

expect(page).to have_field('Your name', with: 'John')

sırasıyla.

Ayrıca referansa bakın .

Not : Devre dışı bırakılan girişler için seçeneği eklemeniz gerekir disabled: true.


23
Seçilen cevaptan çok daha iyi!
Agent47DarkSoul

3
Yine de seçilen cevabı tercih ederim çünkü hata mesajı size beklenen ve gerçek dizeleri gösterir. Bu, yardımcı olmayan "beklenen alan" alanım "ın bir şey döndürmesi" hatası verir. Ancak bu kesinlikle daha iyi okuyor ve sayfa eşleştirici API'sini daha iyi takip ediyor. Her yerde olumlu oylar !!!
mraaroncruz

1
Anlayabildiğim kadarıyla, bu aslında alanın değerini doğrulamıyor, sadece değerden bağımsız olarak alanın varlığını doğruluyor. Belgeler değere göre filtrelemesi gerektiğini söylediği için bunun bir hata olduğunu tahmin ediyorum.
Nick

1
Geçiş withkesinlikle yalnızca değer eşleşirse doğru döndürdü, benim için beklenen sonuç bu.
Ben Saufley

4
Belki de hata mesajı yanıtın ilk yazıldığı andan beri iyileştirilmiştir, ancak şimdi expected […] but there were no matches. Also found "", which matched the selector but not all filters..çok güzel bir hata mesajına çok yaklaşan boş bir alana geliyorum .
Patru

2

Özellikle bir yer tutucuyu test etmek istiyorsanız, şunu kullanın:

page.should have_field("some_field_name", placeholder: "Some Placeholder")

veya:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

Kullanıcı tarafından girilen değeri test etmek istiyorsanız:

page.should have_field("some_field_name", with: "Some Entered Value")


0

Alan 'some_field' kimliğine sahip gizli bir alan ise, o zaman kullanabilirsiniz

expect(find("input#somefield", :visible => false).value).to eq 'John'
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.