2013-12-22 3 views
2

Im работает с дистанционным драйвером selenium для автоматизации действий на сайте, я могу открыть страницу, в которой я нуждаюсь напрямую, создавая URL-адрес, поскольку схема URL-адресов сайтов очень постоянна. Это ускоряет сценарий, поскольку доза не должна работать через несколько страниц, прежде чем она попадает в тот, который ему нужен.Настройка референта в Selenium

Чтобы автоматизация казалась органичной, есть способ задать страницу реферала в Selenium?

ответ

2

То, что вы ищете, это referer spoofing.

Selenium не имеет встроенного метода для этого, однако его можно выполнить с помощью прокси-сервера, такого как fiddler. Fiddler также предоставляет версию только для API FiddlerCore component и программный доступ ко всем настройкам и данным прокси, что позволяет вам изменять заголовки ответа HTTP.

+0

Проблема с использованием прокси-сервера заключается в том, что он затрагивает * все * вкладки/окна, связанные с браузером. Вы вынуждены использовать отдельные экземпляры браузера, если вы используете параллельные тесты, требующие разных значений Referer. – Gili

2

Не уверен, правильно ли я понял ваш вопрос, но если вы хотите переопределить свои HTTP-запросы, нет никакого способа сделать это напрямую с помощью webdriver. Вы должны выполнить свой запрос через прокси. Я предпочитаю использовать browsermob, вы можете получить его через maven или подобное.

ProxyServer server = new ProxyServer(proxy_port); //net.lightbody.bmp.proxy.ProxyServer; 
server.start(); 
server.setCaptureHeaders(true); 
Proxy proxy = server.seleniumProxy(); //org.openqa.selenium.Proxy 
proxy.setHttpProxy("localhost").setSslProxy("localhost"); 

server.addRequestInterceptor(new RequestInterceptor() { 
    @Override 
    public void process(BrowserMobHttpRequest browserMobHttpRequest, Har har) { 
     browserMobHttpRequest.addRequestHeader("Referer", "blabla"); 
    } 
}); 

// configure it as a desired capability 
DesiredCapabilities capabilities = new DesiredCapabilities(); 
capabilities.setCapability(CapabilityType.PROXY, proxy); 
// start the driver 
driver = new FirefoxDriver(capabilities); 

Или черный/белый список что-нибудь:

server.blacklistRequests("https?://.*\\.google-analytics\\.com/.*", 410); 
server.whitelistRequests("https?://*.*.yoursite.com/.*. https://*.*.someOtherYourSite.*".split(","), 200); 
+0

Я пробовал этот код, есть ошибка в вашем коде, я думаю. proxy.setHttpProxy («localhost») должен быть исправлен как proxy.setHttpProxy («localhost:» + proxy_port). –

3

Вот решение в Python, чтобы сделать именно это:

https://github.com/j-bennet/selenium-referer

я описал случай использования и решения в ПРОЧТИ МЕНЯ. Я думаю, что github repo никуда не денется, но на всякий случай я приведу соответствующие статьи.

Решение использует libmproxy для реализации прокси-сервера, который делает только одно: добавляет заголовок Referer. Заголовок заголовка указывается как параметр командной строки при запуске прокси. Код:

# -*- coding: utf-8 -*- 
""" 
Proxy server to add a specified Referer: header to the request. 
""" 
from optparse import OptionParser 
from libmproxy import controller, proxy 
from libmproxy.proxy.server import ProxyServer 


class RefererMaster(controller.Master): 
    """ 
    Adds a specified referer header to the request. 
    """ 

    def __init__(self, server, referer): 
     """ 
     Init the proxy master. 
     :param server: ProxyServer 
     :param referer: string 
     """ 
     controller.Master.__init__(self, server) 
     self.referer = referer 

    def run(self): 
     """ 
     Basic run method. 
     """ 
     try: 
      print('Running...') 
      return controller.Master.run(self) 
     except KeyboardInterrupt: 
      self.shutdown() 

    def handle_request(self, flow): 
     """ 
     Adds a Referer header. 
     """ 
     flow.request.headers['referer'] = [self.referer] 
     flow.reply() 

    def handle_response(self, flow): 
     """ 
     Does not do anything extra. 
     """ 
     flow.reply() 


def start_proxy_server(port, referer): 
    """ 
    Start proxy server and return an instance. 
    :param port: int 
    :param referer: string 
    :return: RefererMaster 
    """ 
    config = proxy.ProxyConfig(port=port) 
    server = ProxyServer(config) 
    m = RefererMaster(server, referer) 
    m.run() 


if __name__ == '__main__': 

    parser = OptionParser() 

    parser.add_option("-r", "--referer", dest="referer", 
         help="Referer URL.") 

    parser.add_option("-p", "--port", dest="port", type="int", 
         help="Port number (int) to run the server on.") 

    popts, pargs = parser.parse_args() 

    start_proxy_server(popts.port, popts.referer) 

Затем в SETUP() метод испытания, прокси-сервер запускается как внешний процесс, используя pexpect, и остановился в Teardown(). Метод называется прокси) настройки возвращает прокси (для настройки драйвера Firefox с:

# -*- coding: utf-8 -*- 
import os 
import sys 
import pexpect 
import unittest 

from selenium.webdriver.common.proxy import Proxy, ProxyType 

import utils 


class ProxyBase(unittest.TestCase): 
    """ 
    We have to use our own proxy server to set a Referer header, because Selenium does not 
    allow to interfere with request headers. 

    This is the base class. Change `proxy_referer` to set different referers. 
    """ 

    base_url = 'http://www.facebook.com' 

    proxy_server = None 

    proxy_address = '127.0.0.1' 
    proxy_port = 8888 
    proxy_referer = None 
    proxy_command = '{0} {1} --referer {2} --port {3}' 

    def setUp(self): 
     """ 
     Create the environment. 
     """ 
     print('\nSetting up.') 
     self.start_proxy() 
     self.driver = utils.create_driver(proxy=self.proxy()) 

    def tearDown(self): 
     """ 
     Cleanup the environment. 
     """ 
     print('\nTearing down.') 
     utils.close_driver(self.driver) 
     self.stop_proxy() 

    def proxy(self): 
     """ 
     Create proxy settings for our Firefox profile. 
     :return: Proxy 
     """ 
     proxy_url = '{0}:{1}'.format(self.proxy_address, self.proxy_port) 

     p = Proxy({ 
      'proxyType': ProxyType.MANUAL, 
      'httpProxy': proxy_url, 
      'ftpProxy': proxy_url, 
      'sslProxy': proxy_url, 
      'noProxy': 'localhost, 127.0.0.1' 
     }) 

     return p 

    def start_proxy(self): 
     """ 
     Start the proxy process. 
     """ 
     if not self.proxy_referer: 
      raise Exception('Set the proxy_referer in child class!') 

     python_path = sys.executable 
     current_dir = os.path.dirname(__file__) 
     proxy_file = os.path.normpath(os.path.join(current_dir, 'referer_proxy.py')) 

     command = self.proxy_command.format(
      python_path, proxy_file, self.proxy_referer, self.proxy_port) 

     print('Running the proxy command:') 
     print(command) 

     self.proxy_server = pexpect.spawnu(command) 
     self.proxy_server.expect_exact(u'Running...', 2) 

    def stop_proxy(self): 
     """ 
     Override in child class to use a proxy. 
     """ 
     print('Stopping proxy server...') 
     self.proxy_server.close(True) 
     print('Proxy server stopped.') 

Я хотел, чтобы мои юнит-тесты, чтобы начать и остановить прокси-сервер без какого-либо взаимодействия с пользователем, и не смог найти образцы Python делать это. Вот почему я создал github repo (ссылка выше).

Надеюсь, это поможет кому-то.

2

Если вы проверяете реферер на сервере, то использование прокси (как упоминалось в других ответах) будет способом.

Однако, если вам нужен доступ к рефереру в Javascript с использованием прокси-сервера, это не сработает.Для того, чтобы установить реферера Javascript я сделал следующее:

  1. Перейти на сайт направления
  2. Внедрить эту JavaScript на страницу с помощью Selenium API: document.write('<script>window.location.href = "<my website>";</script>')"

Я использую Python обертку вокруг селена , поэтому я не могу предоставить функцию, необходимую для ввода кода на вашем языке, но его должно быть легко найти.

Смежные вопросы