如何为Capybara请求及测试添加HTTP请求头?
当然有办法啦!针对你当前使用的Chrome/Selenium和capybara-webkit两种驱动,分别有对应的添加HTTP请求头的方案,结合你的gem版本给你详细说明:
针对Chrome/Selenium驱动(你当前配置的默认JS驱动)
在你的capybara (2.4.4) + chromedriver-helper (1.0.0) 环境下,可以通过修改Chrome启动参数或者注入JavaScript两种方式添加请求头:
方法1:通过Chrome启动参数设置全局请求头
修改你现有的Chrome驱动注册代码,添加--header启动参数来指定自定义请求头:
Capybara.register_driver :chrome do |app| options = Selenium::WebDriver::Chrome::Options.new # 格式为 "Header-Name: Value",可以添加多个 options.add_argument('--header=X-Custom-Header: MyTestValue') options.add_argument('--header=Another-Test-Header: HelloWorld') Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end Capybara.javascript_driver = :chrome Capybara::Screenshot.register_driver(:chrome) do |driver, path| driver.browser.save_screenshot(path) end
注意:部分较新版本的Chrome可能移除了--header这个启动参数,如果遇到参数无效的情况,可以试试下面的JavaScript注入方法。
方法2:注入JavaScript覆盖XMLHttpRequest(适配AJAX请求)
如果启动参数方法不生效,可以在测试前注入一段JS,让页面内所有AJAX请求自动带上自定义头:
# 在你的测试用例中(比如before钩子)添加 before(:each) do page.execute_script <<-JS (function() { const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { this.setRequestHeader('X-Custom-Header', 'MyTestValue'); this.setRequestHeader('Another-Test-Header', 'HelloWorld'); return originalOpen.apply(this, arguments); }; })(); JS end
注意:这个方法仅对页面加载后的AJAX请求生效,初始页面加载的请求可能不会带上自定义头,如果需要覆盖初始请求,推荐尝试方法1或者切换到capybara-webkit驱动。
针对capybara-webkit驱动
你使用的capybara-webkit (1.5.2) 原生支持设置HTTP请求头,方式更简洁可靠,还能覆盖初始页面加载的请求:
方法1:全局配置驱动时设置
注册webkit驱动时直接添加请求头:
Capybara.register_driver :webkit do |app| driver = Capybara::Webkit::Driver.new(app) # 设置单个或多个请求头 driver.header('X-Custom-Header', 'MyTestValue') driver.header('Another-Test-Header', 'HelloWorld') driver end # 若需要将webkit设为默认JS驱动,取消下面注释 # Capybara.javascript_driver = :webkit
方法2:单个测试用例中临时设置
在特定测试的钩子中添加请求头,仅对当前测试生效:
before(:each) do page.driver.header('X-Custom-Header', 'MyTestValue') end
内容的提问来源于stack exchange,提问作者kapso
相关产品推荐
相关产品推荐

