2010-10-06 27 views
17

Tôi dường như gặp sự cố khi thử nghiệm những điều javascript trơn tru mà tôi làm với jQuery khi sử dụng Capybara và Selenium. Hành vi mong đợi là cho một biểu mẫu được tạo động khi người dùng nhấp vào liên kết "thêm tài nguyên". Capybara sẽ có thể nhấp vào liên kết nhưng không nhận ra được các phần tử biểu mẫu mới (tức là "tài nguyên [tên]").Capybara không nhận dạng được các phần tử DOM được thêm động?

Có cách nào để tải lại DOM cho Capybara không, hoặc có một số yếu tố của viên đá quý này mà tôi chưa học được chưa?

Cảm ơn trước!

== Sửa ==

Hiện nay thử vận ​​may của mình với selen của:

wait_for_element 

phương pháp.

== Sửa ==

tôi tiếp tục nhận được một "phương pháp xác định 'wait_for_element` cho lớp nill" khi cố gắng làm như sau:

@selenium.wait_for_element 

Dường như rằng phương pháp cụ thể, hoặc có lẽ wait_for với một bộ chọn lớn truy cập vào phần tử DOM mà tôi mong đợi là quá trình hành động chính xác, nhưng bây giờ cố gắng để có được phiên selen bắt đầu là một nhức đầu rất lớn.

Trả lời

17

Tôi sử dụng trình điều khiển dựa trên Webdriver cho Capybara trong RSpec, mà tôi định cấu hình và sử dụng như thế này và nó chắc chắn sẽ xử lý JS và không cần tải lại dom. Điều quan trọng là sử dụng wait_until và điều kiện sẽ đúng khi phản hồi AJAX của bạn kết thúc.

before(:each) do 
    select_driver(example) 
    logout 
    login('databanks') 
end 

def select_driver(example) 
    if example.metadata[:js] 
    Capybara.current_driver = :selenium 
    else 
    Capybara.use_default_driver 
    end 
end 

it "should let me delete a scenario", :js=>true do 
    select("Mysite Search", :from=>'scenario_id') 
    wait_until{ page.has_content?('mysite_searchterms')}  
    click_on "delete"  
    wait_until{ !page.has_content?('mysite_searchterms')} 
    visit '/databanks' 
    page.should_not have_content('Mysite Search') 
    end 

Tôi cũng đã tìm ra một hack để làm chậm đêm webdriver cuối cùng, như thế này, nếu bạn muốn xem mọi thứ trong slo-mo:

#set a command delay 
    require 'selenium-webdriver' 

    module ::Selenium::WebDriver::Remote 
    class Bridge 
     def execute(*args) 
     res = raw_execute(*args)['value'] 
     sleep 0.5 
     res 
     end 
    end 
    end 

Khi ai đó đề cập, nếu bạn đang nhận được thời gian chờ đợi yếu tố này, bạn có thể xem xét mức tăng này:

Capybara.default_wait_time = 10 
+0

cảm ơn @ebeland. bây giờ sau nhiều tháng sử dụng một cái gì đó tương tự trong các bài kiểm tra của chúng tôi tại nơi làm việc, phương thức 'wait_until' không nghi ngờ gì là cách chính xác để đi :) –

+4

' wait_until' đã bị xóa khỏi Capybara 2.0.0. [Xem bài đăng trên blog này] (http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara) –

7

Từ các tài liệu Capybara:

Khi làm việc với không đồng bộ JavaScript, bạn có thể gặp tình huống mà bạn đang cố gắng để tương tác với một yếu tố mà không phải là chưa có mặt trên trang. Capybara tự động giải quyết vấn đề này bằng cách chờ các thành phần xuất hiện trên trang .

Bạn có thể có một số may mắn tăng thời gian chờ đợi:

Capybara.default_wait_time = 10 

Nếu điều đó không giúp thì tôi sẽ encorage bạn liên hệ với ai đó từ dự án trên GitHub, viết vào danh sách gửi thư hoặc trình báo cáo vấn đề.

+3

+1 tại đây. Capybara sử dụng thời gian chờ mặc định này cho các cuộc gọi phương thức như 'has_selector?' 'Has_css?' Và cứ thế. Vì vậy, bạn có thể sử dụng các phương thức này để chờ cho phần tử xuất hiện, sử dụng một cái gì đó như: 'has_css? (" A # myinput ",: visible => true)' sẽ đợi cho đến khi phần tử nằm trên màn hình trước khi tiếp tục. – bergyman

+0

Tôi nên đặt 'Capybara.default_wait_time = 10' ở đâu? –

+1

@AlexanderSupertramp trong 'spec/rails_helper.rb' nếu bạn có, nếu không thì' spec/spec_helper.rb'. – thomasfedb

0

Ngay cả wait_until đã bị xóa khỏi Capybara 2.0.Vẫn hữu ích và lấy mã từ bên dưới:

def wait_until(delay = 1) 
seconds_waited = 0 
while ! yield && seconds_waited < Capybara.default_wait_time  
    sleep delay  
    seconds_waited += 1 
    end 
    raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield 
end 
Các vấn đề liên quan