Python for testers

ChromeDriver + Python + Browsermob proxy

Written by Михаил Поляруш on . Posted in Автоматизация, Разработка

Для бывалых автоматизаторов веб-приложений известно, как важно иметь под руками прокси сервер, с помощью которого можно решить целый ряд вопросов и проблем с веб-автоматизации. NTLM авторизация, блокирование сторонних сайтов не относящихся к тестированию вашего веб-приложения и т.д. В разных случаях работу с прокси решают по разному, какое-то время назад был придуман хороший проект под названием Browsermob-proxy, который очень помогает при автоматизации.

David Burns написал клиент на python для использования прокси с помощью python и даже приложил пример его использования для FirefoxDriver.

from browsermobproxy import Server
server = Server("path/to/browsermob-proxy")
server.start()
proxy = server.create_proxy()

from selenium import webdriver
profile  = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har("google")
driver.get("http://www.google.co.uk")
proxy.har # returns a HAR JSON blob

server.stop()
driver.quit()

Но вот для ChromeDriver примера нет, даже если хорошо погуглить. И люди, которые хотят использовать ChromeDriver, не знают, как заставить цепочку ChromeDriver + Python + Browsermob proxy работать. Потому, что не знают, как правильно подключать прокси к ChromeDriver.

Заполняю этот пробел c соответствующим примером кода:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException, 
ElementNotVisibleException
from browsermobproxy import Server
import urlparse

server = Server(r"c:\browsermob\bin\browsermob-proxy.bat")
server.start()
proxy = server.create_proxy()
proxy.new_har()

chrome_options = webdriver.ChromeOptions()
url = urlparse.urlparse(proxy.proxy).path
chrome_options.add_argument('--proxy-server=%s' % url)
driver = webdriver.Chrome(
	executable_path=r"c:\chromedriver.exe", 
	chrome_options=chrome_options)
driver.get("http://google.com.ua/")
driver.find_element_by_id("gbqfsb").click()

print proxy.har

driver.quit()
server.stop()

Детальных шагов не расписывал. Будут вопросы, пишите!

Tags: , ,

Trackback from your site.

  • Александр Петрович

    Валится python пример…

    Traceback (most recent call last):
    File “test_request_tracking.py”, line 48, in
    print proxy.har
    AttributeError: ‘str’ object has no attribute ‘har’

    up: proxy1 = urlparse.urlparse(proxy.proxy).netloc
    chrome_options.add_argument(‘–proxy-server=%s’ % proxy1)

    переменные неверно заданы были

  • polusok

    да, я в конце подправлял код на ходу и определил такую же переменную, в общем у тебя заработало?

  • Александр Петрович

    Ага. Спасибо тебе огромное

  • http://poliarush.com/ Mykhailo Poliarush

    Не за что! Пользуйся на здоровье!

  • 123

    Должно быть так:
    url = urlparse.urlparse(proxy.selenium_proxy().http_proxy).netloc
    вместо
    url = urlparse.urlparse(proxy.proxy).netloc

  • http://poliarush.com/ Mykhailo Poliarush

    Почему Вы считаете, что это строчка должна выглядеть именно так?

  • http://poliarush.com/ Mykhailo Poliarush

    selenium_proxy метод всего лишь создает webdriver.Proxy объект, куда передается proxy.proxy. В свою очередь proxy.selenium_proxy().http_proxy возвращает все тоже значение, что и в proxy.proxy. Просто для Chrome не нужно webdriver.Proxy объекта, а только url в виде строки.

  • 123

    Вы правы – результат будет один и тот же. Ваш код коректен. мой недосмотр.

  • Alexander

    Странно, спустя время пробую тот же самый код, print proxy.har мне выдаёт вот что:

    {u’log’: {u’version’: u’1.2′, u’creator’: {u’version’: u’2.0′, u’name’: u’BrowserMob Proxy’}, u’pages’: [{u'pageTimings': {}, u'title': u'', u'id': u'google', u'startedDateTime': u'2013-06-17T14:55:35.336+0000'}], u’entries’: []}}

  • Алекасндр

    Попробовал тот же код ругается на строчку server.start()

    поставил брейк вылетает в файл pydev_monkey.py в функцию

    def new_CreateProcess(appName, commandLine, *args):

    try:
    import _subprocess
    except ImportError:
    import _winapi as _subprocess
    return getattr(_subprocess, original_name)(appName, patch_arg_str_win(commandLine), *args)
    return new_CreateProcess

    не могу понять в чем косяк может поможете?

  • http://poliarush.com/ Mykhailo Poliarush

    ну тут нужно смотреть на детали, опишите более подробно на http://automated-testing.info/t/wd-python-get/1905 и там будет разбираться

  • Slach

    на текущий момент set_proxy стоит как deprecated
    я использую вот такой код

    from browsermobproxy import Server
    from pyvirtualdisplay import Display
    from selenium import webdriver

    browsermob = Server(“D:\Portable\BrowserMob\bin\browsermob-proxy.bat”)
    browsermob.start()
    proxy =self.browsermob.create_proxy()

    display = Display(visible=1, size=(1280, 1024))
    display.start()

    сapabilities = webdriver.DesiredCapabilities.CHROME
    proxy.add_to_webdriver_capabilities(capabilities)
    driver = webdriver.Chrome(desired_capabilities=capabilities, executable_path=’D:PortableSelenium2chromedriver.exe’)

  • http://poliarush.com/ Mykhailo Poliarush

    Спасибо за пример

  • anatolike

    server = Server(“/opt/browsermob-proxy/bin/browsermob-proxy”)
    server.start()

    proxy = server.create_proxy()

    Выдает ошибку :
    ValueError: No JSON object could be decoded

  • http://poliarush.com/ Mykhailo Poliarush

    Ну статья опубликовано довольно давно. Укажи версии библиотек которые вы используете?

  • Unnati Shukla

    With the Chrome, browser keeps refreshing the page and gives below error trace:

    Traceback (most recent call last):

    File “C:/Users/Unnati_Shukla/Documents/trial.py”, line 19, in

    driver.get(“https://falcon.crowdstrike.com/”)

    File “C:Python27libsite-packagesseleniumwebdriverremotewebdriver.py”, line 185, in get

    self.execute(Command.GET, {‘url’: url})

    File “C:Python27libsite-packagesseleniumwebdriverremotewebdriver.py”, line 173, in execute

    self.error_handler.check_response(response)

    File “C:Python27libsite-packagesseleniumwebdriverremoteerrorhandler.py”, line 164, in check_response

    raise exception_class(message, screen, stacktrace)

    TimeoutException: Message: u’timeout: Timed out receiving message from renderer: 3.866n (Session info: chrome=38.0.2125.101)n (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 SP1 x86_64)’

    this is specific to this site only which I am referring. With other urls like “https://www.google.com” it works fine.

    Please help ASAP!

  • http://poliarush.com/ Mykhailo Poliarush

    Please provide full source code thru https://gist.github.com/

  • Unnati Shukla

    Hi, Thanks for replying. I have updated the Source at https://gist.github.com/anonymous/0e848c11165829d5ff48

    For info :

    I am using Selenium 2 + browsermob-proxy-2.0-beta-6 + Chrome

Twitter лента

autotestinfo

Как продолжить тест при случайном появлении попапа? http://t.co/tGqX8PjPzD

mpoliarush

http://t.co/9879JVgl21 automates tests written with QUnit, Jasmine, Mocha with Expect.js assertions, Dojo Objective Harness, or YUI Test.

Меня комментируют

Igor Vlasuyk

|

“Продолжительность 16 часов (2 дня)”
Это то есть 2 рабочих дня надо полностью быть на тренинге?
И на каком языке программирования будет практика?

Nataliia Koval

|

Большое спасибо! С расписанием вроде разобралась.

Chmel Viktor

|

Доброго дня

Nataliia Koval

|

Подскажите пожалуйста, после регистрации на сайте pearsonvue.com, как оплатить и выбрать дату и место сдачи? Там есть адреса центров сдачи экзамена. Звонить в эти центры?

Mykhailo Poliarush

|

так и есть, ошибочка, уже поправил

Что вас интересует на этом сайте?

View Results

Loading ... Loading ...