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

HTTP-ответ 200 с Capybara

Я пытаюсь использовать несколько вариантов для проверки ответа 200 Ok HTTP с Capybara, но не из них не работает:

response.should be_success
page.status.should be(200)
page.response.status.should == 200

Есть ли еще один?

4b9b3361

Ответ 1

Я нашел его:

page.status_code.should be 200

И он отлично работает!!!

Ответ 2

Поскольку текущая версия RSpec выдает предупреждение об устаревании, я бы предложил изменить ваше решение на:

expect(page.status_code).to be(200)

Это работает для меня.

P.S. Предупреждение об отказе является следующим:

DEPRECATION: использование should из rspec-ожиданий 'old :shouldсинтаксис без явного включения синтаксиса устарел. Использовать новый синтаксис :expect или явно включите :should.

Ответ 3

оба ответа, и спрашивающий не сказал, какой драйвер они используют. Его важная информация, которая делает разницу. Чтобы предоставить полную информацию, этот не работает с selenium webdriver, хотя работает с драйверами poltergeist и capybara-webkit

Ответ 4

Selenium досадно не предоставляет никаких данных заголовка или HTTP-статуса, поэтому я написал это промежуточное программное обеспечение, чтобы вставить комментарий HTML, содержащий код состояния HTTP для использования с Capybara.

module Vydia
  module Middleware
    class InjectHeadersForSelenium

      def initialize(app)
        @app = app
      end

      def call(env)
        @status, @headers, @response = @app.call(env)

        if @headers["Content-Type"] && @headers["Content-Type"].include?("text/html")
          @prepend = "<!-- X-Status-Code=#{@status} -->\n"
          @headers = @headers.merge(
            "Content-Length" => (@headers["Content-Length"].to_i + @prepend.size).to_s
          )
        end

        [@status, @headers, self]
      end

      def each(&block)
        if @prepend
          yield(@prepend)
          @prepend = nil
        end

        @response.each(&block)
      end

    end
  end
end

В тестах вы можете получить код состояния следующим образом:

def get_http_status
  begin
    page.driver.status_code
  rescue Capybara::NotSupportedByDriverError
    matches = /<!-- X-Status-Code=(\d{3}) -->/.match(page.body)
    matches && matches[1] && matches[1].to_i
  end
end

get_http_status

Ответ 5

В качестве альтернативы вы можете использовать клиентский API Ruby Http для проверки кода ответа или ввести

В одну сторону:

response = Net::HTTP.get_response(URI.parse(current_url))

expect(response.kind_of? Net::HTTPSuccess).to be_truthy

Второй способ:

response = Net::HTTP.get_response(URI.parse(current_url))

expect(response.code.to_i.eql?(200)).to be_truthy #response.code returns the code as a string

PS: Вам не нужно скачивать какие-либо внешние гемы, так как они поставляются с библиотекой Ruby