Làm cách nào tôi có thể kiểm tra xem trường biểu mẫu được điền sẵn chính xác bằng capybara?


145

Tôi có một trường với nhãn phù hợp mà tôi có thể điền vào bằng capybara mà không gặp vấn đề gì:

fill_in 'Your name', with: 'John'

Tôi muốn kiểm tra giá trị của nó trước khi điền vào và không thể tìm ra.

Nếu tôi thêm sau fill_indòng sau:

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

Thử nghiệm đó không thành công, mặc dù việc điền trước đó đã hoạt động như tôi đã xác minh bằng cách lưu trang.

Tôi đang thiếu gì?

Câu trả lời:


179

Bạn có thể sử dụng truy vấn xpath để kiểm tra xem có thành inputphần nào có giá trị cụ thể không (ví dụ: 'John'):

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

Xem http://www.w3schools.com/xpath/xpath_syntax.asp để biết thêm thông tin.

Có lẽ là một cách đẹp hơn:

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

EDIT: Ngày nay tôi có thể sử dụng have_selector

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

Nếu bạn đang sử dụng mẫu đối tượng trang (bạn nên có!)

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, tôi đã bỏ lỡ một .valuechút. Cảm ơn!
Marc-André Lafortune

Tôi đã có cùng một vấn đề, nhưng với một div chứ không phải là một trường mẫu. Đối với bất kỳ ai khác có cùng một vấn đề, sử dụng văn bản find_by_id (). Thay vì find_field (). Value. Tôi mất nhiều thời gian để nhận ra giá trị đó chỉ hoạt động trên các trường mẫu
John Y

8
Vấn đề với cách thứ hai là nó không sử dụng chu kỳ bỏ phiếu của Capybara và do đó sẽ thất bại ngay lập tức nếu trường được đặt bởi mã JS chạy dài hơn. Cách đầu tiên là được ưu tiên trừ khi bạn đang thử điều này trên một biểu mẫu được tạo tĩnh.
fqxp

1
Tôi nghĩ rằng @fqxp có câu trả lời tốt hơn trong đó sử dụng Bộ so khớp RSpec và cú pháp kỳ vọng mới. Từ những gì tôi thấy trong tài liệu, find_fieldvà những thứ khác Node::Findersđược sử dụng để tìm các nút và thực hiện các hành động trên chúng thay vì kỳ vọng. Tất nhiên đây không phải là một quy tắc, nhưng đối với một cái gì đó đơn giản vì điều này xảy ra với giải pháp sẵn có là một ý tưởng tốt hơn. Chỉ cần nói!
Đặc vụ47DarkSoul

Đúng, mong đợi sẽ là cách ưa thích bây giờ, tuy nhiên cú pháp đó đã được phát hành khoảng một tháng sau câu hỏi này.
DVG

309

Một giải pháp đẹp khác sẽ là:

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

hoặc là

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

tương ứng.

Cũng xem tài liệu tham khảo .

Lưu ý : đối với đầu vào bị vô hiệu hóa, bạn sẽ cần thêm tùy chọn disabled: true.


23
Tốt hơn nhiều so với câu trả lời được chọn!
Đặc vụ47DarkSoul

3
Tôi vẫn thích câu trả lời được chọn vì thông báo lỗi hiển thị cho bạn chuỗi dự kiến ​​và chuỗi thực tế. Điều này mang lại lỗi "trường dự kiến" trường "không trả lại" của tôi. Nhưng cái này chắc chắn đọc tốt hơn và theo dõi API của trình so khớp trang tốt hơn. Nâng cao tất cả xung quanh !!!
mraaroncruz

1
Theo như tôi có thể nói, điều này thực sự không xác nhận giá trị của trường, chỉ là sự hiện diện của trường bất kể giá trị. Tôi đoán đó là một lỗi vì các tài liệu nói rằng nó nên lọc dựa trên giá trị.
Nick

1
Đối với tôi withchắc chắn chỉ trả về đúng nếu giá trị khớp với tôi, đó là kết quả mong đợi.
Ben Saufley

4
Có thể thông báo lỗi đã được cải thiện kể từ khi câu trả lời được viết lần đầu tiên, nhưng bây giờ tôi nhận được expected […] but there were no matches. Also found "", which matched the selector but not all filters..trên một trường trống, rất gần với một thông báo lỗi rất hay.
Patru

2

Nếu bạn đặc biệt muốn kiểm tra giữ chỗ, hãy sử dụng:

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

hoặc là:

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

Nếu bạn muốn kiểm tra giá trị do người dùng nhập:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.