ฉันจะตรวจสอบว่าเขตข้อมูลฟอร์มได้รับการเติมล่วงหน้าอย่างถูกต้องโดยใช้ capybara ได้อย่างไร


145

ฉันมีฟิลด์ที่มีป้ายกำกับที่เหมาะสมซึ่งฉันสามารถเติมด้วย capybara ได้โดยไม่มีปัญหา:

fill_in 'Your name', with: 'John'

ฉันต้องการตรวจสอบค่าที่มีอยู่ก่อนเติมและไม่สามารถหาได้

ถ้าฉันเพิ่มหลังจากfill_inบรรทัดต่อไปนี้:

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

การทดสอบนั้นล้มเหลวแม้ว่าการเติมจะทำงานก่อนหน้านี้อย่างที่ฉันตรวจสอบแล้วโดยการบันทึกหน้า

ฉันพลาดอะไรไป

คำตอบ:


179

คุณสามารถใช้แบบสอบถาม xpathเพื่อตรวจสอบว่ามีinputองค์ประกอบที่มีค่าเฉพาะ (เช่น 'John'):

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

ดูhttp://www.w3schools.com/xpath/xpath_syntax.aspสำหรับข้อมูลเพิ่มเติม

สำหรับวิธีที่ดีกว่า:

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

แก้ไข: ทุกวันนี้ฉันอาจใช้ has_selector

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

หากคุณใช้รูปแบบวัตถุหน้า (คุณควรเป็น!)

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"

อ่าฉันพลาดไป.valueนิดหน่อย ขอบคุณ!
Marc-André Lafortune

ฉันมีปัญหาเดียวกัน แต่มี div มากกว่าฟิลด์ฟอร์ม สำหรับใครก็ตามที่มีปัญหาเดียวกันให้ใช้ find_by_id (). text แทนที่จะเป็น find_field (). value ฉันใช้เวลานานพอที่จะเห็นคุณค่านั้นใช้ได้กับฟิลด์แบบฟอร์มเท่านั้น ...
John Y

8
ปัญหาด้วยวิธีหลังคือมันไม่ได้ใช้วงจรการสำรวจของ Capybara และดังนั้นจะล้มเหลวทันทีหากฟิลด์นั้นถูกตั้งค่าโดยใช้รหัส JS ที่ทำงานนานกว่า วิธีแรกคือการได้รับการแนะนำจนกว่าคุณจะพยายามทำสิ่งนี้ในรูปแบบที่สร้างขึ้นแบบคงที่
fqxp

1
ฉันคิดว่า @fqxp มีคำตอบที่ดีกว่าซึ่งใช้ RSpec Matchers และไวยากรณ์ความคาดหวังใหม่ จากสิ่งที่ฉันเห็นในเอกสารประกอบfind_fieldและอื่น ๆNode::Findersถูกใช้เพื่อค้นหาโหนดและดำเนินการกับพวกเขาแทนที่จะคาดหวัง แน่นอนว่านี่ไม่ใช่กฎ แต่สำหรับสิ่งที่ง่ายเช่นนี้ไปกับการแก้ปัญหา inbuilt เป็นความคิดที่ดีกว่า แค่พูด!
Agent47DarkSoul

จริงคาดว่าจะเป็นวิธีที่ต้องการในขณะนี้อย่างไรก็ตามไวยากรณ์นั้นได้เปิดตัวประมาณหนึ่งเดือนหลังจากคำถามนี้
DVG

309

โซลูชันที่น่าสนใจอีกประการหนึ่งคือ:

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

หรือ

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

ตามลำดับ

ดูการอ้างอิงด้วย

หมายเหตุ : disabled: trueสำหรับปัจจัยการผลิตที่ปิดใช้งานคุณจะต้องเพิ่มตัวเลือก


23
ดีกว่าคำตอบที่เลือก!
Agent47DarkSoul

3
ฉันยังต้องการคำตอบที่เลือกเนื่องจากข้อความแสดงข้อผิดพลาดแสดงให้คุณเห็นถึงความคาดหวังและสตริงที่แท้จริง สิ่งนี้ทำให้เกิดข้อผิดพลาด "ฟิลด์ที่คาดหวัง" ฟิลด์ของฉัน "เพื่อส่งคืนข้อผิดพลาด" แต่อันนี้จะอ่านได้ดีขึ้นและแน่นอนตาม API การจับคู่หน้าดีกว่า โหวตขึ้นทุกรอบ !!!
mraaroncruz

1
เท่าที่ฉันสามารถบอกได้ว่าสิ่งนี้ไม่ได้ยืนยันมูลค่าของสนามเพียงแค่การมีอยู่ของสนามโดยไม่คำนึงถึงมูลค่า ฉันเดาว่านี่เป็นข้อผิดพลาดเนื่องจากเอกสารบอกว่าควรกรองตามค่า
Nick

1
การส่งผ่านนั้นwithจะส่งกลับจริงเฉพาะเมื่อค่าตรงกันสำหรับฉันซึ่งเป็นผลลัพธ์ที่คาดหวัง
Ben Saufley

4
อาจเกิดข้อผิดพลาดได้รับการปรับปรุงตั้งแต่คำตอบถูกเขียนขึ้นครั้งแรก แต่ตอนนี้ฉันได้รับexpected […] but there were no matches. Also found "", which matched the selector but not all filters..ในช่องว่างที่มาใกล้กับข้อผิดพลาดที่ดีมาก
Patru

2

หากคุณต้องการทดสอบตัวยึดตำแหน่งโดยเฉพาะให้ใช้:

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

หรือ:

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

หากคุณต้องการทดสอบค่าที่ผู้ใช้ป้อน:

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

0

ผมสงสัยว่าจะทำสิ่งที่แตกต่างกันเล็กน้อย: ผมอยากจะทดสอบว่าสนามมีบางอย่างคุ้มค่า (ในขณะที่การใช้ประโยชน์จากความสามารถใน Capybara ไปอีกการทดสอบจับคู่จนกว่าจะตรง ) ปรากฎว่าเป็นไปได้ที่จะใช้ "ตัวกรองบล็อก" เพื่อทำสิ่งนี้:

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.