首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails 3中使用Cucumber/Capybara,如何设置自定义User-Agent字符串?

在Rails 3中使用Cucumber/Capybara,如何设置自定义User-Agent字符串?
EN

Stack Overflow用户
提问于 2010-08-04 01:44:31
回答 2查看 4.9K关注 0票数 2

在我的Rails3应用中,我对iPhone和桌面浏览器有不同的布局。我正在尝试使用Cucumber/Capybara测试iPhone布局。到目前为止,我在请求的HTTP头中设置iPhone用户代理字符串的所有尝试都失败了。

我遵循了Testing custom headers and ssl with Cucumber and Capybara教程,但它似乎没有在HTTP请求中设置User-Agent字符串。

如果我只是使用我的iPhone浏览我的Rails应用程序,我就会得到正确的布局。我使用Rack-Mobile-Detect将Rails request.format设置为:iphone。

有没有关于如何让它工作的想法?我准备抛弃Capybara,回到Webrat。

这是我到目前为止所知道的:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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)
EN

回答 2

Stack Overflow用户

发布于 2012-02-15 00:46:57

我不得不在这方面做了一些工作,但最后我设法让它工作,只需添加以下内容:

代码语言:javascript
复制
# 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)

你可以在我写的这个blog post中获得更多信息,但基本上就这些了。

票数 6
EN

Stack Overflow用户

发布于 2010-08-19 01:06:10

嘿你好啊。很高兴你找到了我的帖子;-)

你有没有检查过Rack::Test是否把你的头传递给了控制器?你可以在你的控制器中尝试类似Rails.logger.info("Headers: #{headers.inspect}")的东西,然后检查你的日志文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3399156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档