在rails应用程序中,我在页面上有一个图像(image_submit_tag),当选择该图像时,会向服务器发送ajax请求。服务器接收请求,做正确的事并用正确的javascript响应。正确的javascript将一个图像替换为另一个图像。所有这些都在cucumber / capybara / webkit环境之外工作。换句话说,对于人类而言。
当我使用标有@的webkit(capybara-webkit 1.0.0)运行与黄瓜(1.3.9)/ capybara(2.1.0)下的rails(3.2.9)应用程序的单个测试(功能)相同时我看到不同的结果。
在测试环境中,webkit没有评估响应javascript。相反,在尝试在页面上查找新图标的后续步骤中,当我转储page.html所有报告的是javascript响应时。也就是说,该页面仅包含返回的javascript。
这是应该能够看到新内容的步骤(它与上面的描述不同,因为我已经简化了响应javascript以试图消除js错误的可能性)。
Then(/^the "(.*?)" icon should be displayed$/) do |icon|
puts "------------------icon display on page------------------"
puts page.html
puts "________________________________________________________"
puts "************* icon displayed response headers ***"
put page.response_headers.inspect
puts "*************************************************"
page.should have_content("some text")
end
我描述了上面的page.html输出,但响应标头添加到拼图中。出于某种原因,webkit(?)认为响应有问题。
bad URI(is not URI?): {"Content-Type"=>"text/javascript; charset=utf-8",
"X-Ua-Compatible"=>"IE=Edge,chrome=1",
"Etag"=>"\"e7d3ccc2c53dd8e31d6f92d7dbb69dc0\"",
"Cache-Control"=>"max-age=0, private, must-revalidate",
"X-Request-Id"=>"776cf759cc343884091b5daec6a18587",
"X-Runtime"=>"0.048413",
"Server"=>"WEBrick/1.3.1 (Ruby/1.9.3/2013-02-22)",
"Date"=>"Fri, 08 Nov 2013 03:07:43 GMT",
"Content-Length"=>"47", "Connection"=>"Keep-Alive"}
(URI::InvalidURIError)
最后,这里是rails返回的实际javascript,就像我说的那样,我把它剥离到了最低限度。
$('#go_on_duty').parent().html("some text");
从四处寻找答案,我会提出一些问题:
是的,我已经设置了Capybara.javascript_driver =:webkit。
2.是的,该功能被标记为@javascript
那么,有谁知道为什么javascript不会被评估?我怀疑我错过了一些明显的东西,但我的眼睛已经疲惫不堪。
在相关的说明中,我只是这一点,因为我在请求中明确地设置了Accept标头到javascript。我可以这样做b / c我正在使用webkit(如下所示)
page.driver.header 'Accept', 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'
在添加上面的行之前,我的请求是“作为HTML”到达服务器所以我甚至没有得到partial.js.erb呈现。我愿意忍受上述工作的时间,但我不禁想到问题也是相关的,如“我正在忽略一些简单的水豚/铁路/黄瓜配置问题”。同样,这只是测试环境中的一个问题;当人为驱动时,交互按预期工作。
更新
响应大众需求,这里是部分生成image_submit_tag
<%= form_tag(shifts_start_shift_path, :method => :post , :remote => true) do %>
<%=image_submit_tag("go_on_duty_sign.png", :size=> "35x35",
:id => "go_on_duty",
:title=>"Go On Duty") %>
<% end %>
以下是相关控制器的操作代码:
def start_shift
@shift = current_staff.current_shift
if !current_staff.on_duty?
@task_assignments = TaskAssignment.where(:shift_id => @shift.id)
respond_to do |format|
format.js
end
end
end
这里是用于渲染响应的start_shift.js.erb模板的js单行(从上面复制,显然,最小化):
$('#go_on_duty').parent().html("some text");
我希望这有助于澄清事情,但是当人为驱动时,我会再次强调这一切。我只看到测试环境下的问题。感谢...
环境:
gem 'rails', '3.2.9'
group :test do
gem 'cucumber-rails', '1.4.0'
gem 'rspec-rails', '2.7.0'
gem 'database_cleaner', '0.7.0'
gem 'factory_girl', '2.3.2'
gem 'capybara-webkit', '1.0.0'
end