Как заставить Capybara выполнить запрос DELETE в функции огурца? - PullRequest
22 голосов
/ 10 февраля 2012

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

visit "/comment/" + comment_id, :delete

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

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

get 'path'

И сделать почтовый запрос:

page.driver.post 'path'

Но как мне имитировать DELETE запрос?

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

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

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

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

Ответы [ 5 ]

29 голосов
/ 23 июля 2012
page.driver.submit :delete, "/comments/#{comment_id}", {}

Документация по адресу: http://rubydoc.info/gems/capybara/1.1.2/Capybara/RackTest/Browser:submit

6 голосов
/ 08 октября 2013

Если вы используете драйвер, который не поддерживает пользовательские HTTP-запросы (например, Capybara-webkit, см. закрытая проблема и текущий драйвер ), вы можете просто временно переключиться на 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
1 голос
/ 12 апреля 2016

Если вам нужно решение, которое будет сохранять информацию о сеансе (например, если вам нужно, чтобы ваш запрос 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, но не проверял его. Может быть, кто-то еще может вмешаться в это.

1 голос
/ 07 ноября 2015
page.driver.delete("/comments/#{comment_id}")

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

PS: протестировано с capybara-webkit 1.6.0 и capybara 2.4.4

0 голосов
/ 25 июля 2015

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

Вместо:

visit '/logout'

Do:

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

#... elsewhere in a step
logout_user
...