2013-03-26 164 views
35

我在嘗試設置請求標頭'Referer'來欺騙來自另一個站點的請求。我們需要使用特定引用者的能力測試,它向用戶返回特定表單,否則會給出替代表單。在硒中設置請求標頭

我可以騷靈之內做到這一點:

page.driver.headers = {"Referer" => referer_string} 

,但我無法找到該selemium司機等效的功能。

如何在水豚selenium驅動程序中設置請求標頭?

+0

可能的重複:[Headers and Selenium Webdriver 2](http://stackoverflow.com/q/13047195/841064),[如何使用Selenium 2發送http RequestHeader?](http://stackoverflow.com/ q/6478672/841064) – 2013-03-27 08:17:37

+0

另一種可能的重複:[如何添加標頭或參數到Selenium Webdriver處理的HTTP請求?](http://stackoverflow.com/q/10426860/841064) – 2013-03-27 08:27:38

+0

謝謝,Andrey。我想知道爲什麼這些沒有提供當我搜索... – tamouse 2013-03-28 04:53:25

回答

25

Webdriver不包含API來執行此操作。有關更多信息,請參閱issue 141 from Selenium tracker。問題的標題說這是關於響應標題,但它決定Selenium不會在此問題的範圍中包含請求標頭的API。關於添加API來設置請求標頭的幾個問題已標記爲重複項:first,second,third

這裏有一對夫婦的可能性,我可以提出:

  1. ,而不是使用硒
  2. 另一個驅動器/庫編寫特定的瀏覽器插件(或找到一個現有的),它允許你添加請求頭。
  3. 使用browsermob-proxy或其他代理。

在大多數情況下,我會選擇3。這並不難。

請注意,Ghostdriver has an API for it但它不支持其他驅動程序。

+1

我一直在使用poltergeist設置Referer,它確實完成了測試的目標。我也想用硒頭來展示它爲那些感興趣的人工作。 – tamouse 2013-03-28 04:56:59

+1

「我會用[browsermob-proxy]去,這不難。」 - 我看起來很神祕!從我的角度來看,它也是一個非常小的問題的非常大的工具。 – chadoh 2014-04-30 17:57:34

+0

如果您創建或使用瀏覽器特定的插件來添加請求標頭,那麼您可以自動執行插件測試,如此處所述 - https://www.blazemeter.com/blog/6-easy-steps-testing-your-chrome-擴展硒。這樣,您可以在測試代碼開始之前自動設置帶有標題的插件。但是,這種方法似乎並不容易。 – testerjoe2 2017-04-07 23:16:56

4

今天有同樣的問題,除了我需要設置不同的引用每個測試。我最終使用中間件和類來傳遞標題。想我會分享(或者也許有一個更清潔的解決方案?):

lib/request_headers.rb: 

class CustomHeadersHelper 
    cattr_accessor :headers 
end 

class RequestHeaders 
    def initialize(app, helper = nil) 
    @app, @helper = app, helper 
    end 

    def call(env) 
    if @helper 
     headers = @helper.headers 

     if headers.is_a?(Hash) 
     headers.each do |k,v| 
      env["HTTP_#{k.upcase.gsub("-", "_")}"] = v 
     end 
     end 
    end 

    @app.call(env) 
    end 
end 

config/initializers/middleware.rb 

require 'request_headers' 

if %w(test cucumber).include?(Rails.env) 
    Rails.application.config.middleware.insert_before Rack::Lock, "RequestHeaders", CustomHeadersHelper 
end 

spec/support/capybara_headers.rb 

require 'request_headers' 

module CapybaraHeaderHelpers 
    shared_context "navigating within the site" do 
    before(:each) { add_headers("Referer" => Capybara.app_host + "/") } 
    end 

    def add_headers(custom_headers) 
    if Capybara.current_driver == :rack_test 
     custom_headers.each do |name, value| 
     page.driver.browser.header(name, value) 
     end 
    else 
     CustomHeadersHelper.headers = custom_headers 
    end 
    end 
end 

spec/spec_helper.rb 

... 
config.include CapybaraHeaderHelpers 

然後,我可以包括共享的背景下,無論我需要,或者在另一個before塊中傳遞不同的標題。我沒有用Selenium和RackTest之外的其他測試,但它應該是透明的,因爲在請求實際上碰到應用程序之前就完成了頭部注入。

7

我有同樣的問題。我解決了它下載修改頭Firefox的插件,並用硒激活它。

在Python代碼如下

fp = webdriver.FirefoxProfile() 
path_modify_header = 'C:/xxxxxxx/modify_headers-0.7.1.1-fx.xpi' 
fp.add_extension(path_modify_header) 

fp.set_preference("modifyheaders.headers.count", 1) 
fp.set_preference("modifyheaders.headers.action0", "Add") 
fp.set_preference("modifyheaders.headers.name0", "Name_of_header") # Set here the name of the header 
fp.set_preference("modifyheaders.headers.value0", "value_of_header") # Set here the value of the header 
fp.set_preference("modifyheaders.headers.enabled0", True) 
fp.set_preference("modifyheaders.config.active", True) 
fp.set_preference("modifyheaders.config.alwaysOn", True) 

driver = webdriver.Firefox(firefox_profile=fp) 
0

如果使用HtmlUnitDriver,你可以通過修改WebClient設置請求頭,就像這樣:然後

final case class Header(name: String, value: String) 

final class HtmlUnitDriverWithHeaders(headers: Seq[Header]) extends HtmlUnitDriver { 
    super.modifyWebClient { 
    val client = super.getWebClient 
    headers.foreach(h => client.addRequestHeader(h.name, h.value)) 
    client 
    } 
} 

頭將出現對網頁瀏覽器提出的所有請求

0

你可以用PhantomJSDriver來完成。

PhantomJSDriver pd = ((PhantomJSDriver) ((WebDriverFacade) getDriver()).getProxiedDriver()); 
pd.executePhantomJS(
      "this.onResourceRequested = function(request, net) {" + 
      " net.setHeader('header-name', 'header-value')" + 
      "};"); 

使用請求對象,你也可以過濾,所以不會爲每個請求設置標題。