Jquery Capybara::ElementNotFound for AJAX填充<;选择>;选项
在这里得到这个错误之后,我再次得到在我的测试套件上抛出的相同错误。区别在于,现在我调用了一个函数Jquery Capybara::ElementNotFound for AJAX填充<;选择>;选项,jquery,ajax,rspec,capybara,Jquery,Ajax,Rspec,Capybara,在这里得到这个错误之后,我再次得到在我的测试套件上抛出的相同错误。区别在于,现在我调用了一个函数generate\u steps\u来验证学校定价,该函数执行以下操作 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
generate\u steps\u来验证学校定价
,该函数执行以下操作
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 =>"bob@balaban.com"
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
,但是调用它的场景会应用。我确信AJAX调用通常是作为与通过ajaxspass填充的另外两个
相对应的测试工作的
当我执行save_和\u open_page
时,应该有prog_name
的下拉列表是空的,这似乎告诉我,由于某种原因,特定的AJAX调用正在中断。我不确定如何测试单个控制器方法以查看发生了什么,我同样不确定这样做的意义,因为当我执行与我在localhost
上测试的快乐路径完全相同的过程时,所有AJAX调用都能完美地工作,包括填充当前未填充的
任何关于如何进一步系统地调试的说明都将不胜感激。谢谢大家!
注意:问题很可能是测试不会等待服务器响应数据,直到它返回回调。有没有办法让它等到收到响应
更新:尝试扩展Capyabara。默认等待时间为20秒,但仍然失败,我认为这排除了异步问题的可能性?在认为这是异步问题后,我首先更改了请求的Capybara等待时间,然后最终实现了这个更干净、更可靠的解决方案,以确保通过遵循本教程完成所有异步请求:
所以在实现了helper函数之后,我确定这不是一个异步问题,这意味着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));
});
}
});
$.ajax({
url:“http://0.0.0.0:3000/application/get_programs_for_center",
类型:“POST”,
数据类型:“json”,
数据:formdata,
成功:功能(响应){
var选项=$(“学校应用程序”);
移除选项(document.getElementById(“学校应用程序”);
$。每个(响应程序、功能(i、项){
options.append($(“”).val(response.programs[i].id).text(response.programs[i].name));
});
}
});
通过提供本地服务器的完整路径,当我手动尝试相同的行为但由于明显原因失败时(当我运行bundle exec rspec
(使用不同的服务器)请求失败时,它将成功地在本地发出请求。我编写的其他类似AJAX请求都称为相对路径,因此都是成功的。您可以尝试本教程