Using Cucumber / Capybara in Rails 3, how to set a User-Agent user line?

In my Rails 3 app, I have different layouts for iPhone and desktop browsers. I am trying to verify iPhone layout using Cucumber / Capybara. So far, all attempts to set the iPhone User-Agent string in the HTTP request header have failed.

I followed Testing Custom Headers and ssl with Cucumber and Capybara , but it does not seem to set the User-Agent string in the HTTP request.

If I just view the Rails application using my iPhone, I get the correct layout. I use Rack-Mobile-Detect to install Rails request.format in: iphone.

Any ideas on how to make this work? I am ready for the ditch of Capybara and will return to Webrath.

Here is what I still have:

Feature: Detect Browser In order to have different layouts for iPhone vs. desktop browsers As a developer I want to show different layouts for different browsers Scenario: Show home page with desktop layout Given I am using "a desktop browser" When I go to "the home page" Then I should see "desktop browser" Scenario: Show home page with iPhone layout Given I am using "mobile safari" When I go to "the home page" Then show me the page Then I should see "mobile safari" 

Detect_browser_steps.rb

 Given /^(?:|I )am using (.+)$/ do |browser| case browser when "mobile safari" agent = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16" add_headers({'User-Agent' => agent}) else # don't set a special User-Agent header end end 

headers_hack.rb

 # http://aflatter.de/2010/06/testing-headers-and-ssl-with-cucumber-and-capybara/ # The following solution will work only if you use the :rack_test driver. module RackTestMixin def self.included(mod) mod.class_eval do # This is where we save additional entries. def hacked_env @hacked_env ||= {} end # Alias the original method for further use. alias_method :original_env, :env # Override the method to merge additional headers. # Plus this implicitly makes it public. def env original_env.merge(hacked_env) end end end end Capybara::Driver::RackTest.send :include, RackTestMixin module HeadersHackHelper def add_headers(headers) page.driver.hacked_env.merge!(headers) end end World(HeadersHackHelper) 
+2
ruby-on-rails testing cucumber capybara
Aug 03 '10 at 17:44
source share
2 answers

I had to play a little, but in the end I managed to get it to work by adding:

 # features/support/capybara_headers.rb: module CapybaraHeadersHelper def add_headers(headers) headers.each do |name, value| page.driver.browser.header(name, value) end end end World(CapybaraHeadersHelper) 

You can get more information in this blog post I wrote, but basically that.

+6
Feb 14 2018-12-14T00:
source share

Hey there. Glad you found my post; -)

Have you checked if Rack::Test passes your header to the controller? You can try something like Rails.logger.info("Headers: #{headers.inspect}") in your controller, and then check your log file.

+1
Aug 18 '10 at 17:06
source share



All Articles