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

Как сделать Capybara сделать запрос DELETE в функции огурца?

Я использую Огурец и Капибару. Мне нужно сделать запрос HTTP DELETE. Раньше функции использовали webrat, поэтому простой оператор вроде

visit "/comment/" + comment_id, :delete

работал, но теперь я использую Capybara.

Способ сделать запрос GET просто:

get 'path'

И для выполнения запроса по почте:

page.driver.post 'path'

Но как я могу имитировать запрос DELETE?

Я узнал, что драйвер Capybara использует Capybara::RackTest::Driver, если это любая помощь.

Я также пробовал:

Capybara.current_session.driver.delete "/comments/" + comment_id

Но это не работает.

4b9b3361

Ответ 2

Если вы используете драйвер, который не поддерживает пользовательские HTTP-запросы (например, Capybara-webkit, см. закрытый вопрос и текущий driver), вы можете просто временно переключиться на драйвер RackTest, чтобы отправить запрос.

Например:

# Submit an HTTP delete request, using rack_test driver
def http_delete path
  current_driver = Capybara.current_driver
  Capybara.current_driver = :rack_test
  page.driver.submit :delete, path, {}
  Capybara.current_driver = current_driver
end

Ответ 3

page.driver.delete("/comments/#{comment_id}")

Использовать delete отлично. Не нужно использовать метод submit более низкого уровня для этого.

PS: проверено с помощью capybara-webkit 1.6.0 и capybara 2.4.4

Ответ 4

Если вам необходимо решение, которое сохранит информацию о сеансе (например, если вам нужен ваш запрос DELETE, который будет выдан как аутентифицированный пользователь), и это будет работать как с драйвером :rack_test, так и с драйвером :webkit (если у вас есть jQuery, доступный в вашем приложении), попробуйте что-то вроде этого:

def manual_http_request(method, path)
  if Capybara.current_driver == :rack_test
    page.driver.submit method, path, {}
  else
    page.execute_script("$.ajax({url: '#{path}', data: {}, type: '#{method}'});")
    # Wait for the request to finish executing...
    Timeout.timeout(10) { loop until page.evaluate_script('jQuery.active').zero? }
  end
end

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

Ответ 5

Это работает в селене. Предполагая, что у вас есть кнопка выхода/ссылка на любую страницу, на которую она вызывается,

Вместо:

visit '/logout'

делать:

def logout_user
  logout_link = page.first('#my_css_selector')
  logout_link.click if logout_link
end

#... elsewhere in a step
logout_user