2014-11-25 4 views
1

После получения этой ошибки в этом previous context, я снова получаю ту же ошибку, что и в моем тестовом наборе. Разница в том, что теперь я вызываю функцию generate_steps_to_validate_school_pricing, которая делает следующее.Capybara :: ElementNotFound для AJAX populated <select> option

def generate_steps_to_validate_school_pricing(school_pricing_hash, school, homestay_single_room_per_week_cost, airport, airport_price) 
    school_pricing_hash.each do |program_name, program | 
    prog_name = school + " - " + program_name 
    program.each do |price_point_number, price_per_week| 
     visit "/application/new" 
     fill_in "school_application_first_name", :with => "bob" 
     fill_in "school_application_family_name", :with => "balaban" 
     check("school_application_sevic") #200 dollars 
     select(school, :from => 'school_application_fls_center') 
     check('school_application_I_20') 
     check('school_application_pay_application_fee_or_full') 
     fill_in "school_application_start_date", :with => "05/11/2015" 
     select(airport, :from => 'school_application_arrival_airport') 
     select('Homestay Single Room', :from => 'school_application_housing_type') 
     check("school_application_health_insurance") 
     check("school_application_transfer_student") 
     fill_in "school_application_comments", :with =>"Lorem" 
     fill_in "school_application_gender", :with =>"trans" 
     fill_in "school_application_address", :with=> "5/11/15" 
     fill_in "school_application_city_state_province", :with =>"Dubai" 
     fill_in "school_application_email", :with =>"[email protected]" 
     select(airport, :from => 'school_application_arrival_airport') 

     fill_in "school_application_postal_code", :with =>"90226" 
     fill_in "school_application_country", :with=> "Zimbabwe" 
     fill_in "school_application_date_of_birth", :with =>"Dubai" 
     fill_in "school_application_phone_number", :with => "2134932434" 
     select(price_point_number, :from => "school_application_duration") 
     check("school_application_read_everything") 
     fill_in "school_application_country_of_birth", :with =>"Aim" 
     fill_in "school_application_country_of_citizenship", :with =>"Durango" 
     check("school_application_work_with_ad") 

     fill_in "school_application_agency", :with =>"Aim" 
     fill_in "school_application_fax_number", :with =>"Durango" 
     save_and_open_page 
     select(prog_name, :from => "school_application_program") # this is the line that fails 
     total = price_point_number[0] *price_per_week 
     total = total + price_point_number[0] * homestay_single_room_per_week_cost 
     total = total + 500 #SEVIS fee (200) + Housing Application and Application Fees (150 each) 
     total = total + airport_price 
     total = total + 35 * price_per_week[0] #current Insurance for 2015 is 35/week 

     click_button "Continue" 
     expect(page).to have_text(total.to_s + " USD") 
    end 
    end 
end 

в то время как последовательность шагов, определенных в функции не имеет :js=>true применена, scenario который делает вызов это делает. Я уверен, что звонки AJAX, как правило, работают как тесты, соответствующие другим двум <select> s, которые заполняются через проход AJAXs.

Когда я делаю save_and_open_page выпадающий список, который должен иметь prog_name, пуст, что, по-видимому, говорит мне, что по какой-то причине этот вызов AJAX ломается. Я не уверен, как протестировать этот метод отдельного контроллера, чтобы увидеть, что происходит, и в равной степени неуверен в том, что делаю это: когда я выполняю ту же самую процедуру, что и «Счастливый путь», который я тестирую на localhost, все AJAX звонки работают отлично, включая заполнение <select>, который в настоящее время не заполняется.

Любые замечания о том, как систематически отлаживать это, будут оценены. Спасибо!

N.B. Проблема может быть в том, что тест не ждет, пока Сервер ответит данными, пока не вернет обратный вызов. Есть ли способ дождаться ответа?

ОБНОВЛЕНИЕ: Пробовал расширять Capyabara.default_wait_time до 20 секунд, все еще не удалось, что я чувствую, что это асинхронная проблема?

+1

вы можете попробовать этот учебник http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara –

ответ

1

Подумав это проблема с асинхронной, я первым изменил Капибару времени ожидания для запросов, а затем, наконец, реализовала это гораздо чище и надежное решение, чтобы гарантировать, что все асинхронные запросы были завершены, следуя этим учебное пособие: http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara

Итак, после реализации вспомогательной функции, я знаю, наверняка знал, что это не асинхронная проблема, которая подразумевает, что должна быть какая-то проблема с самим вызовом AJAX. Поскольку он работал на моем локальном сервере, я не понимал, как это произойдет при тестировании той же функции, но с RSpec.

Когда я вновь мои JS я увидел, что я сделал следующий вызов к серверу, для метода, который был неисправным:

$.ajax({ 
    url: "http://0.0.0.0:3000/application/get_programs_for_center", 
    type: "POST", 
    datatype: 'json', 
    data: formdata, 
    success: function(response){ 
     var options = $("#school_application_program"); 
     removeOptions(document.getElementById("school_application_program")); 
     $.each(response.programs, function(i,item) { 
     options.append($("<option />").val(response.programs[i].id).text(response.programs[i].name)); 
     }); 
    } 
}); 

Предоставляя полный путь моего локального сервера, он успешно сделает запросы локально, когда я вручную пробовал такое же поведение, но не удалось по очевидным причинам, когда я запустил bundle exec rspec (который использует другой сервер), запрос был неудачным. Другие аналогичные запросы AJAX, которые я написал, называли относительным путем и поэтому были успешными.

Смежные вопросы