Skip to content

Instantly share code, notes, and snippets.

@valyukov
Created May 14, 2013 14:45
Show Gist options
  • Save valyukov/5576481 to your computer and use it in GitHub Desktop.
Save valyukov/5576481 to your computer and use it in GitHub Desktop.
example test framework
# coding=utf-8
import unittest
import junitxml
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import sys
##
# Framework Part
##
def lazy_drivers(driver_classes=(webdriver.Firefox,)):
for driver in driver_classes:
def lazy_driver():
return driver()
yield lazy_driver
class RequireLoad(object):
def __call__(self, func):
def load_page(page, *params, **kwargs):
if not issubclass(page.__class__, self.__class__):
self.is_loaded()
elif not page.is_loaded():
page.load()
assert (page.is_loaded()), "Страница не загружена"
return func(page, *params, **kwargs)
return load_page
def is_loaded(self):
raise NotImplemented("PageObject не наследуется от элемента реализующего функции @require_load")
def load(self):
raise Exception("Страница не может быть загруженна на прямую")
require_load = RequireLoad()
class WebDriverTestCase(unittest.TestCase):
driver = None
def set_driver(self, lazy_driver):
self.driver = lazy_driver()
def tearDown(self):
self.driver.quit()
###
# PageObject part
##
class ResultPage(RequireLoad):
def __init__(self, driver):
self._driver = driver
def is_loaded(self):
try:
self._driver.find_element_by_class_name('responses')
return True
except NoSuchElementException:
return False
@require_load
def get_result_text(self, position):
return self._driver.find_element_by_id('serp_res_' + position).text
@property
@require_load
def title(self):
return self._driver.title
class MainPage(RequireLoad):
def __init__(self, url, driver):
self._driver = driver
self._url = url
def is_loaded(self):
try:
self._driver.find_element_by_id('q')
return True
except NoSuchElementException:
return False
def load(self):
self._driver.get(self._url)
@require_load
def search_for(self, request):
q = self._driver.find_element_by_id('q')
q.send_keys(request)
q.submit()
return ResultPage(self._driver)
class SimpleTest(WebDriverTestCase):
def test_result_page_load_for_lepa(self):
title = MainPage('http://go.mail.ru/', self.driver).search_for('leprosorium').title
self.assertIn(u"leprosorium", title, 'Неверный заголовок страницы')
self.assertIn(u"Поиск@Mail.Ru", title, 'Неверный заголовок страницы')
##
# Configuration and execution parts
##
if __name__ == '__main__':
result = junitxml.JUnitXmlResult(sys.stdout)
result.startTestRun()
for lazy_driver in lazy_drivers((webdriver.Firefox, webdriver.Firefox)):
suite = unittest.TestLoader().loadTestsFromTestCase(SimpleTest)
for test in suite:
test.set_driver(lazy_driver)
suite.run(result)
result.stopTestRun()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment