Ответ 1
page.driver.submit :delete, "/comments/#{comment_id}", {}
Документация по адресу: http://rubydoc.info/gems/capybara/1.1.2/Capybara/RackTest/Browser:submit
Я использую Огурец и Капибару. Мне нужно сделать запрос 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
Но это не работает.
page.driver.submit :delete, "/comments/#{comment_id}", {}
Документация по адресу: http://rubydoc.info/gems/capybara/1.1.2/Capybara/RackTest/Browser:submit
Если вы используете драйвер, который не поддерживает пользовательские 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
page.driver.delete("/comments/#{comment_id}")
Использовать delete
отлично. Не нужно использовать метод submit
более низкого уровня для этого.
PS: проверено с помощью capybara-webkit 1.6.0 и capybara 2.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
, но не проверял его. Может быть, кто-то еще может это сделать.
Это работает в селене. Предполагая, что у вас есть кнопка выхода/ссылка на любую страницу, на которую она вызывается,
Вместо:
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