我正在使用Cucumber和Capybara。我需要发出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
但这不起作用。
答案 0 :(得分:29)
page.driver.submit :delete, "/comments/#{comment_id}", {}
文档:http://rubydoc.info/gems/capybara/1.1.2/Capybara/RackTest/Browser:submit
答案 1 :(得分:6)
如果您使用的驱动程序不支持自定义HTTP请求(例如Capybara-webkit,请参阅closed issue和当前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
答案 2 :(得分:1)
page.driver.delete("/comments/#{comment_id}")
使用delete
正常工作。无需使用较低级submit
方法。
PS:使用capybara-webkit 1.6.0和capybara 2.4.4进行测试
答案 3 :(得分:1)
如果您需要一个保留会话信息的解决方案(例如,如果您需要将DELETE
请求作为经过身份验证的用户发出),那么这将同时适用于{ {1}}驱动程序和 :rack_test
驱动程序(假设您的应用程序中有jQuery可用),请尝试以下操作:
:webkit
我怀疑这也适用于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
驱动程序,但尚未对其进行测试。也许其他人可以参与其中。
答案 4 :(得分:0)
这适用于硒。假设您在
上调用的任何页面上都有一个注销按钮/链接而不是:
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