teampoltergeist / poltergeist

A PhantomJS driver for Capybara

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Capybara::Poltergeist::TimeoutError in some environments

ragesoss opened this issue · comments

Lately I've been getting a Capybara::Poltergeist::TimeoutError locally on several tests that used to pass, and which still pass on travis-ci, and I'm quite stuck on debugging it.

I consistently get an error along these lines:

Failure/Error: click_button 'Edit', match: :first
     
     Capybara::Poltergeist::TimeoutError:
       Timed out waiting for response to {"id":"23d657ac-2dcd-4bc4-82e4-6d4bbdc864ac","name":"click","args":[2,1]}. It's possible that this happened because something took a very long time (for example a page load was slow). If so, setting the Poltergeist :timeout option to a higher value will help (see the docs for details). If increasing the timeout does not help, this is probably a bug in Poltergeist - please report it to the issue tracker.

The timeout is already pretty long, and increasing it hasn't made a difference.

Relevant details:

We ran some repeated stability tests on our Capybara based application where we basically run poltergeist on a sample website and click a few links. It was designed to test stability of our own architecture as well as the reliability of the Capybara driver. Overnight, we experienced 15 Capybara::Poltergeist::TimeoutError failures out of 4,422 runs, giving us an error rate of 0.339%. I have no new information on this specific really, just adding the data point.

Every one of the 15 failures happens after 30 seconds of inactivity, which is presumably the phantomjs :timeout default. We can raise this but that would appear to mask the problem, I don't believe any of the successful scrapes log delays of more than a couple of seconds getting started after the first visit call.

Is it possible that some javascript or websocket connection hanging on the page load is causing the visit to fail with a Poltergeist error rather than a Capybara one? If that's the case, network effects are to some extent out of our control...

Partial Stacktrace

/usr/local/bundle/gems/poltergeist-1.15.0/lib/capybara/poltergeist/web_socket_server.rb:96:in `send'
/usr/local/bundle/gems/poltergeist-1.15.0/lib/capybara/poltergeist/server.rb:43:in `send'
/usr/local/bundle/gems/poltergeist-1.15.0/lib/capybara/poltergeist/browser.rb:370:in `command'
/usr/local/bundle/gems/poltergeist-1.15.0/lib/capybara/poltergeist/browser.rb:193:in `click'
/usr/local/bundle/gems/poltergeist-1.15.0/lib/capybara/poltergeist/node.rb:17:in `command'
/usr/local/bundle/gems/poltergeist-1.15.0/lib/capybara/poltergeist/node.rb:131:in `click'
/usr/local/bundle/gems/capybara-2.14.2/lib/capybara/node/element.rb:143:in `block in click'
/usr/local/bundle/gems/capybara-2.14.2/lib/capybara/node/base.rb:85:in `synchronize'
/usr/local/bundle/gems/capybara-2.14.2/lib/capybara/node/element.rb:143:in `click'

System

  • OS Linux Mint host, "ruby:2.3.3-slim" docker container
  • PhantomJS: 2.1.1-linux-x86_64
  • Poltergeist: 1.15.0

One of the things that can cause this type of error, especially when running against a live site for scraping purposes is throttling rules for that site, which can end up just throwing away connection attempts resulting in timeouts. To attempt to diagnose any of this further we would need a debug log from the time of the failure (and in the case of the edit button click details on what exactly clicking on that button does).

Closing due to lack of feedback and the fact that people seem to be claiming this issue as a reason they need to add wait_until to their projects needlessly

I tried running it in debug mode, but there was no useful information that I could see — almost no debug info — and I haven't had a chance to dig into it more yet. In the case of my app, my suspicion is that it has to do with the React render cycle not playing nicely with Phantomjs. But it fails every time locally for me (on two different computers running Debian) while it still passes on travis. 🤷‍♂️

@ragesoss You need to enable debug in the driver registration -https://github.com/teampoltergeist/poltergeist#customization - and in the phantoms_options. . Other than that, what are the differences between your machine and travis? Are phantoms versions the same? Are you running the downloaded phantomjs vs the one provided by Debian (which is pretty broken for some things)?

Ah! I was using the remote debugging inspector (which worked but had little output), but not passing `phantomjs_options: ['--debug=true']. Now I'm seeing lots of debug info in the rspec console.

Will report back soon with results from the offending machine. I'm on another Debian machine at the moment, and the error is not happening on this one. I've been using the phantomjs from the npm package phantomjs-prebuilt; the versions are the as on travis, 2.1.1.

To close the loop on this... I had tried previously with increasing the timeout, without success, but I've tried again now with increasing it to 60 seconds and it fixes it for me.

Here's the debug output from one of the affected test:

2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:36 [DEBUG] WebPage - setupFrame ""
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "undefined")
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function() { return [window.innerWidth, window.innerHeight] }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(1); })()"
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantList, (QVariant(double, 1920), QVariant(double, 1080)))
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function() { return [window.innerWidth, window.innerHeight] }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(1); })()"
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantList, (QVariant(double, 1920), QVariant(double, 1080)))
2017-06-21T20:27:36 [DEBUG] WebPage - updateLoadingProgress: 10
2017-06-21T20:27:36 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=R0M1TzJ1TmJkaWYzb0N4OXF2S0pJbFcvcU02SG5MdFMvSDYvdDlrV29qWExFdGxMbW54bEF2cDNSakswaWFnNHJyTUpFbzV5UDR0WVFOSnJ1Ym9Kc1hiUTVLakR6cVBJU3VyeWx5bUUyenlBcWZFa3JoVEM3dXJLeEhjamdmTTctLXVqU0tUNWZVd1d4L3ljYkpaQUJtVGc9PQ%3D%3D--fd1464616cead617eebf51502ccabe92ac4be2c0; HttpOnly; domain=127.0.0.1; path=/"
2017-06-21T20:27:36 [DEBUG] WebPage - updateLoadingProgress: 46
2017-06-21T20:27:36 [DEBUG] WebPage - setupFrame ""
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:36 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "undefined")
2017-06-21T20:27:36 [DEBUG] Network - Resource request error: QNetworkReply::NetworkError(ProtocolUnknownError) ( "Protocol \"\" is unknown" ) URL: ""
2017-06-21T20:27:36 [DEBUG] Network - Resource request error: QNetworkReply::NetworkError(ProtocolUnknownError) ( "Protocol \"\" is unknown" ) URL: ""
2017-06-21T20:27:36 [DEBUG] WebPage - updateLoadingProgress: 48
2017-06-21T20:27:36 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=bk1vdFJhNVV6L3VpYy9Nck9BWHRrbmNUWm40Q3VXcVRFaGNJcHU2enk2YlpBYWoxZmUyR092WU85d1plaktPZ21EM3NLQkwvN0RYTWN1d0NFNVhWYm83dURmdUZwcXBGcVJlaWtKZVJ3eEcwSFlmeGRGK1VsNWRIRWUwRTd4d2ItLUZNR2ZSM3VDcWxBQzZ1QXFnUnlqTGc9PQ%3D%3D--9dac4aa1226754bda5c9158b9b88b5fb5cf1314e; HttpOnly; domain=127.0.0.1; path=/"
2017-06-21T20:27:36 [DEBUG] WebPage - updateLoadingProgress: 50
2017-06-21T20:27:36 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=bzhwRFNUSVhmUTc3TituQ2V4VFVvcHJ5b2RMWVZaclVxNzFFam9QYklhSGZramppU2RnVTNUY3IrYlpPNUMvNDNJcTRQTW9KV3NseGp6b2hPVHR6ODF0K2wyamo0Sk1zMHFlOVBydXMrYWNOYjJZdi8yQ0ZIeEpORlk5OVBhUE8tLW1jdnN6eFUzYXJIR0N4SzZybUIva3c9PQ%3D%3D--568acd5ab4c46b95399be6debbd9aec77b20b049; HttpOnly; domain=127.0.0.1; path=/"
2017-06-21T20:27:36 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=aSs1V1RZNjljZkRmZzlFSnJxckR3UU9HSndjY0FnK1NTdTdvcWlPVHJwQlBoalYwMDBTS1dBTEN4R1V4bkVwcW5uZk5nZDVNTE1mYmZJTVpUcHIzb3VSMjNoZG1najYrY1p3MDFIelNlQ0o0bGZEdUVkUEpjeWExRG5BeHVCYlktLVc4bEZpa1c5cjVKQ24wbjIvWmNsQkE9PQ%3D%3D--9cc83810f15f2bea4866af53ac0df7cf9fb79475; HttpOnly; domain=127.0.0.1; path=/"
2017-06-21T20:27:36 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=Y055UTVmWHo4bGphUEhBZG1MbXB5eHc4ZzdROG5zZENDak0zK3BERldSeXBXb2V3YXFlWnlmRW0zYVNJSk5BWXhNMTh3ZjBTMEFLVVlRcnRlMktHanFzdkhSYVE4eTJkSXI2bHV3TjVSemE3L29NREhZUXlZeTRLZ3UwR0plT00tLVlvS2tvVVVLQVE4bE1QWXM0bVQwUEE9PQ%3D%3D--00b3ff2e4ea92e9b0e60d2c62ba6189a6400fe6c; HttpOnly; domain=127.0.0.1; path=/"
2017-06-21T20:27:36 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=aVJabzBTR1Ivdm5sSStjNlBLWGwwQWM5TEVNaWFOajNMTmV6WHo1bWl1Qit3MzB5cmxlbEFWT2hJUXViV1dEM2gyU3YrbDY3ZVduTlUyRzd2Zjdab0hTKzlFZ1Izd3FtVU9PdWlWRzN2SXZqc2RCTFRsYVpIdGdTdWxLYXFYcVktLUNIa1JNWEtiYVFPRVdFR1JIS2NibkE9PQ%3D%3D--6a5c1222a2350dc0b00236a1403250e4f8f923c4; HttpOnly; domain=127.0.0.1; path=/"
2017-06-21T20:27:36 [DEBUG] WebPage - updateLoadingProgress: 55
2017-06-21T20:27:36 [DEBUG] WebPage - updateLoadingProgress: 100
2017-06-21T20:27:36 [DEBUG] WebPage - setupFrame ""
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"find\",[\"css\",\"button.week__add-block\"]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QVariantList, (QVariant(double, 0))))))
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[0,\"isVisible\",[]]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(bool, true))))
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[0,\"tagName\",[]]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QString, "BUTTON"))))
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[0,\"scrollIntoView\",[]]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap())
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[0,\"tagName\",[]]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QString, "BUTTON"))))
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[0,\"position\",[]]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QVariantMap, QMap(("bottom", QVariant(double, 259))("height", QVariant(double, 18))("left", QVariant(double, 1045))("right", QVariant(double, 1131))("top", QVariant(double, 241))("width", QVariant(double, 86)))))))
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[0,\"mouseEventTest\",[1088,250]]); })()"
2017-06-21T20:27:37 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QVariantMap, QMap(("status", QVariant(QString, "success")))))))
2017-06-21T20:27:37 [DEBUG] Mouse Event: "mousemove" ( QEvent::Type(MouseMove) ) QPoint(1088,250) ) 0 0
2017-06-21T20:27:37 [DEBUG] Mouse Event: "mousedown" ( QEvent::Type(MouseButtonPress) ) QPoint(1088,250) ) 1 1
2017-06-21T20:27:37 [DEBUG] Mouse Event: "mouseup" ( QEvent::Type(MouseButtonRelease) ) QPoint(1088,250) ) 1 1
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"find\",[\"xpath\",\".//input[((((./@type = 'submit') or (./@type = 'reset')) or (./@type = 'image')) or (./@type = 'button'))][((./@id = 'Save') or ((./@value = 'Save') or (./@title = 'Save')))] | .//input[(./@type = 'image')][(./@alt = 'Save')] | .//button[(((./@id = 'Save') or ((./@value = 'Save') or (./@title = 'Save'))) or ((normalize-space(string(.)) = 'Save') or .//img[(./@alt = 'Save')]))] | .//input[(./@type = 'image')][(./@alt = 'Save')]\"]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QVariantList, (QVariant(double, 1))))))
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"isVisible\",[]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(bool, true))))
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"isDisabled\",[]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(bool, false))))
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"tagName\",[]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QString, "BUTTON"))))
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"scrollIntoView\",[]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap())
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"tagName\",[]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QString, "BUTTON"))))
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"position\",[]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QVariantMap, QMap(("bottom", QVariant(double, 588))("height", QVariant(double, 39))("left", QVariant(double, 1031))("right", QVariant(double, 1112))("top", QVariant(double, 549))("width", QVariant(double, 81)))))))
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"nodeCall\",[1,\"mouseEventTest\",[1071.5,568.5]]); })()"
2017-06-21T20:28:22 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QVariantMap, QMap(("status", QVariant(QString, "success")))))))
2017-06-21T20:28:22 [DEBUG] Mouse Event: "mousemove" ( QEvent::Type(MouseMove) ) QPoint(1072,569) ) 0 0
2017-06-21T20:28:22 [DEBUG] Mouse Event: "mousedown" ( QEvent::Type(MouseButtonPress) ) QPoint(1072,569) ) 1 1
2017-06-21T20:28:22 [DEBUG] Mouse Event: "mouseup" ( QEvent::Type(MouseButtonRelease) ) QPoint(1072,569) ) 1 1
2017-06-21T20:28:22 [DEBUG] CookieJar - Saved "_wikiedudashboard_session=QjFjRDRxUGN1bm1BVWlQRFlvaGt3b256eVI0ci9sanpjeU1YL0JOaTFYTWRxc204RnRWTTl1aFZnTW1kb1RuM0NQQXNrVDBBYnVNaWdSZVZUbzk4eWp4Ny9PQW80dkp1eER1d3YyVjVYYi83MDBiNHdtMTV5RmhrMThkb0NNZXctLXllUDREUDZ2cm5KSWtzNXMrM1dnVHc9PQ%3D%3D--f3fb6441fa80d81b425594609104f3cd5792504e; HttpOnly; domain=127.0.0.1; path=/"
Saved timeline!
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"currentUrl\",[]); })()"
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QString, "http://127.0.0.1:42921/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"))))
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"currentUrl\",[]); })()"
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap(("value", QVariant(QString, "http://127.0.0.1:42921/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"))))
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function () {\n      return typeof __poltergeist;\n    })(); })()"
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "object")
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { var page_id = arguments[0]; var args = []; for(var i=1; i < arguments.length; i++){ if ((typeof(arguments[i]) == 'object') && (typeof(arguments[i]['ELEMENT']) == 'object')){ args.push(window.__poltergeist.get(arguments[i]['ELEMENT']['id']).element); } else { args.push(arguments[i]) } } var _result = (function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, args); return window.__poltergeist.wrapResults(_result, page_id); })(2,\"clearLocalStorage\",[]); })()"
2017-06-21T20:28:23 [DEBUG] WebPage - evaluateJavaScript result QVariant(QVariantMap, QMap())
2017-06-21T20:28:23 [DEBUG] WebpageCallbacks - getJsConfirmCallback
2017-06-21T20:28:23 [DEBUG] WebpageCallbacks - getJsConfirmCallback

So there's a 45 second pause in the middle of it. I guess whatever in my javascript code is causing phantomjs to grind to a near halt improved slightly since the last time I tried it?

On my other machine where I had been getting the problem as well, but is passing now without increasing the timeout, these tests are pausing for almost 30 seconds.

On travis, by contrast, none of the affected tests are among the slowest 10, so they must be running under about 7 seconds. Before these tests started failing on my Debian machines, they were taking ~1-2 seconds.

Anyhow, it's likely a phantomjs issue rather than a poltergeist issue. I'm satisfied with being able to make my tests green (if slow) for now, and hopefully I can make a smooth transition to headless-chrome soon.

Thanks so much, @twalpole!

@ragesoss From the logs it looks like the last action before the pause is a click on something, is that correct? What does that click trigger?

Poltergeist attempts to detect clicks that change the browsers location and wait for that change to finish. It does that by waiting approx 5 ms after the click event is sent for any requests to have been made. If it sees a request then it waits for the page load to finish. It's possible with the travis servers being slow a request isn't being initiated within 5 ms so the tests aren't actually waiting for the load to finish which means they won't wait for all the sub-resources the page loads to complete either. However if a request is detected on your faster local machine and your page contains resources that load slowly/timeout due to throttling/unreachability/etc that could be what's causing your local tests to pause for 45 seconds. To fix that you should use the whitelist feature to only allow loading of urls you actually care about being in the page, and block the loading of third party resources that are unnecessary for your tests.

From the logs it looks like the last action before the pause is a click on something, is that correct? What does that click trigger?

It's a click on an 'Edit' button, which causes a React component to switch from view mode into edit mode. There's no change in browser location, but it does add some static resources (icons for Trix editor) to the page which would have to be fetched from the (local) server.

@ragesoss Hmmm - The contents of page.driver.network_traffic after the pause would be interesting and may provide some clues as to what is loading and being waited for.

page.driver.network_traffic looks like this after the pause:

[#<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d76e8
  @data=
   {"headers"=>
     [{"name"=>"Accept",
       "value"=>
        "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>1,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.619Z",
    "url"=>
     "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7738
     @data=
      {"body"=>"",
       "bodySize"=>9009,
       "contentType"=>"text/html; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"text/html; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"fdf434d2aee1cfa5e6633aae468a13b6\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"2d6a8aea-3f44-418a-b447-2750f87d211e"},
         {"name"=>"X-Runtime", "value"=>"0.171107"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Length", "value"=>"9009"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=WEI5RHlIRFZUOTNGRDVWazdiWUEyN3hrK09CWDFCbWNPSnkyaXZZMWM5cERRa3hHcDJ3WlE5b25pTUx1d3dIQVB4N0J4UlpJZWlzTU5JOXRrNDhvS1hiL0xsNCtvQ3dUUjhjcG5td3NMSDZXaWh5M09Ya3RsdEZ0bFdCZ09TQ0QtLWl6QStXNEx3UERadWJKL2oyVW1UYnc9PQ%3D%3D--c993fb8c2aba7b7704642abd44d3d58d0868f911; path=/; HttpOnly"}],
       "id"=>1,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.803Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7710
     @data=
      {"contentType"=>"text/html; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"text/html; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"fdf434d2aee1cfa5e6633aae468a13b6\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"2d6a8aea-3f44-418a-b447-2750f87d211e"},
         {"name"=>"X-Runtime", "value"=>"0.171107"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Length", "value"=>"9009"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=WEI5RHlIRFZUOTNGRDVWazdiWUEyN3hrK09CWDFCbWNPSnkyaXZZMWM5cERRa3hHcDJ3WlE5b25pTUx1d3dIQVB4N0J4UlpJZWlzTU5JOXRrNDhvS1hiL0xsNCtvQ3dUUjhjcG5td3NMSDZXaWh5M09Ya3RsdEZ0bFdCZ09TQ0QtLWl6QStXNEx3UERadWJKL2oyVW1UYnc9PQ%3D%3D--c993fb8c2aba7b7704642abd44d3d58d0868f911; path=/; HttpOnly"}],
       "id"=>1,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.807Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d7648
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"text/css,*/*;q=0.1"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>4,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.805Z",
    "url"=>"http://127.0.0.1:32929/assets/stylesheets/main-5c3ff9c825.css"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7698
     @data=
      {"body"=>"",
       "bodySize"=>65536,
       "contentType"=>"text/css",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Mon, 26 Jun 2017 15:08:50 GMT"},
         {"name"=>"Content-Type", "value"=>"text/css"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"535948"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>4,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.808Z",
       "url"=>
        "http://127.0.0.1:32929/assets/stylesheets/main-5c3ff9c825.css"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7670
     @data=
      {"contentType"=>"text/css",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Mon, 26 Jun 2017 15:08:50 GMT"},
         {"name"=>"Content-Type", "value"=>"text/css"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"535948"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>4,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.856Z",
       "url"=>
        "http://127.0.0.1:32929/assets/stylesheets/main-5c3ff9c825.css"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d75a8
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>5,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.806Z",
    "url"=>"http://127.0.0.1:32929/assets/javascripts/i18n.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d75f8
     @data=
      {"body"=>"",
       "bodySize"=>32365,
       "contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:17:25 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"32365"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>5,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.813Z",
       "url"=>"http://127.0.0.1:32929/assets/javascripts/i18n.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d75d0
     @data=
      {"contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:17:25 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"32365"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>5,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.813Z",
       "url"=>"http://127.0.0.1:32929/assets/javascripts/i18n.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d74e0
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>6,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.806Z",
    "url"=>"http://127.0.0.1:32929/assets/javascripts/i18n/en-US.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7558
     @data=
      {"body"=>"",
       "bodySize"=>22400,
       "contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:17:26 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"261812"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>6,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.812Z",
       "url"=>"http://127.0.0.1:32929/assets/javascripts/i18n/en-US.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7530
     @data=
      {"contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:17:26 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"261812"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>6,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.817Z",
       "url"=>"http://127.0.0.1:32929/assets/javascripts/i18n/en-US.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d73f0
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>7,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.806Z",
    "url"=>
     "http://127.0.0.1:32929/assets/javascripts/raven.20cb9e7bfb668a244a4e.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7490
     @data=
      {"body"=>"",
       "bodySize"=>65536,
       "contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:30 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"225902"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>7,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.813Z",
       "url"=>
        "http://127.0.0.1:32929/assets/javascripts/raven.20cb9e7bfb668a244a4e.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7468
     @data=
      {"contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:30 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"225902"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>7,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.816Z",
       "url"=>
        "http://127.0.0.1:32929/assets/javascripts/raven.20cb9e7bfb668a244a4e.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d7328
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>8,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.807Z",
    "url"=>"http://127.0.0.1:32929/assets/javascripts/vendor.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d73a0
     @data=
      {"body"=>"",
       "bodySize"=>65536,
       "contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:26 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1175514"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>8,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.815Z",
       "url"=>"http://127.0.0.1:32929/assets/javascripts/vendor.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7350
     @data=
      {"contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:26 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1175514"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>8,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.817Z",
       "url"=>"http://127.0.0.1:32929/assets/javascripts/vendor.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d7288
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>9,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.807Z",
    "url"=>
     "http://127.0.0.1:32929/assets/javascripts/main.20cb9e7bfb668a244a4e.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d72d8
     @data=
      {"body"=>"",
       "bodySize"=>65536,
       "contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:30 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"8607062"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>9,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.815Z",
       "url"=>
        "http://127.0.0.1:32929/assets/javascripts/main.20cb9e7bfb668a244a4e.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d72b0
     @data=
      {"contentType"=>"application/javascript",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:30 GMT"},
         {"name"=>"Content-Type", "value"=>"application/javascript"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"8607062"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>9,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:21.830Z",
       "url"=>
        "http://127.0.0.1:32929/assets/javascripts/main.20cb9e7bfb668a244a4e.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d71c0
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>10,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.807Z",
    "url"=>"http://d3js.org/d3.v3.min.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7210
     @data=
      {"body"=>"",
       "bodySize"=>23433,
       "contentType"=>"application/javascript; charset=utf-8",
       "headers"=>
        [{"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Type",
          "value"=>"application/javascript; charset=utf-8"},
         {"name"=>"Transfer-Encoding", "value"=>"chunked"},
         {"name"=>"Connection", "value"=>"keep-alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "__cfduid=d984ad8bbf9842e249d484b2559869b9c1498493661; expires=Tue, 26-Jun-18 16:14:21 GMT; path=/; domain=.d3js.org; HttpOnly"},
         {"name"=>"Last-Modified", "value"=>"Sat, 24 Jun 2017 14:58:15 GMT"},
         {"name"=>"Access-Control-Allow-Origin", "value"=>"*"},
         {"name"=>"Expires", "value"=>"Mon, 26 Jun 2017 20:14:21 GMT"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=14400"},
         {"name"=>"Content-Encoding", "value"=>"gzip"},
         {"name"=>"X-GitHub-Request-Id",
          "value"=>"513B:0CCB:15A3CAE:1F436F3:594E7E3B"},
         {"name"=>"CF-Cache-Status", "value"=>"HIT"},
         {"name"=>"Vary", "value"=>"Accept-Encoding"},
         {"name"=>"Server", "value"=>"cloudflare-nginx"},
         {"name"=>"CF-RAY", "value"=>"3751758a66f429d7-SEA"}],
       "id"=>10,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK",
       "time"=>"2017-06-26T16:14:21.828Z",
       "url"=>"http://d3js.org/d3.v3.min.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d71e8
     @data=
      {"contentType"=>"application/javascript; charset=utf-8",
       "headers"=>
        [{"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Type",
          "value"=>"application/javascript; charset=utf-8"},
         {"name"=>"Transfer-Encoding", "value"=>"chunked"},
         {"name"=>"Connection", "value"=>"keep-alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "__cfduid=d984ad8bbf9842e249d484b2559869b9c1498493661; expires=Tue, 26-Jun-18 16:14:21 GMT; path=/; domain=.d3js.org; HttpOnly"},
         {"name"=>"Last-Modified", "value"=>"Sat, 24 Jun 2017 14:58:15 GMT"},
         {"name"=>"Access-Control-Allow-Origin", "value"=>"*"},
         {"name"=>"Expires", "value"=>"Mon, 26 Jun 2017 20:14:21 GMT"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=14400"},
         {"name"=>"Content-Encoding", "value"=>"gzip"},
         {"name"=>"X-GitHub-Request-Id",
          "value"=>"513B:0CCB:15A3CAE:1F436F3:594E7E3B"},
         {"name"=>"CF-Cache-Status", "value"=>"HIT"},
         {"name"=>"Vary", "value"=>"Accept-Encoding"},
         {"name"=>"Server", "value"=>"cloudflare-nginx"},
         {"name"=>"CF-RAY", "value"=>"3751758a66f429d7-SEA"}],
       "id"=>10,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK",
       "time"=>"2017-06-26T16:14:21.849Z",
       "url"=>"http://d3js.org/d3.v3.min.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d7120
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>11,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.807Z",
    "url"=>"http://cdnjs.cloudflare.com/ajax/libs/vega/2.6.5/vega.min.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7170
     @data=
      {"body"=>"",
       "bodySize"=>15309,
       "contentType"=>"application/javascript; charset=utf-8",
       "headers"=>
        [{"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Type",
          "value"=>"application/javascript; charset=utf-8"},
         {"name"=>"Transfer-Encoding", "value"=>"chunked"},
         {"name"=>"Connection", "value"=>"keep-alive"},
         {"name"=>"Last-Modified", "value"=>"Fri, 06 Jan 2017 07:32:52 GMT"},
         {"name"=>"Expires", "value"=>"Sat, 16 Jun 2018 16:14:21 GMT"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=30672000"},
         {"name"=>"Access-Control-Allow-Origin", "value"=>"*"},
         {"name"=>"Content-Encoding", "value"=>"gzip"},
         {"name"=>"CF-Cache-Status", "value"=>"HIT"},
         {"name"=>"Vary", "value"=>"Accept-Encoding"},
         {"name"=>"Server", "value"=>"cloudflare-nginx"},
         {"name"=>"CF-RAY", "value"=>"3751758a868d7973-SEA"}],
       "id"=>11,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK",
       "time"=>"2017-06-26T16:14:21.847Z",
       "url"=>"http://cdnjs.cloudflare.com/ajax/libs/vega/2.6.5/vega.min.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7148
     @data=
      {"contentType"=>"application/javascript; charset=utf-8",
       "headers"=>
        [{"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Type",
          "value"=>"application/javascript; charset=utf-8"},
         {"name"=>"Transfer-Encoding", "value"=>"chunked"},
         {"name"=>"Connection", "value"=>"keep-alive"},
         {"name"=>"Last-Modified", "value"=>"Fri, 06 Jan 2017 07:32:52 GMT"},
         {"name"=>"Expires", "value"=>"Sat, 16 Jun 2018 16:14:21 GMT"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=30672000"},
         {"name"=>"Access-Control-Allow-Origin", "value"=>"*"},
         {"name"=>"Content-Encoding", "value"=>"gzip"},
         {"name"=>"CF-Cache-Status", "value"=>"HIT"},
         {"name"=>"Vary", "value"=>"Accept-Encoding"},
         {"name"=>"Server", "value"=>"cloudflare-nginx"},
         {"name"=>"CF-RAY", "value"=>"3751758a868d7973-SEA"}],
       "id"=>11,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK",
       "time"=>"2017-06-26T16:14:21.966Z",
       "url"=>
        "http://cdnjs.cloudflare.com/ajax/libs/vega/2.6.5/vega.min.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6f90
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>12,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.807Z",
    "url"=>
     "http://cdnjs.cloudflare.com/ajax/libs/vega-embed/2.2.0/vega-embed.min.js"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7030
     @data=
      {"body"=>"",
       "bodySize"=>6369,
       "contentType"=>"application/javascript; charset=utf-8",
       "headers"=>
        [{"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Type",
          "value"=>"application/javascript; charset=utf-8"},
         {"name"=>"Transfer-Encoding", "value"=>"chunked"},
         {"name"=>"Connection", "value"=>"keep-alive"},
         {"name"=>"Last-Modified", "value"=>"Wed, 11 Jan 2017 01:17:45 GMT"},
         {"name"=>"Expires", "value"=>"Sat, 16 Jun 2018 16:14:21 GMT"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=30672000"},
         {"name"=>"Access-Control-Allow-Origin", "value"=>"*"},
         {"name"=>"Content-Encoding", "value"=>"gzip"},
         {"name"=>"CF-Cache-Status", "value"=>"HIT"},
         {"name"=>"Vary", "value"=>"Accept-Encoding"},
         {"name"=>"Server", "value"=>"cloudflare-nginx"},
         {"name"=>"CF-RAY", "value"=>"3751758ab6a57973-SEA"}],
       "id"=>12,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK",
       "time"=>"2017-06-26T16:14:21.983Z",
       "url"=>
        "http://cdnjs.cloudflare.com/ajax/libs/vega-embed/2.2.0/vega-embed.min.js"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d7008
     @data=
      {"contentType"=>"application/javascript; charset=utf-8",
       "headers"=>
        [{"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Content-Type",
          "value"=>"application/javascript; charset=utf-8"},
         {"name"=>"Transfer-Encoding", "value"=>"chunked"},
         {"name"=>"Connection", "value"=>"keep-alive"},
         {"name"=>"Last-Modified", "value"=>"Wed, 11 Jan 2017 01:17:45 GMT"},
         {"name"=>"Expires", "value"=>"Sat, 16 Jun 2018 16:14:21 GMT"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=30672000"},
         {"name"=>"Access-Control-Allow-Origin", "value"=>"*"},
         {"name"=>"Content-Encoding", "value"=>"gzip"},
         {"name"=>"CF-Cache-Status", "value"=>"HIT"},
         {"name"=>"Vary", "value"=>"Accept-Encoding"},
         {"name"=>"Server", "value"=>"cloudflare-nginx"},
         {"name"=>"CF-RAY", "value"=>"3751758ab6a57973-SEA"}],
       "id"=>12,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK",
       "time"=>"2017-06-26T16:14:21.984Z",
       "url"=>
        "http://cdnjs.cloudflare.com/ajax/libs/vega-embed/2.2.0/vega-embed.min.js"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6ec8
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>13,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:21.962Z",
    "url"=>"http://127.0.0.1:32929/assets/images/wiki-logo.png"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6f18
     @data=
      {"body"=>"",
       "bodySize"=>4130,
       "contentType"=>"image/png",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:19 GMT"},
         {"name"=>"Content-Type", "value"=>"image/png"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"4130"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>13,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.184Z",
       "url"=>"http://127.0.0.1:32929/assets/images/wiki-logo.png"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6ef0
     @data=
      {"contentType"=>"image/png",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:19 GMT"},
         {"name"=>"Content-Type", "value"=>"image/png"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"4130"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:21 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>13,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.184Z",
       "url"=>"http://127.0.0.1:32929/assets/images/wiki-logo.png"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6e28
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"X-Requested-With", "value"=>"XMLHttpRequest"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>14,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.149Z",
    "url"=>
     "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/course.json"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6e78
     @data=
      {"body"=>"",
       "bodySize"=>1206,
       "contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"7ea587be2ba4e562f696fd16d80efe6d\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"77a68466-431c-4361-a3f0-08be3724ce1b"},
         {"name"=>"X-Runtime", "value"=>"0.069865"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"1206"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=NHlEZ3I1OElCM1Z2dk9RZlZxMWVma0dWZk9Sd2MrdDJwNjBtSkozWElsdHVIbTNvbWIvbmw5ZGs4YlNyKzc2RlpuaUVDNmpVZUJQRXZnNTU1NUl6NkVRM3VCdWI1Z1hEQko5R25WdDhtUng5NVRta091S2NKRmhjU2R5dGMyZDQtLUlnbE1qWGdwY0dkYUNYRU1McTc1ZGc9PQ%3D%3D--b11f1ab0595304dca7f9ce3da53d5d732fbfe3bb; path=/; HttpOnly"}],
       "id"=>14,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.221Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/course.json"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6e50
     @data=
      {"contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"7ea587be2ba4e562f696fd16d80efe6d\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"77a68466-431c-4361-a3f0-08be3724ce1b"},
         {"name"=>"X-Runtime", "value"=>"0.069865"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"1206"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=NHlEZ3I1OElCM1Z2dk9RZlZxMWVma0dWZk9Sd2MrdDJwNjBtSkozWElsdHVIbTNvbWIvbmw5ZGs4YlNyKzc2RlpuaUVDNmpVZUJQRXZnNTU1NUl6NkVRM3VCdWI1Z1hEQko5R25WdDhtUng5NVRta091S2NKRmhjU2R5dGMyZDQtLUlnbE1qWGdwY0dkYUNYRU1McTc1ZGc9PQ%3D%3D--b11f1ab0595304dca7f9ce3da53d5d732fbfe3bb; path=/; HttpOnly"}],
       "id"=>14,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.221Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/course.json"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6d38
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"X-Requested-With", "value"=>"XMLHttpRequest"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>15,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.149Z",
    "url"=>
     "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/users.json"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6dd8
     @data=
      {"body"=>"",
       "bodySize"=>23,
       "contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"6052bedf878d42516be36950ea2ce7f3\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"18dd0d06-8a5d-4c83-9577-a9de2c77fc92"},
         {"name"=>"X-Runtime", "value"=>"0.061589"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"23"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=Sm5GMUJhK2gvM1I1bS9ZZjl2NDFPVjFVR2tqUnJvZk5TUllGVmdDT0N5aFFSalN6c3pNcGlMd2V4a0pjbllhWjNGVCs5aTRjV01MbXNBNkxLYUVHeHU1Zld6ZWs3emNvRmlNV1J5NHduNGJtUFFxdGhKcmE3ZTNENDlHVFBtbTctLVpNVFg0MnZkc1NwQ2sybXJ3RUxVVHc9PQ%3D%3D--34ee35da98a44623e0919927c731188c460cef6a; path=/; HttpOnly"}],
       "id"=>15,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.284Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/users.json"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6d60
     @data=
      {"contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"6052bedf878d42516be36950ea2ce7f3\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"18dd0d06-8a5d-4c83-9577-a9de2c77fc92"},
         {"name"=>"X-Runtime", "value"=>"0.061589"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"23"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=Sm5GMUJhK2gvM1I1bS9ZZjl2NDFPVjFVR2tqUnJvZk5TUllGVmdDT0N5aFFSalN6c3pNcGlMd2V4a0pjbllhWjNGVCs5aTRjV01MbXNBNkxLYUVHeHU1Zld6ZWs3emNvRmlNV1J5NHduNGJtUFFxdGhKcmE3ZTNENDlHVFBtbTctLVpNVFg0MnZkc1NwQ2sybXJ3RUxVVHc9PQ%3D%3D--34ee35da98a44623e0919927c731188c460cef6a; path=/; HttpOnly"}],
       "id"=>15,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.285Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/users.json"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6bf8
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"X-Requested-With", "value"=>"XMLHttpRequest"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>16,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.150Z",
    "url"=>
     "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/campaigns.json"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6cc0
     @data=
      {"body"=>"",
       "bodySize"=>27,
       "contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"96278609181e357fc9c0c65e3b7031e3\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"5e6c03c8-73c4-4905-9a12-01453a24444f"},
         {"name"=>"X-Runtime", "value"=>"0.022181"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"27"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=ZWlYUnJzalFMcXBhRmpLVHhGSjNLUUttcHdWQkxkNGFBdDNmcWRsdmFvT1RnMXFJdjJLa0kyMzVSQ05adWlEa1dZQ3UwRkUyc3lWYUIxQVhzYnc2YktOeHliR3Fac0JqcmtWbDRJVVBocC9GbCtjUDgvYU9TSmh2cU83aXF2UU0tLW5OUVZSWTJuamU3MERVMHdJeVZJWHc9PQ%3D%3D--5710312d067f48b0de52e6e2f0eeec79b8ca709b; path=/; HttpOnly"}],
       "id"=>16,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.307Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/campaigns.json"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6c98
     @data=
      {"contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"96278609181e357fc9c0c65e3b7031e3\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"5e6c03c8-73c4-4905-9a12-01453a24444f"},
         {"name"=>"X-Runtime", "value"=>"0.022181"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"27"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=ZWlYUnJzalFMcXBhRmpLVHhGSjNLUUttcHdWQkxkNGFBdDNmcWRsdmFvT1RnMXFJdjJLa0kyMzVSQ05adWlEa1dZQ3UwRkUyc3lWYUIxQVhzYnc2YktOeHliR3Fac0JqcmtWbDRJVVBocC9GbCtjUDgvYU9TSmh2cU83aXF2UU0tLW5OUVZSWTJuamU3MERVMHdJeVZJWHc9PQ%3D%3D--5710312d067f48b0de52e6e2f0eeec79b8ca709b; path=/; HttpOnly"}],
       "id"=>16,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.307Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/campaigns.json"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6ae0
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"X-Requested-With", "value"=>"XMLHttpRequest"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>17,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.163Z",
    "url"=>
     "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline.json"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6ba8
     @data=
      {"body"=>"",
       "bodySize"=>549,
       "contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"9cd653419b40be975ceb965d46696a37\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"7dcce7cc-16d2-4390-b6ad-462a08d1d7e9"},
         {"name"=>"X-Runtime", "value"=>"0.028508"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"549"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=UlRndHZGUUxuaGtyWGFBVElCQWs2QWp5a0tTb0gyZzU2UnZkaTQzVFUvQ1Jib05PZzZ2eTQ1czNZR29EZUUzQmlvY3U4dG9kMFZIcTVHSEhSMFgyOVdZdXRObm1scUhhcFRDWHJJbXJHS2k5R3A2K2tzV3ZYOEVaNE5VQVFyaFUtLUxpcURicGpTc1Y3a09SWmYzRFhnS2c9PQ%3D%3D--5ef3da476b2d88a76af08ec009587570d778a372; path=/; HttpOnly"}],
       "id"=>17,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.339Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline.json"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6b08
     @data=
      {"contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"9cd653419b40be975ceb965d46696a37\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"7dcce7cc-16d2-4390-b6ad-462a08d1d7e9"},
         {"name"=>"X-Runtime", "value"=>"0.028508"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"549"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=UlRndHZGUUxuaGtyWGFBVElCQWs2QWp5a0tTb0gyZzU2UnZkaTQzVFUvQ1Jib05PZzZ2eTQ1czNZR29EZUUzQmlvY3U4dG9kMFZIcTVHSEhSMFgyOVdZdXRObm1scUhhcFRDWHJJbXJHS2k5R3A2K2tzV3ZYOEVaNE5VQVFyaFUtLUxpcURicGpTc1Y3a09SWmYzRFhnS2c9PQ%3D%3D--5ef3da476b2d88a76af08ec009587570d778a372; path=/; HttpOnly"}],
       "id"=>17,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.340Z",
       "url"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline.json"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d69a0
  @data=
   {"headers"=>
     [{"name"=>"Accept", "value"=>"*/*"},
      {"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"X-Requested-With", "value"=>"XMLHttpRequest"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}],
    "id"=>18,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.164Z",
    "url"=>"http://127.0.0.1:32929/training_modules.json"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6a90
     @data=
      {"body"=>"",
       "bodySize"=>754,
       "contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"8f185a7147759fd1883dd62b140dd2ff\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"7e25c80f-112b-4ebe-8ef4-8b4e7ce6edc7"},
         {"name"=>"X-Runtime", "value"=>"0.013298"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"754"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=bHBYY0o5cmI3VXM0UFRUMVhabHkyKzltTERHNXdwcWxCNldDOVllZHlYaHlFWjJwejdIc2lxRisxMEVNalBEa1laYklrNTQ1algvVGs4bTRxUEpCM25rNE1NUFZLaWFJUEFvaDhzSnQzRjNMQlpROEs2eVZXaXJCNUFvaFFyMmktLS9GRkwyaWFxRVRJOWQrTFFNVEdXa3c9PQ%3D%3D--66f288b695cbd0bc92983bcf793ae0685d8a650d; path=/; HttpOnly"}],
       "id"=>18,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.375Z",
       "url"=>"http://127.0.0.1:32929/training_modules.json"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6a18
     @data=
      {"contentType"=>"application/json; charset=utf-8",
       "headers"=>
        [{"name"=>"X-Frame-Options", "value"=>"SAMEORIGIN"},
         {"name"=>"X-Xss-Protection", "value"=>"1; mode=block"},
         {"name"=>"X-Content-Type-Options", "value"=>"nosniff"},
         {"name"=>"Content-Type", "value"=>"application/json; charset=utf-8"},
         {"name"=>"Etag", "value"=>"W/\"8f185a7147759fd1883dd62b140dd2ff\""},
         {"name"=>"Cache-Control",
          "value"=>"max-age=0, private, must-revalidate"},
         {"name"=>"X-Request-Id",
          "value"=>"7e25c80f-112b-4ebe-8ef4-8b4e7ce6edc7"},
         {"name"=>"X-Runtime", "value"=>"0.013298"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Content-Length", "value"=>"754"},
         {"name"=>"Connection", "value"=>"Keep-Alive"},
         {"name"=>"Set-Cookie",
          "value"=>
           "_wikiedudashboard_session=bHBYY0o5cmI3VXM0UFRUMVhabHkyKzltTERHNXdwcWxCNldDOVllZHlYaHlFWjJwejdIc2lxRisxMEVNalBEa1laYklrNTQ1algvVGs4bTRxUEpCM25rNE1NUFZLaWFJUEFvaDhzSnQzRjNMQlpROEs2eVZXaXJCNUFvaFFyMmktLS9GRkwyaWFxRVRJOWQrTFFNVEdXa3c9PQ%3D%3D--66f288b695cbd0bc92983bcf793ae0685d8a650d; path=/; HttpOnly"}],
       "id"=>18,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.376Z",
       "url"=>"http://127.0.0.1:32929/training_modules.json"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6838
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>19,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.184Z",
    "url"=>"http://127.0.0.1:32929/assets/images/icon-language.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6950
     @data=
      {"body"=>"",
       "bodySize"=>1816,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:18 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1816"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>19,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.217Z",
       "url"=>"http://127.0.0.1:32929/assets/images/icon-language.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6860
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:18 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1816"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>19,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.217Z",
       "url"=>"http://127.0.0.1:32929/assets/images/icon-language.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6720
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>20,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.218Z",
    "url"=>"http://127.0.0.1:32929/assets/fonts/icons.woff"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6770
     @data=
      {"body"=>"",
       "bodySize"=>1880,
       "contentType"=>"application/font-woff",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:17 GMT"},
         {"name"=>"Content-Type", "value"=>"application/font-woff"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1880"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>20,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.268Z",
       "url"=>"http://127.0.0.1:32929/assets/fonts/icons.woff"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6748
     @data=
      {"contentType"=>"application/font-woff",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:17 GMT"},
         {"name"=>"Content-Type", "value"=>"application/font-woff"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1880"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>20,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:22.268Z",
       "url"=>"http://127.0.0.1:32929/assets/fonts/icons.woff"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6630
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>21,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.986Z",
    "url"=>
     "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM2NjY2NjYiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij4NCiAgICA8cGF0aCBkPSJNNyAxMGw1IDUgNS01eiIvPg0KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4NCjwvc3ZnPg=="},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6680
     @data=
      {"body"=>"",
       "bodySize"=>181,
       "contentType"=>"image/svg+xml;charset=utf-8",
       "headers"=>
        [{"name"=>"Content-Type", "value"=>"image/svg+xml;charset=utf-8"},
         {"name"=>"Content-Length", "value"=>"181"}],
       "id"=>21,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>nil,
       "statusText"=>nil,
       "time"=>"2017-06-26T16:14:23.000Z",
       "url"=>
        "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM2NjY2NjYiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij4NCiAgICA8cGF0aCBkPSJNNyAxMGw1IDUgNS01eiIvPg0KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4NCjwvc3ZnPg=="}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6658
     @data=
      {"contentType"=>"image/svg+xml;charset=utf-8",
       "headers"=>
        [{"name"=>"Content-Type", "value"=>"image/svg+xml;charset=utf-8"},
         {"name"=>"Content-Length", "value"=>"181"}],
       "id"=>21,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>nil,
       "statusText"=>nil,
       "time"=>"2017-06-26T16:14:23.000Z",
       "url"=>
        "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM2NjY2NjYiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij4NCiAgICA8cGF0aCBkPSJNNyAxMGw1IDUgNS01eiIvPg0KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4NCjwvc3ZnPg=="}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d64f0
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>22,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:22.987Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trash-red.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6590
     @data=
      {"body"=>"",
       "bodySize"=>2405,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:18 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"2405"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>22,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:23.002Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trash-red.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6568
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:18 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"2405"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:22 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>22,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:14:23.002Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trash-red.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6360
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>23,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.001Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/bold.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d64a0
     @data=
      {"body"=>"",
       "bodySize"=>485,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:19 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"485"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>23,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.859Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/bold.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6400
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:19 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"485"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>23,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.859Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/bold.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d6068
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>24,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.001Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/italic.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6310
     @data=
      {"body"=>"",
       "bodySize"=>290,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"290"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>24,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.856Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/italic.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6248
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"290"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>24,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.856Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/italic.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5fc8
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>25,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.001Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/strike.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d6018
     @data=
      {"body"=>"",
       "bodySize"=>1107,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1107"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>25,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.856Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/strike.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5ff0
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"1107"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>25,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.857Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/strike.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5f28
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>26,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.001Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/link.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5f78
     @data=
      {"body"=>"",
       "bodySize"=>2126,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"2126"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>26,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.858Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/link.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5f50
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"2126"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>26,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.859Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/link.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5e88
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>27,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.001Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/quote.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5ed8
     @data=
      {"body"=>"",
       "bodySize"=>395,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"395"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>27,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.857Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/quote.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5eb0
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"395"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>27,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.857Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/quote.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5d98
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>28,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.001Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/code.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5e38
     @data=
      {"body"=>"",
       "bodySize"=>506,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"506"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>28,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.858Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/code.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5e10
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"506"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>28,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.858Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/code.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5cf8
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>29,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.002Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/bullets.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5d48
     @data=
      {"body"=>"",
       "bodySize"=>477,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"477"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>29,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.860Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/bullets.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5d20
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"477"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>29,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.860Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/bullets.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5aa0
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>30,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.002Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/numbers.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5c30
     @data=
      {"body"=>"",
       "bodySize"=>511,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"511"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>30,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.861Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/numbers.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5ac8
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"511"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>30,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.861Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/numbers.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5960
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>31,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.002Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/undo.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5a00
     @data=
      {"body"=>"",
       "bodySize"=>521,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"521"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>31,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.860Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/undo.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5988
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"521"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>31,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.860Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/undo.svg"}>]>,
 #<Capybara::Poltergeist::NetworkTraffic::Request:0x0000000a2d5820
  @data=
   {"headers"=>
     [{"name"=>"Referer",
       "value"=>
        "http://127.0.0.1:32929/courses/WINTR/Underwater_basket-weaving_(spring_2015)/timeline"},
      {"name"=>"User-Agent",
       "value"=>
        "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"},
      {"name"=>"Accept", "value"=>"*/*"}],
    "id"=>32,
    "method"=>"GET",
    "time"=>"2017-06-26T16:14:23.002Z",
    "url"=>"http://127.0.0.1:32929/assets/images/trix/redo.svg"},
  @error=nil,
  @response_parts=
   [#<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5870
     @data=
      {"body"=>"",
       "bodySize"=>525,
       "contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"525"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>32,
       "redirectURL"=>nil,
       "stage"=>"start",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.861Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/redo.svg"}>,
    #<Capybara::Poltergeist::NetworkTraffic::Response:0x0000000a2d5848
     @data=
      {"contentType"=>"image/svg+xml",
       "headers"=>
        [{"name"=>"Last-Modified", "value"=>"Fri, 23 Jun 2017 15:16:20 GMT"},
         {"name"=>"Content-Type", "value"=>"image/svg+xml"},
         {"name"=>"Cache-Control", "value"=>"public, max-age=3600"},
         {"name"=>"Content-Length", "value"=>"525"},
         {"name"=>"Server", "value"=>"WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26)"},
         {"name"=>"Date", "value"=>"Mon, 26 Jun 2017 16:14:23 GMT"},
         {"name"=>"Connection", "value"=>"Keep-Alive"}],
       "id"=>32,
       "redirectURL"=>nil,
       "stage"=>"end",
       "status"=>200,
       "statusText"=>"OK ",
       "time"=>"2017-06-26T16:15:08.861Z",
       "url"=>"http://127.0.0.1:32929/assets/images/trix/redo.svg"}>]>]

There are a few fetches from http://cdnjs.cloudflare.com and http://d3js.org, but it appears to be the Trix assets that have the long delay between request and response.

@ragesoss Yep -- Are you 100% sure you don't have any gems (or system config/firewalls) installed that are throttling requests, rack-attack, etc?

@ragesoss Also, I notice from the headers that you're using WEBrick as the server, if your production setup doesn't use WEBrick (I would guess it doesn't) try setting Capybara.server = :puma and seeing if that makes a difference

Are you 100% sure you don't have any gems that are throttling requests installed, rack-attack, etc?

Not that I'm aware of: https://github.com/WikiEducationFoundation/WikiEduDashboard/blob/master/Gemfile

Also, I notice from the headers that you're using WEBrick as the server, if your production setup doesn't use WEBrick (I would guess it doesn't) try setting Capybara.server = :puma and seeing if that makes a difference

Production uses Passenger, but I just tried the spec with Puma: no difference.

@ragesoss I've cloned the repo and figured out mostly how to setup/run the tests -- which tests are you seeing this behavior on? On a side note, the number of sleeps in these feature tests mens the tests are taking at least a minute to 2 longer than they should

@ragesoss Does it happen if you only run the tests from that file? or only if you run all the feature tests? If it does happen for you when running only the tests from that file, then I can't replicate it.

It happens when testing only that file (and with focus on that single test, which is how I was experimenting with it).

hmmm -- I can't replicate it then... since it would be the first request when testing alone it's possible you're somehow triggering a rails asset pipeline rebuild, try looking in log/test.log to see if it says anything around the asset requests

Nothing suspicious that I notice in test.log. There's noise that appears to be rspec/rspec-rails#1800 but otherwise just that long unexplained pause.

(The app does not use rails asset pipeline.)

@ragesoss It's not supposed to be using the asset pipeline -- but that's the only explanation I can come up with (especially if the delay between request and response is in the test.log too since that rules out any throttling outside the rails app). So it may be that while your app doesn't use the asset pipeline your tests could somehow be triggering it.

@twalpole thanks again for all the help. I'll explore the asset pipeline theory more; I thought since the sprockets gem isn't in the Gemfile, that ruled out asset pipeline running at all.

But I also don't see the requests for those specific assets in the log file at all. (They are static assets that don't go through a controller, so that seems like the normal behavior.) The pause is between the initial get request and the post request at the end, but I think what happens in between is all javascript and static assets.