69

別のサイトからのリクエストをスプーフィングするようにリクエストヘッダー「Referer」を設定しようとしています。特定のリファラーが使用されていることをテストする必要があります。これにより、特定のフォームがユーザーに返されます。そうでない場合は、別のフォームが提供されます。

私はポルターガイスト内でこれを行うことができます:

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

しかし、selemiumドライバーと同等の機能が見つかりません。

カピバラセレンドライバーでリクエストヘッダーを設定するにはどうすればよいですか?

4

11 に答える 11

49

Webdriverにはそれを行うためのAPIが含まれていません。詳細については、Seleniumトラッカーの141号を参照してください。問題のタイトルは、応答ヘッダーに関するものであると述べていますが、Seleniumには、この問題の範囲内で要求ヘッダー用のAPIが含まれないことが決定されました。リクエストヘッダーを設定するためのAPIの追加に関するいくつかの問題は、重複としてマークされています:firstsecondthird

これが私が提案できるいくつかの可能性です:

  1. セレンの代わりに別のドライバー/ライブラリを使用する
  2. リクエスト用のヘッダーを追加できるブラウザ固有のプラグインを作成します(または既存のプラグインを見つけます)。
  3. browsermob-proxyまたはその他のプロキシを使用します。

ほとんどの場合、オプション3を使用します。それは難しいことではありません。

GhostdriverにはAPIがありますが、他のドライバーではサポートされていないことに注意してください。

于 2013-03-26T20:51:07.407 に答える
33

Pythonを使用している場合は、リクエストヘッダーを設定できるだけでなく、リクエストとレスポンスを検査する機能を提供できるSeleniumWireの使用を検討してください。

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')

インストール方法:

pip install selenium-wire
于 2018-08-19T15:44:29.250 に答える
9

私も同じ問題を抱えていました。私はそれをmodify-headersfirefoxアドオンをダウンロードして解決し、セレンでアクティブ化しました。

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)
于 2017-01-06T20:54:15.883 に答える
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以外ではテストしていませんが、リクエストが実際にアプリケーションにヒットする前にヘッダーインジェクションが行われるため、透過的である必要があります。

于 2013-06-19T17:46:22.760 に答える
2

RSpec / Rubyには少しスリムなものが欲しかったので、カスタムコードは1か所にしか存在しませんでした。これが私の解決策です:

/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

それから私のスペックでは:

/specs/features/something_spec.rb
...
$custom_headers = {"Referer" => referer_string}
于 2019-06-04T15:10:12.523 に答える
2

javacsriptを使用していて、Chromeにのみ実装したい場合は、ヘッダーを変更するためのネイティブサポートがあるため、 Puppeteerが最適なオプションです。これをチェックしてください:https ://pptr.dev/#?product = Puppeteer&version = v10.1.0&show = api-pagesetextrahttpheadersheaders

@requestly/seleniumクロスブラウザの使用については、 npmパッケージをチェックしてください。これは、 selenium- webdriverに簡単に統合できるようにするための、要求の多い拡張機能のラッパーです。拡張機能は、ヘッダーを変更できます。チェックアウト:https ://www.npmjs.com/package/@requestly/selenium

于 2021-07-24T21:06:53.157 に答える
1

を使用する場合は、次のように 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
  }
}

ヘッダーは、Webブラウザーによって行われたすべての要求に適用されます。

于 2017-03-23T18:09:31.520 に答える
1

上ですでに説明したソリューションで、最も信頼できるソリューションはBrowsermob-Proxy

しかし、リモートグリッドマシンで作業している間、Browsermob-proxyは実際には役に立ちません。

これが私の場合の問題の修正方法です。うまくいけば、同様の設定を持つ人に役立つかもしれません。

  1. ModHeader拡張機能をChromeブラウザに追加します

Modheaderをダウンロードする方法は?リンク

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. ブラウザ拡張機能に移動し、ModHeaderのローカルストレージコンテキストIDをキャプチャします

ModHeaderからIDをキャプチャします

  1. ModHeaderのURLに移動して、ローカルストレージコンテキストを設定します

// 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. 次に、を使用してリクエストにヘッダーを追加します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: []
          }]));");

ここtoken-1value-1、、、、はtoken-2value-2追加されるリクエストヘッダーと値です。

  1. 次に、必要なWebアプリケーションに移動します。

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

于 2020-06-17T10:54:52.353 に答える
1

Webドライバーでリクエストヘッダーを直接設定することはできません。これは本当です。

ただし、ブラウザのdevtools(私はedge&chromeでテストしました)を使用してこの問題を回避することができ、これは完全に機能します。

ドキュメントによると、カスタムヘッダーを追加する可能性があります: https ://chromedevtools.github.io/devtools-protocol/tot/Network/

以下の例をご覧ください。

    [Test]
    public async Task AuthenticatedRequest()
    {
        await LogMessage("=== starting the test ===");

        EdgeOptions options = new EdgeOptions {UseChromium = true};
        options.AddArgument("no-sandbox");
        var driver = new RemoteWebDriver(new Uri(_testsSettings.GridUrl), options.ToCapabilities(), TimeSpan.FromMinutes(3));

        //Get DevTools
        IDevTools devTools = driver;

        //DevTools Session
        var session = devTools.GetDevToolsSession();

        var devToolsSession = session.GetVersionSpecificDomains<DevToolsSessionDomains>();
        await devToolsSession.Network.Enable(new Network.EnableCommandSettings());
        
        var extraHeader = new Network.Headers();
        var data = await Base64KerberosTicket();
        var headerValue = $"Negotiate {data}";
        
        await LogMessage($"header values is {headerValue}");

        extraHeader.Add("Authorization", headerValue);
        await devToolsSession.Network.SetExtraHTTPHeaders(new Network.SetExtraHTTPHeadersCommandSettings
        {
            Headers = extraHeader
        });

        driver.Url = _testsSettings.TestUrl;

        driver.Navigate();
        driver.Quit();

        await LogMessage("=== ending the test ===");
    }

これはC#で記述された例ですが、おそらくJava、Python、および主要なプラットフォームでも同じように機能します。

それがコミュニティに役立つことを願っています。

于 2021-10-06T10:55:38.580 に答える
-1

PhantomJSDriverでそれを行うことができます。

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

リクエストオブジェクトを使用して、ヘッダーがすべてのリクエストに設定されないようにフィルタリングすることもできます。

于 2017-12-22T13:11:29.123 に答える
-2

これをチェックしてください:chrome_options = Options()

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"')

問題が解決しました!

于 2019-05-04T05:41:49.450 に答える