Within a rails app, I have an image (image_submit_tag) on a page that, when selected, sends an ajax request to server. 服务器收到请求,做正确的事并用正确的 javascript 响应。正确的 javascript 将一个图像替换为另一个图像。所有这些都在 cucumber/capybara/webkit 环境之外工作。换句话说,对于人类。
当我使用带有@javascript 标记的 webkit (capybara-webkit 1.0.0) 与 cucumber(1.3.9)/capybara (2.1.0) 下的 rails(3.2.9) 应用程序的单个测试(功能)相同时,我看到不同的结果。
在测试环境中,响应 javascript 没有被 webkit 评估。相反,在尝试在页面上查找新图标的后续步骤中,当我转储 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");
通过四处寻找答案,我会预料到一些问题:
1. 是的,我设置了 Capybara.javascript_driver = :webkit。
2. 是的,该功能被标记为@javascript
那么,有谁知道为什么 javascript 不会被评估?我暗自怀疑我遗漏了一些明显的东西,但我的眼睛已经变得疲倦了。
在相关的说明中,我只是到此为止,因为我在对 javascript 的请求中明确设置了 Accept 标头。我可以这样做 b/c 我正在使用 webkit(如下所示)
page.driver.header 'Accept', 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'
在添加上述行之前,我的请求“作为 HTML”到达服务器,所以我什至没有得到 partial.js.erb 渲染。我愿意暂时接受上述解决方法,但我不禁认为这些问题也是相关的,例如“我忽略了一些简单的 capybara/rails/cucumber 配置问题”。同样,这只是测试环境中的一个问题;当人为驱动时,交互按预期工作。
更新:
应大众需求,这里部分生成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