Можем ли мы передать дополнительные заголовки в экземпляр браузера с помощью webdriver? [Дубликат]

Да, вы можете очень легко загружать файлы с удаленного URL. Используя этот код. Этот код работает отлично для меня.

func DownlondFromUrl(){
   // Create destination URL 
let documentsUrl:URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
let destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.jpg")

//Create URL to the source file you want to download
let fileURL = URL(string: "https://s3.amazonaws.com/learn-swift/IMG_0001.JPG")

let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)

let request = URLRequest(url:fileURL!)

let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
    if let tempLocalUrl = tempLocalUrl, error == nil {
        // Success
        if let statusCode = (response as? HTTPURLResponse)?.statusCode {
            print("Successfully downloaded. Status code: \(statusCode)")
        }

        do {
            try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
        } catch (let writeError) {
            print("Error creating a file \(destinationFileUrl) : \(writeError)")
        }

    } else {
        print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
    }
}
task.resume()
}
36
задан Andrei Botalov 26 March 2013 в 23:48
поделиться

6 ответов

Webdriver не содержит API для этого. См. вопрос 141 из Selenium tracker для получения дополнительной информации. Название проблемы говорит о том, что речь идет об заголовках ответов, но было решено, что Selenium не будет содержать API для заголовков запросов в рамках этой проблемы. Несколько вопросов о добавлении API для установки заголовков запросов были отмечены как дубликаты: first , second , third .

Здесь это несколько возможностей, которые я могу предложить:

  1. Использовать другой драйвер / библиотеку вместо selenium
  2. Записать плагин, специфичный для браузера (или найти существующий), который позволяет вы добавляете заголовок для запроса.
  3. Используйте browserermob-proxy или какой-либо другой прокси.

Я бы выбрал вариант 3 в большинстве случаев. Это не сложно.

Обратите внимание, что у Ghostdriver есть API для него , но он не поддерживается другими драйверами.

28
ответ дан Nek 22 August 2018 в 12:57
поделиться
  • 1
    Я использую poltergeist для установки Referer, который выполняет цель для тестирования. Я хотел также использовать селен с головой, чтобы показать, что он работает для заинтересованных. – tamouse 28 March 2013 в 06:56
  • 2
    «Я бы пошел с [browserermob-proxy], это не сложно. & quot; - Это выглядит довольно загадочно для меня! Это также, с моей точки зрения, похоже на действительно большой инструмент для действительно небольшой проблемы. – chadoh 30 April 2014 в 18:57
  • 3
    Если вы создаете или используете специальный плагин для добавления заголовков запросов, вы можете автоматизировать тестирование плагина, как указано здесь - blazemeter.com/blog/… . Таким образом, вы можете автоматизировать настройку плагина с заголовками до начала тестового кода. Однако этот подход не кажется легким. – testerjoe2 7 April 2017 в 23:16
  • 4
    Это: Webdriver не содержит API для этого. – maaw 9 May 2017 в 17:18

У меня была такая же проблема. Я решил загрузить загружаемый файл firefox add-on и обновить его с помощью selenium.

Код в 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)
7
ответ дан Fernando Marengo 22 August 2018 в 12:57
поделиться

Был тот же самый вопрос сегодня, за исключением того, что мне нужно было установить другой референт на тест. Я закончил использование промежуточного программного обеспечения и класса, чтобы передать ему заголовки. Думаю, что я поделюсь (или, может быть, есть более чистое решение?):

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, но он должен быть прозрачным, поскольку вставка заголовка выполняется до того, как запрос действительно попадет в приложение.

4
ответ дан HargrimmTheBleak 22 August 2018 в 12:57
поделиться

Если вы используете 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
ответ дан John P 22 August 2018 в 12:57
поделиться

Вы можете сделать это с помощью PhantomJSDriver.

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

Используя объект запроса, вы также можете фильтровать так, чтобы заголовок не был установлен для каждого запроса.

0
ответ дан stijn van crombrugge 22 August 2018 в 12:57
поделиться

Для тех, кто использует Python, вы можете использовать Selenium Wire , который может устанавливать заголовки запросов, а также предоставлять вам возможность проверять запросы и ответы.

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
0
ответ дан Will Keeling 22 August 2018 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: