establecer encabezados de solicitud en selenium

Estoy intentando establecer el encabezado de solicitud ‘Referer’ para falsificar una solicitud proveniente de otro sitio. Necesitamos la prueba de capacidad de utilizar un referente específico, que devuelve un formulario específico al usuario; de lo contrario, se proporciona una forma alternativa.

Puedo hacer esto dentro de poltergeist por:

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

pero no puedo encontrar la funcionalidad equivalente para el controlador de selemium.

¿Cómo puedo configurar los encabezados de solicitud en el controlador de selenium de capibara?

Webdriver no contiene una API para hacerlo. Vea el problema 141 del rastreador de Selenio para obtener más información. El título del problema dice que se trata de encabezados de respuesta, pero se decidió que Selenium no contendrá API para los encabezados de solicitud en el scope de este problema. Varios problemas sobre agregar API para establecer encabezados de solicitud se han marcado como duplicados: primero , segundo , tercero .

Aquí hay un par de posibilidades que puedo proponer:

  1. Use otro controlador / biblioteca en lugar de selenium
  2. Escriba un complemento específico del navegador (o encuentre uno existente) que le permita agregar un encabezado para la solicitud.
  3. Use browsermob-proxy o algún otro proxy.

Me gustaría ir con la opción 3 en la mayoría de los casos. No es dificil.

Tenga en cuenta que Ghostdriver tiene una API, pero no es compatible con otros controladores.

Tuve el mismo problema. Lo resolví descargando add-on add-on de modify-headers y lo activé con selenium.

El código en python es el siguiente

 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) 

Tuve el mismo problema hoy, excepto que necesitaba establecer diferentes referencias por prueba. Terminé usando un middleware y una clase para pasarle encabezados. ¿Pensé en compartir (o quizás hay una solución más limpia?):

 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 

Luego puedo incluir el contexto compartido donde sea que necesite, o pasar diferentes encabezados en otro bloque before . No lo he probado con otra opción que no sea Selenium y RackTest, pero debe ser transparente, ya que la inyección de encabezado se realiza antes de que la solicitud llegue a la aplicación.

Para las personas que usan Python, puede considerar usar Selenium Wire , que puede establecer encabezados de solicitud, así como también proporcionarle la capacidad de inspeccionar solicitudes y respuestas.

 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 

Si usa HtmlUnitDriver , puede establecer encabezados de solicitud modificando el WebClient , de esta forma:

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

Los encabezados estarán en todas las solicitudes realizadas por el navegador web.

Puedes hacerlo con PhantomJSDriver.

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

Al usar el objeto de solicitud, también puede filtrar para que el encabezado no se configure para cada solicitud.