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

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

Python mock: добавление метода реального класса к mock объекту

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

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

Так вот, в python есть прекрасная библиотека, которая называется mock. Все было бы хорошо, но к сожалению, у нее нет встроенных средств добавления метода реального класса к уже созданному mock экземпляру класса. Зачем это нужно? (Возможно спросите вы)

Например, вы разрабатываете класс и какой-то метод для него. Вам необходимо протестировать только этот метод класса не вызывая остальных. Как это можно сделать? Вот примерно где-то так:

from mock import Mock
import new

class RealClass(object):
	def other_method(self):
		self.attribute_initiated_earlier = "class value"
	
	def real_method(self):
		return [self.attribute_initiated_earlier, 'password']

fake_object = Mock(spec=RealClass())
class_method = object.__getattribute__(RealClass, 'real_method')
fake_object.real_method = new.instancemethod(class_method, fake_object, Mock)
fake_object.attribute_initiated_earlier = "new value"
print fake_object.real_method()

Растим начинающих и опытных автоматизаторов

Written by Михаил Поляруш on . Posted in Автоматизация, Работаю, Размышляю, Тренинги

Сегодня закончил двухдневный тренинг по основам автоматизации тестирования. Собралась группа из 15 участников! Всегда на таких тренингах меня удивляет, что приходят люди, которые уже автоматизируют и уже многое знают об автоматизации. Но мне  приятно, что они все-таки приходят, так как я люблю общаться и делиться знаниями и опытом со всеми желающими. Главное, чтобы было желание учиться. Хотя потом зачастую оказывается,  что даже опытные люди выносят много новых идей, и в это раз было именно так.

Посетив несколько аналогичных тренингов, должен констатировать факт: тренинг по основам автоматизации ПО – это первый реально полезный тренинг для начинающих специалистов в автоматизации, который дает мощную базу для того, чтобы понимать вектор развития. Самый главный вопрос, на который отвечает тренинг, –  с чего начать и что делать дальше?

Я люблю практичные курсы и тренинги. Поэтому “практика” проходит через все мои тренинги. Но это основы и перед всяким программированием и созданием фреймворков необходимо определиться, с чего начать, что нужно делать, а чего делать не нужно. Тренинг ориентирован дать базу людям, которые еще не сталкивались с автоматизацией или только недавно начали что-то автоматизировать. Не умеете автоматизировать? Не знаете с чего начать? Вам сюда :)

Группа действительно получилась активная и живая. Если меня уже начали спрашивать “а когда будет этот же тренинг в следующий раз”, значит все прошло более чем удачно. Почитав отзывы, я  сделал некоторые выводы и немного изменю тренинг. Добавлю живое программирование прямо в классе – такая себе изюминка. Я думаю, это будет то, что нужно. Посмотреть, как проходит процесс с самого начала. Спасибо всем за отзывы, мне было очень приятно видеть отдачу от Вас. Это меня вдохновляет работать в том же темпе и направлении!

В феврале я буду проводить неделю автоматизации, и в рамках конференции  Test Automation Days проведу еще раз тренинг по основам автоматизации. Тренинг по основам автоматизации – это самый верный и правильный шаг перед тем, как начинать автоматизацию. 

Кстати early birds 600 грн. на Test Automation Days заканчиваются 04.11.2012.

В общем, жду Вас на следующем тренинге по основам автоматизации. Будет еще интересней  и еще больше практики!

Удачной вам автоматизации.

Парсинг неправильного html c помощью стандартных библиотек Python

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

Если вам приходилось работать c html и xml, то вы определенно знаете, что есть хороший и плохой html код. Что означает плохой html код? Теги могут быть незакрытые или может быть несколько рутовых элементов и т.д. Для xml эти правила обязательны, а вот для html они опциональны. Поэтому если Вы захотите распарсить такой html c помощью xml библиотеки, то вы получите разного рода ошибки, что ваш html не подходит под xml валидацию. Что делать? Я рекомендую использовать BeautifulSoup. Но если вы не можете добавить внешнюю библиотеку, что делать? Надо использовать, то что есть. Вот вы можете посмотреть пример кода, как получить текст элемента title для вашего html. В примере используете HTMLParser класс

from HTMLParser import HTMLParser 

class MyParser(HTMLParser): 
	def __init__(self, data): 
		self.title, self.is_title= None, None
		HTMLParser.__init__(self) 
		self.feed(data) 

	def handle_starttag(self, tag, attrs):
		if tag == 'title':
			self.is_title = 1 

	def handle_data(self, data): 
		if self.is_title: 
			self.title = data 
			self.is_title = 0 

if __name__ == "__main__": 

	m = MyParser(r"""
		<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
		<html><head>
		<title>404 Not Found</title>
		</head><body>
		<h1>Not Found</h1>
		<p>The requested URL was not found.</p>
		<hr>
		<address>Apache/2.2.14</address>
		</body></html>""")
	print m.title

Почему жаркое лето перешло и жаркую зиму? Конференция, тренинги …

Written by Михаил Поляруш on . Posted in iSpeaker Club, Автоматизация, Работаю, Размышляю, Тренинги

Обычно лето бывает жарким, осень прохладной а зима холодной. А у меня получается наоборот, наверное, я еще живу по испанским биоритмам:) После действительно жаркого лета, тенденция сохранилась. И жара до сих пор! Только недавно организовал и провел онлайн-конференцию по автоматизации. Также начал второй курс обучения python для тестировщика. А что же дальше?

В феврале буду делать большую очную конференцию по автоматизации Test Automation Days. Это будет грандиозное событие, потому как это будет первая конференция по автоматизации на територии СНГ. Плюс к тому на конференцию уже насобиралось докладчиков в два потока, что не может меня не радовать!

Меня недавно спрашивали, а где узнать об автоматизации не веб-приложений (видимо все остальные сейчас автоматизируют только веб :) ). Отвечаю – на первой конференции по автоматизации. Какие будут доклады?

  • Философия и построение тестового фреймворка на основе BDD в PHP проектах,  Зозуленко Алексей
  • Автоматизация тестирования как сервис, Павел Сташевский
  • Тестирование производительности и функциональности бэкэнда клиент-серверных приложений, Владимир Примаков
  • Основные ошибки внедрения ATDD, BDD, CI, CD на проектах, Резчиков Алексей
  • Быстрое расширение Robot Framework под свои нужды, Михаил Поляруш
  • Новый подход к автоматизации регрессионного тестирования с использованием BDD на основе WebDriver, Бордюг Иван
  • Тестирование производительности веб-приложений в Visual Studio, Юлия Соловьева
  • Автоматическое генерирование тестов в SoapUI, Михаил Дырда

А также сейчас еще где-то 6 докладчиков на утверждении. Более того, на протяжении недели до конференции я буду проводить серию тренингов по автоматизации. Кто хотел сделать старт в области автоматизации тестирования,  - это будет самых хороший старт после нового года :) . Так что могу констатировать факт, февраль будет жарким :)

Кстати, для людей, который хотят потренировать свои навыки публичных выступлений тоже будет о чем подумать. Я считаю, что самое главное на конференции – это качество докладов. Поэтому, в рамках подготовки докладчиков конференции http://atdays.com, я проведу 2-3 встречи клуба публичных выступлений iSpeaker Club. Так что записывайтесь, чтобы не пропустить.

Меня очень просят побольше проводить онлайн выступлений. Так вот, кто все таки не может приехать или не хочет, регистрируйтесь на ближайший вебинар по автоматизации. Обещаю максимальную практическую направленность и программирование :) Ну вообщем, как всегда. Пока что не меняю своих принципов обучения.

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.