capybara khẳng định thuộc tính của một phần tử


87

Tôi đang sử dụng RSpec2 và Capybara để kiểm tra chấp nhận.

Tôi muốn khẳng định rằng liên kết đó có bị vô hiệu hóa hay không trong Capybara. Tôi có thể làm cái này như thế nào?

Câu trả lời:


91

Làm thế nào để bạn vô hiệu hóa liên kết? Đó có phải là một lớp bạn đang thêm không? Một thuộc tính?

# 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

Các bộ chọn xpath thực tế có thể không chính xác. Tôi không sử dụng xpath thường xuyên!


Cảm ơn @idlefingers, tôi cũng muốn khẳng định bằng cách sử dụng xpath. Làm thế nào tôi có thể làm như vậy?
kriysna

Tôi đã cập nhật câu trả lời của mình. Nếu bộ chọn xpath sai, bạn sẽ phải thực hiện một số thao tác trên googling hoặc mở một câu hỏi mới.
nhàn rỗi vào

Lưu ý rằng điều này sẽ không hoạt động để kiểm tra chế độ xem, vì capybara không được tạo ra để hoạt động với các chế độ xem. (Webrat là.)
Peter Ehrlich

145

Một giải pháp đơn giản khác là truy cập thuộc tính HTML mà bạn đang tìm kiếm []:

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

Lưu ý rằng Capybarasẽ tự động cố gắng đợi các yêu cầu không đồng bộ kết thúc, nhưng nó có thể không hoạt động trong một số trường hợp:

Đây là một cách giải quyết nếu bạn gặp sự cố với các xác nhận trên các phần tử được cập nhật không đồng bộ:


4
Vrey giải pháp hữu ích. Cảm ơn!
Alexander Kuznetsov

Tôi có một chuỗi với vị trí css, ví dụ. find('a#my_element[href]'), liệu có thể truy xuất giá trị của thuộc tính này không? Cố gắng với các biểu thức như find('a#my_element[href]').valuenhưng dường như không hiệu quả :(
mickael 16/12/12

@mickael Hãy thử find('a#my_element[href]').texthoặc find('a#my_element[href]').native. Hãy cho tôi biết nếu một trong hai cách đó mang lại kết quả như bạn mong đợi.
bowsersenior

1
Tôi nhận ra rằng những ý kiến thực sự cũ, nhưng sử dụng nó theo cách này: page.find ( '# my_element') [ 'href = '<href_value>''] và nó làm việc một điều trị
Dono

Điều này sẽ không đợi truy vấn trở thành true nếu bạn muốn xác nhận về một thay đổi không đồng bộ.
sj26

4

Có một chút lộn xộn để tìm ra đường dẫn chính xác, đây là đường dẫn chính xác,
sử dụng capybara 0.4.1.1

# <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")

Nếu bạn chỉ có liên kết mà không có lớp, hãy sử dụng

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

Một cái gì đó như thế này sẽ không hoạt động một cách đáng buồn:

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

Tùy chọn lớp học sẽ bị bỏ qua.


4

Tôi khuyên bạn nên sử dụng have_linkfind_link(name)[:disabled]trong hai xác nhận riêng biệt. Mặc dù việc thực hiện xác nhận thứ hai đơn giản hơn, nhưng điều này làm cho thông báo lỗi về các liên kết bị thiếu trông đẹp hơn, giúp kết quả kiểm tra của bạn dễ đọc hơn.

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

Lưu ý rằng "Example"có thể được thay đổi thành tên hoặc id của liên kết.


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

has_link mong đợi một băm tùy chọn trống nếu bạn không cung cấp bất kỳ tùy chọn nào. Bạn có thể chỉ định bất kỳ thuộc tính nào mà liên kết phải có - chỉ cần đảm bảo bạn vượt qua tất cả các tùy chọn trong MỘT hàm băm.

Hi vọng điêu nay co ich

Tái bút: Đối với các thuộc tính như data-method, bạn phải chuyển tên thuộc tính dưới dạng một chuỗi vì dấu gạch ngang ngắt ký hiệu.


6
Nó không bao giờ hoạt động và không hoạt động với Capybara. Tôi không biết tại sao 9 người ủng hộ cái này.
Andrei Botalov

Điều này không còn hoạt động trong Capybara 2. Những người sử dụng Capybara <2 có thể sử dụng cách trên
Tian

@Tian nó không hoạt động ở Capybara <2. Tôi khuyên bạn nên từ chối câu trả lời này.
Andrei Botalov,

class:không hợp lệ
Amir Raminfar

1

Bất cứ khi nào có thể, bạn nên cố gắng sử dụng các trình bao bọc do Capybara cung cấp sẽ hoạt động ổn định hơn trên các trình điều khiển.

Đối với trường hợp cụ thể của disabled, trình bao bọc đã được giới thiệu trong 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

Nếu bạn sử dụng nó, bạn sẽ nhận được kết quả hợp lý trên cả RackTest và Poltergeist:

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>

Kiểm tra:

!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

Lưu ý cách sử dụng bộ chọn này thay vì bộ chọn CSS, các bài kiểm tra Javascript sẽ hoạt động mà không có bất kỳ thay đổi nào nếu bạn bắt đầu sử dụng trình điều khiển có khả năng Js.

Tệp thử nghiệm có thể chạy ở đây .


0

bowsersenior , cảm ơn vì một gợi ý

Một giải pháp đơn giản khác là truy cập thuộc tính HTML mà bạn đang tìm kiếm bằng []

Đây là một ví dụ:

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

Sử dụng cú pháp của Rspec3, tôi đã làm theo cách này:

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

0

Đơn giản bạn có thể sử dụng page.has_css?phương pháp

page.has_css?('.class_name') 

điều này sẽ trả về truenếu phần tử tồn tại.

Thực hiện một số hành động dựa trên xác thực.

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

0

Theo tài liệu, bạn có thể sử dụng cú pháp của trình truy cập [thuộc tính]:

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

Đối với người bị vô hiệu hóa, bạn cũng có thể làm điều này:

expect(find('#selector').disabled?).to be(true)
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.