impostazione delle intestazioni di richiesta nel selenium

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.

Posso farlo nel poltergeist di:

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

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

Come posso impostare le intestazioni delle richieste nel driver del selenium capybara?

Webdriver non contiene un’API per farlo. Vedi il numero 141 del 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: primo , secondo , terzo .

Ecco un paio di possibilità che posso proporre:

  1. Utilizzare un altro driver / libreria al posto del selenium
  2. Scrivi un plugin specifico per il browser (o trova uno esistente) che ti permetta di aggiungere un’intestazione per la richiesta.
  3. Usa browsermob-proxy o qualche altro proxy.

Andrei con l’opzione 3 nella maggior parte dei casi. Non è difficile.

Si noti che Ghostdriver ha un’API per questo, ma non è supportato da altri driver.

Ho avuto lo stesso problema. Ho risolto il problema scaricando l’add-on firefox di modify-headers e triggersndolo con selenium.

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) 

Ho avuto lo stesso problema oggi, tranne che avevo bisogno di impostare un referente diverso per test. Ho finito per usare un middleware e una class 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 

Quindi posso includere il contesto condiviso ovunque sia necessario, o passare intestazioni diverse in un altro before blocco. 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.

Per coloro che usano Python, si può prendere in considerazione l’utilizzo di Selenium Wire , che può impostare le intestazioni delle richieste, oltre a fornire la possibilità di ispezionare richieste e risposte.

 from seleniumwire import webdriver # Import from seleniumwire # Create a new instance of the Firefox driver driver = webdriver.Firefox() driver.header_overrides = { 'Referer': 'referer_string', } # All subsequent requests will now contain the Referer 

Se si utilizza HtmlUnitDriver , è ansible impostare le intestazioni delle richieste 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.

Puoi farlo con PhantomJSDriver.

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

Usando l’object richiesta, puoi anche filtrare in modo che l’intestazione non venga impostata per ogni richiesta.