mengatur header permintaan di Selenium

Saya mencoba menyetel tajuk permintaan 'Referer' untuk memalsukan permintaan yang datang dari situs lain. Kami memerlukan tes kemampuan untuk menggunakan perujuk tertentu, yang mengembalikan formulir tertentu kepada pengguna, jika tidak, formulir alternatif akan diberikan.

Saya dapat melakukan ini dalam poltergeist dengan:

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

tapi saya tidak dapat menemukan fungsi yang setara untuk driver selemium.

Bagaimana saya bisa mengatur header permintaan di driver capybara Selenium?


person tamouse    schedule 26.03.2013    source sumber
comment
Kemungkinan duplikat: Header dan Selenium Webdriver 2, http://stackoverflow.com/q/6478672/841064   -  person Andrei Botalov    schedule 27.03.2013
comment
Kemungkinan duplikat lainnya: Bagaimana cara menambahkan header atau parameter ke permintaan HTTP yang ditangani dengan Selenium Webdriver?   -  person Andrei Botalov    schedule 27.03.2013
comment
Terima kasih Andrey. Saya bertanya-tanya mengapa ini tidak ditawarkan ketika saya mencari...   -  person tamouse    schedule 28.03.2013


Jawaban (10)


Webdriver tidak berisi API untuk melakukannya. Lihat edisi 141 dari pelacak Selenium untuk info lebih lanjut. Judul masalahnya menyatakan bahwa ini tentang header respons tetapi diputuskan bahwa Selenium tidak akan berisi API untuk header permintaan dalam cakupan masalah ini. Beberapa masalah tentang penambahan API untuk menyetel header permintaan telah ditandai sebagai duplikat: pertama, kedua, ketiga.

Berikut beberapa kemungkinan yang dapat saya usulkan:

  1. Gunakan driver/perpustakaan lain selain Selenium
  2. Tulis plugin khusus browser (atau temukan yang sudah ada) yang memungkinkan Anda menambahkan header untuk permintaan.
  3. Gunakan browsermob-proxy atau proxy lainnya.

Saya akan memilih opsi 3 dalam banyak kasus. Itu tidak sulit.

Perhatikan bahwa Ghostdriver memiliki API untuk itu tetapi tidak didukung oleh driver lain.

person Andrei Botalov    schedule 26.03.2013
comment
Saya telah menggunakan poltergeist untuk mengatur Referer, yang mencapai tujuan pengujian. Saya juga ingin menggunakan Selenium dengan kepala untuk menampilkannya berfungsi bagi mereka yang tertarik. - person tamouse; 28.03.2013
comment
Saya akan menggunakan [browsermob-proxy], itu tidak sulit. – Kelihatannya cukup samar bagi saya! Dari sudut pandang saya, ini juga tampak seperti alat yang sangat besar untuk masalah yang sangat kecil. - person chadoh; 30.04.2014
comment
Jika Anda membuat atau menggunakan plugin khusus browser untuk menambahkan header permintaan, Anda dapat mengotomatiskan pengujian plugin seperti yang disebutkan di sini - blazemeter.com/blog/. Dengan begitu Anda dapat mengotomatiskan pengaturan plugin dengan header sebelum kode pengujian Anda dimulai. Namun, pendekatan ini tampaknya tidak mudah. - person MasterJoe; 08.04.2017
comment
Ini: Webdriver tidak berisi API untuk melakukannya. - person maaw; 09.05.2017
comment
sedang mencoba browsermob-proxy, tidak sulit sama sekali. Sayangnya saya hanya bisa membuatnya berfungsi dengan HtmlUnit, bukan Firefox atau Chrome. Kembali ke titik 1. - person Florian Wicher; 11.01.2020
comment
@FlorianWicher silakan periksa ini: sqa.stackexchange.com/questions/37227/ - person Pawel Nieradka; 09.04.2020

Bagi orang-orang yang menggunakan Python, Anda dapat mempertimbangkan untuk menggunakan Selenium Wire yang juga dapat mengatur header permintaan memberi Anda kemampuan untuk memeriksa permintaan dan tanggapan.

from seleniumwire import webdriver  # Import from seleniumwire

# Create a new instance of the Chrome driver (or Firefox)
driver = webdriver.Chrome()

# Create a request interceptor
def interceptor(request):
    del request.headers['Referer']  # Delete the header first
    request.headers['Referer'] = 'some_referer'

# Set the interceptor on the driver
driver.request_interceptor = interceptor

# All requests will now use 'some_referer' for the referer
driver.get('https://mysite')
person Will Keeling    schedule 19.08.2018
comment
Saya harus menggunakan driver._client.set_header_overrides(headers=dict_headers) untuk menyelesaikan masalah saya. - person Kartikey Singh; 01.02.2019

Saya memiliki masalah yang sama. Saya menyelesaikannya dengan mengunduh add-on firefox modifikasi-header dan mengaktifkannya dengan Selenium.

Kode dalam python adalah sebagai berikut

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)
person Fernando Marengo    schedule 06.01.2017
comment
Namun, ini tidak berfungsi dengan Firefox Quantum (57.+). - person Dio; 02.08.2018
comment
ekstensi ini harus diperbarui sesuai dengan manifes baru agar berfungsi dengan 57+ fox - person d-d; 05.04.2019

Mengalami masalah yang sama hari ini, hanya saja saya perlu menetapkan referensi berbeda untuk setiap pengujian. Saya akhirnya menggunakan middleware dan kelas untuk meneruskan header ke sana. Saya pikir saya akan berbagi (atau mungkin ada solusi yang lebih bersih?):

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

Kemudian saya dapat memasukkan konteks bersama di mana pun saya membutuhkannya, atau meneruskan header berbeda di blok before lainnya. Saya belum mengujinya dengan apa pun selain Selenium dan RackTest, tetapi harus transparan, karena injeksi header dilakukan sebelum permintaan benar-benar masuk ke aplikasi.

person HargrimmTheBleak    schedule 19.06.2013
comment
Waspadalah terhadap cattr_accessor :headers — ini akan mempertahankan header di antara pengujian, jadi Anda mungkin perlu menghapusnya di middleware: @helper.heades = nil, jika tidak, bersiaplah untuk bersenang-senang men-debug pengujian yang tidak stabil nanti. - person Yuriy Kharchenko; 15.10.2019

Jika Anda menggunakan HtmlUnitDriver, Anda dapat mengatur header permintaan dengan memodifikasi WebClient, seperti:

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

Header kemudian akan berisi semua permintaan yang dibuat oleh browser web.

person John P    schedule 23.03.2017

Saya menginginkan sesuatu yang sedikit lebih ramping untuk RSpec/Ruby sehingga kode khusus hanya harus berada di satu tempat. Inilah solusi saya:

/spec/support/selenium.rb
...
RSpec.configure do |config|
  config.after(:suite) do
    $custom_headers = nil
  end
end

module RequestWithExtraHeaders
  def headers
    $custom_headers.each do |key, value|
      self.set_header "HTTP_#{key}", value
    end if $custom_headers

    super
  end
end
class ActionDispatch::Request
  prepend RequestWithExtraHeaders
end

Kemudian dalam spesifikasi saya:

/specs/features/something_spec.rb
...
$custom_headers = {"Referer" => referer_string}
person Glenn    schedule 04.06.2019

Dengan solusi yang sudah dibahas di atas, solusi yang paling dapat diandalkan adalah menggunakan Browsermob-Proxy

Namun saat bekerja dengan mesin jaringan jarak jauh, Browsermob-proxy tidak terlalu membantu.

Inilah cara saya memperbaiki masalah dalam kasus saya. Semoga dapat bermanfaat bagi siapa pun yang memiliki pengaturan serupa.

  1. Tambahkan ekstensi ModHeader ke browser chrome

Bagaimana cara mengunduh Modheadernya? Tautan

ChromeOptions options = new ChromeOptions();
options.addExtensions(new File(C://Downloads//modheader//modheader.crx));

// Set the Desired capabilities 
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);

// Instantiate the chrome driver with capabilities
WebDriver driver = new RemoteWebDriver(new URL(YOUR_HUB_URL), options);
  1. Buka ekstensi browser dan ambil ID konteks Penyimpanan Lokal dari ModHeader

Ambil ID dari ModHeader

  1. Arahkan ke URL ModHeader untuk mengatur Konteks Penyimpanan Lokal

.

// set the context on the extension so the localStorage can be accessed
driver.get("chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/_generated_background_page.html");

Where `idgpnmonknjnojddfkpgkljpfnnfcklj` is the value captured from the Step# 2
  1. Sekarang tambahkan header ke permintaan menggunakan Javascript

.

   ((Javascript)driver).executeScript(
         "localStorage.setItem('profiles', JSON.stringify([{  title: 'Selenium', hideComment: true, appendMode: '', 
             headers: [                        
               {enabled: true, name: 'token-1', value: 'value-1', comment: ''},
               {enabled: true, name: 'token-2', value: 'value-2', comment: ''}
             ],                          
             respHeaders: [],
             filters: []
          }]));");

Dimana token-1, value-1, token-2, value-2 adalah header permintaan dan nilai yang akan ditambahkan.

  1. Sekarang navigasikan ke aplikasi web yang diperlukan.

    driver.get("your-desired-website");

person Praveen    schedule 17.06.2020
comment
Hai, kedengarannya bagus tapi saya mendapatkan kesalahan ini: org.openqa.selenium.WebDriverException: <unknown>: Failed to read the 'localStorage' property from 'Window': Access is denied for this document. - person Y-B Cause; 26.03.2021

Jika Anda menggunakan javacsript dan hanya ingin menerapkannya di chrome, Dalang adalah opsi terbaik karena memiliki dukungan asli untuk mengubah header. Lihat ini: https://pptr.dev/#?product=Puppeteer&version=v10.1.0&show=api-pagesetextrahttpheadersheaders

Meskipun untuk penggunaan lintas-browser Anda dapat memeriksa paket @requestly/selenium npm. Ini adalah pembungkus ekstensi permintaan untuk memungkinkan integrasi yang mudah di Selenium-webdriver. Ekstensi ini dapat mengubah header. Lihat: https://www.npmjs.com/package/@requestly/selenium

person Nafees Nehar    schedule 24.07.2021

Anda dapat melakukannya dengan PhantomJSDriver.

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

Dengan menggunakan objek permintaan, Anda juga dapat memfilter sehingga header tidak disetel untuk setiap permintaan.

person stijn van crombrugge    schedule 22.12.2017

lihat ini: chrome_options = Opsi()

chrome_options.add_argument('--headless')
chrome_options.add_argument('user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"')

Masalah terpecahkan!

person Jame    schedule 04.05.2019
comment
ini tidak menyelesaikan masalah atau menjawab pertanyaan apa pun. - person Corey Goldberg; 31.05.2019
comment
Saya tidak tahu apakah itu menjawab pertanyaan yang diajukan atau tidak. Tapi itu menyelesaikan masalah saya dalam meneruskan agen pengguna di header saat menggunakan driver tanpa kepala. Saya rasa ini diperlukan di beberapa situs yang memerlukan header seperti itu untuk berhenti membuang data - person user3046442; 11.04.2020
comment
Terima kasih banyak! Ini menipu situs dengan berpikir bahwa browser tanpa kepala sebenarnya adalah browser normal dengan header. Ini menyelesaikan masalah saya! - person Mihir Verma; 04.03.2021