2013-03-26 10 views
35

में सेटिंग अनुरोध हेडर मैं एक अनुरोध एक अन्य साइट से आ रही धोखा करने के लिए अनुरोध हेडर 'Referer' सेट करने का प्रयास कर रहा हूँ। हमें क्षमता परीक्षण की आवश्यकता है कि एक विशिष्ट रेफरर का उपयोग किया जाता है, जो उपयोगकर्ता को एक विशिष्ट रूप देता है, अन्यथा वैकल्पिक रूप दिया जाता है।सेलेनियम

मैं द्वारा poltergeist के भीतर ऐसा कर सकते हैं:

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

लेकिन मैं selemium ड्राइवर के लिए बराबर कार्यक्षमता नहीं मिल रहा।

मैं कैसे capybara सेलेनियम ड्राइवर में अनुरोध हेडर सेट कर सकते हैं?

+0

संभावित डुप्लीकेट: [हेडर और सेलेनियम वेबड्राइवर 2] (http://stackoverflow.com/q/13047195/841064), [सेलेनियम 2 का उपयोग कर http RequestHeader कैसे भेजें?] (Http://stackoverflow.com/ क्यू/6478672/841064) –

+0

एक और संभावित डुप्लिकेट: [सेलेनियम वेबड्राइवर के साथ संभाले गए HTTP अनुरोध में हेडर या पैरामीटर कैसे जोड़ें?] (http://stackoverflow.com/q/10426860/841064) –

+0

धन्यवाद, एंड्री। मुझे आश्चर्य है कि जब मैं खोज रहा था तो इन्हें क्यों पेश नहीं किया गया था ... – tamouse

उत्तर

25

Webdriver यह करने के लिए एक API शामिल नहीं है। अधिक जानकारी के लिए issue 141 from Selenium tracker देखें। इस मुद्दे का शीर्षक कहता है कि यह प्रतिक्रिया शीर्षकों के बारे में है लेकिन यह निर्णय लिया गया था कि सेलेनियम में इस मुद्दे के दायरे में अनुरोध शीर्षकों के लिए एपीआई नहीं होगी। स्थापित करने के लिए अनुरोध हेडर डुप्लिकेट के रूप में चिह्नित किया गया है एपीआई जोड़ने के बारे में कई मुद्दों: first, second, third

  1. सेलेनियम
  2. की बजाय किसी दूसरे ड्राइवर/पुस्तकालय का उपयोग एक ब्राउज़र-विशिष्ट प्लगइन लिखें (या किसी मौजूदा लगता है) आप जोड़ने की अनुमति देता है कि:

    यहाँ है कि मैं प्रस्ताव कर सकते हैं संभावनाओं के एक जोड़े हैं अनुरोध के लिए हेडर।

  3. उपयोग browsermob-proxy या कुछ अन्य प्रॉक्सी।

मैं ज्यादातर मामलों में विकल्प 3 के साथ जाऊंगा। यह मुश्किल नहीं है।

ध्यान दें कि Ghostdriver has an API for it लेकिन यह अन्य ड्राइवरों द्वारा समर्थित नहीं है।

+1

मैं रेफरर सेट करने के लिए पोल्टरजिस्ट का उपयोग कर रहा हूं, जो परीक्षण के लिए लक्ष्य पूरा करता है। मैं दिलचस्पी रखने वालों के लिए काम करने के लिए एक सिर के साथ सेलेनियम का भी उपयोग करना चाहता था। – tamouse

+1

"मैं [browsermob-proxy] के साथ जाऊंगा, यह मुश्किल नहीं है।" - यह मेरे लिए बहुत गूढ़ दिखता है! यह भी, मेरे लाभ से, वास्तव में एक छोटी सी समस्या के लिए वास्तव में एक बड़ा उपकरण की तरह दिखता है। – chadoh

+0

यदि आप अनुरोध शीर्षलेख जोड़ने के लिए ब्राउज़र विशिष्ट प्लगइन बनाते हैं या उपयोग करते हैं, तो आप यहां वर्णित प्लगइन परीक्षण स्वचालित कर सकते हैं - https://www.blazemeter.com/blog/6-easy-steps-testing-your-chrome- एक्सटेंशन-सेलेनियम। इस तरह से आप अपने टेस्ट कोड शुरू होने से पहले हेडर के साथ प्लगइन सेट अप स्वचालित कर सकते हैं। हालांकि, यह दृष्टिकोण आसान प्रतीत नहीं होता है। – testerjoe2

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 ब्लॉक में विभिन्न शीर्षलेख पास करें। मैंने सेलेनियम और रैकटेस्ट के अलावा किसी अन्य चीज़ के साथ इसका परीक्षण नहीं किया है, लेकिन यह पारदर्शी होना चाहिए, क्योंकि अनुरोध वास्तव में एप्लिकेशन को हिट करने से पहले हेडर इंजेक्शन किया जाता है।

7

मुझे एक ही समस्या थी। मैंने इसे संशोधित-हेडर फ़ायरफ़ॉक्स ऐड-ऑन डाउनलोड करने और इसे सेलेनियम के साथ सक्रिय करने का हल किया।

अजगर में कोड पीछा कर रहा है

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

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

हेडर तो हो जाएगा वेब ब्राउज़र द्वारा किए गए सभी अनुरोधों पर।

0

आप इसे फैंटॉमजेएसड्राइवर के साथ कर सकते हैं।

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

अनुरोध ऑब्जेक्ट का उपयोग करके, आप फ़िल्टर भी कर सकते हैं ताकि प्रत्येक अनुरोध के लिए हेडर सेट नहीं किया जाएगा।