2013-03-26 16 views
35

Sto tentando di impostare l'intestazione della richiesta 'Referer' per falsificare una richiesta proveniente da un altro sito. Abbiamo bisogno del test di abilità che viene utilizzato un referente specifico, che restituisce un modulo specifico all'utente, altrimenti viene fornito un modulo alternativo.impostazione delle intestazioni di richiesta nel selenio

posso farlo entro poltergeist da:

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

ma non riesco a trovare la funzionalità equivalente per il driver selemium.

Come posso impostare le intestazioni di richiesta nel driver di selenio capybara?

+0

Possibili duplicati: [Intestazioni e Selenium Webdriver 2] (http://stackoverflow.com/q/13047195/841064), [Come inviare un http RequestHeader utilizzando Selenium 2?] (Http://stackoverflow.com/ q/6478672/841064) –

+0

Un altro possibile duplicato: [Come aggiungere intestazioni o parametri a una richiesta HTTP gestita con Selenium Webdriver?] (http://stackoverflow.com/q/10426860/841064) –

+0

Grazie, Andrey. Mi chiedo perché questi non sono stati offerti quando stavo cercando ... – tamouse

risposta

25

Webdriver non contiene un'API per farlo. Vedi issue 141 from Selenium tracker per maggiori informazioni. Il titolo del problema dice che riguarda le intestazioni di risposta, ma è stato deciso che Selenium non conterrà API per le intestazioni delle richieste nell'ambito di questo problema. Diversi problemi relativi all'aggiunta dell'API per impostare le intestazioni delle richieste sono stati contrassegnati come duplicati: first, second, third.

Qui ci sono un paio di possibilità che io possa proporre:

  1. Utilizzare un altro driver/biblioteca al posto di selenio
  2. Scrivi un plugin specifico del browser (o trovare uno esistente) che consente di aggiungere intestazione per richiesta.
  3. Utilizzare browsermob-proxy o qualche altro proxy.

Vorrei andare con l'opzione 3 nella maggior parte dei casi. Non è difficile.

Si noti che Ghostdriver has an API for it ma non è supportato da altri driver.

+1

Ho usato poltergeist per impostare il Referer, che raggiunge l'obiettivo per il test. Volevo anche usare il selenio con una testa per poterlo mostrare funzionante per gli interessati. – tamouse

+1

"Io vado con [browsermob-proxy], non è difficile." - Mi sembra abbastanza criptico! Inoltre, dal mio punto di vista, sembra uno strumento davvero grande per un problema davvero piccolo. – chadoh

+0

Se crei o utilizzi un plug-in specifico per browser per aggiungere intestazioni di richiesta, puoi automatizzare i test dei plug-in come indicato qui: https://www.blazemeter.com/blog/6-easy-steps-testing-your-chrome- estensione-selenio. In questo modo puoi automatizzare la configurazione del plug-in con le intestazioni prima che inizi il codice di test. Tuttavia, questo approccio non sembra essere facile. – testerjoe2

4

Aveva lo stesso problema oggi, tranne che avevo bisogno di impostare un referente diverso per test. Ho finito per usare un middleware e una classe per passare le intestazioni ad esso. Ho pensato di condividere (o forse c'è una soluzione più pulita?):

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 

allora posso comprendere il contesto condiviso ovunque ho bisogno o passare diverse intestazioni in un altro blocco before. Non l'ho provato con qualcosa di diverso da Selenium e RackTest, ma dovrebbe essere trasparente, poiché l'iniezione di intestazione viene eseguita prima che la richiesta colpisca effettivamente l'applicazione.

7

Ho avuto lo stesso problema. Ho risolto il problema scaricando l'add-on firefox di modify-headers e attivandolo con selenio.

Il codice in Python è il seguente

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

Se si utilizza il HtmlUnitDriver, è possibile impostare gli header di richiesta modificando il WebClient, in questo modo:

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 
    } 
} 

Le intestazioni saranno quindi su tutte le richieste fatte dal browser web.

0

È possibile farlo con PhantomJSDriver.

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

Utilizzando l'oggetto richiesta, è possibile anche filtrare in modo che l'intestazione non venga impostata per ogni richiesta.

Problemi correlati