Подтвердить что ты не робот

Capybara не пропускает заголовок после формы submit

Я создаю приложение Rails 3, которое отображает разные представления для мобильных устройств (с использованием jQuery Mobile) и обычных настольных браузеров. Я тестирую Cucumber/Capybara и имею отдельные комплекты тестов для мобильных устройств и браузера. Я могу установить мобильную строку User-Agent в HTTP-заголовке запроса просто отлично, используя найденный здесь заголовок заголовков...

Использование Cucumber/Capybara в Rails 3, как установить пользовательскую строку User-Agent?

Проблема...

Большинство моих мобильных шагов Cucumber работают нормально (например, я устанавливаю заголовок мобильного устройства на шаг, после чего визуализуются мобильные представления). Однако после отправки формы тест затем отображает представление обозревателя на следующем шаге (а не мобильное представление, которое я хочу). Я думаю, что это может быть связано с тем, что Capybara бросает заголовок после действия отправки формы.

Я попытался проверить это, добавив регистратор в мое действие контроллера, чтобы я мог посмотреть заголовки user_agent следующим образом:

def show
    # …
    logger.info("Headers: #{request.user_agent}")
    # …
end

Я использовал заголовок iPhone (покупатель - это ресурс). В моем test.log я вижу:

Для действия create...

Started POST "/buyers" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#create as HTML
  #...
Headers: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
  #...
Redirected to http://www.example.com/buyers/1
Completed 302 Found in 7ms

Для последующего действия show (примечание "Заголовки: пусто)...

Started GET "/buyers/1" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#show as HTML
 #...
Headers: 
 #...
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 1.4ms)

Как и следовало ожидать, "покажите мне шаг страницы, а затем отобразите страницу браузера, а не мобильную страницу, которую я хочу.

Как сохранить заголовок, чтобы все мои мобильные действия выполнялись в моем мобильном наборе тестов?

Обновление

Jnicklas (создатель поистине удивительного камня Капибары!) отвечает:

"Это больше вопрос, чем проблема. tbh. В Rack-Test в настоящее время нет способа достичь этого недостатка, который я знаю. Я думал о добавлении опции заголовка в драйвер стеллажа, который позволит передавать различные варианты заголовков. Если вы используете много JavaScript, Selenium может быть лучше в любом случае и позволяет вам свободно устанавливать пользовательский агент, IIRC."

https://github.com/jnicklas

https://github.com/jnicklas/capybara

4b9b3361

Ответ 1

Эта функция была добавлена ​​в Capybara 25 апреля 2011 года с этой фиксацией - https://github.com/jnicklas/capybara/commit/a00435d63085ac2e74a0f64e7b7dedc0f7252ea9

Теперь вы можете указать настраиваемый заголовок при использовании пользовательского драйвера Capybara. См. http://automagical.posterous.com/creating-a-custom-capybara-driver для примеров кода.

Ответ 2

Вот как мы его исправили, чтобы работать с javascript (обратите внимание, используйте remove_headers в блоке After):

module CapybaraHeadersHelper
  def add_headers(headers)
    headers.each do |name, value|
      case page.driver.class.to_s
      when "Capybara::RackTest::Driver"
        page.driver.options[:headers] ||= {}
        page.driver.options[:headers][name.to_s] = value

      when "Capybara::Driver::Webkit"
        page.driver.browser.header name, value

      end
    end
  end

  def remove_headers(headers)
    headers.each do |name|
      case page.driver.class.to_s
      when "Capybara::RackTest::Driver"
        page.driver.options[:headers] ||= {}
        page.driver.options[:headers].delete name.to_s

      when "Capybara::Driver::Webkit"
        page.driver.browser.header name, nil

      end
    end
  end
end

World(CapybaraHeadersHelper)