Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Alexander Vasilyev
Selenium+py.test
• Selenium overwiew
• Some Samples
• Actions
• Fixtures
• Travis CI
• Jenkins CI
Agenda
Parts of Selenium:
•Selenium Webdriver (Selenium 2)
•Selenium IDE
•Selenium Server
•Selenium-Grid
Selenium Overview
• Google Chrome
• Internet Explorer 6, 7, 8, 9, 10 - 32 and 64-bit where applicable
• Firefox: latest ESR, previous ESR, c...
Selenium Overview
• find_element_by_id
• find_element_by_name
• find_element_by_xpath
• find_element_by_link_text
• find_element_by_partial_...
def login_field(self):
return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Login')))
def password_field(self):
re...
Interact
def login(self, name, password):
self.login_field().send_keys(name)
self.password_field().send_keys(password)
sel...
Actions
actions = ActionChains(driver)
test_plan = wait.until(EC.presence_of_element_located((By.XPATH, ".//ul/li[1]")))
a...
Asserts
Asserts
•assertEqual(a, b)
•assertNotEqual(a, b)
•assertTrue(x)
•assertFalse(x)
error_message = self.wait.until(EC...
All together
import pageObjects.login_page
import unittest
from selenium import webdriver
from selenium.webdriver.common.k...
setUp&tearDown
def setUp(self):
self.driver = webdriver.Firefox()
self.wait = WebDriverWait(self.driver, 10)
def tearDown(...
py.test
http://pytest.org/
The pytest testing tool makes it easy to write small tests, yet scales to support complex funct...
py.test test discovery
pytest implements the following standard test discovery:
•collection starts from the initial comman...
py.test asserts
def test_set_comparison():
set1 = set("1308")
set2 = set("8035")
assert set1 == set2
py.test asserts
================================= FAILURES =================================
___________________________ t...
py.test asserts
Special comparisons are done for a number of cases:
•comparing long strings: a context diff is shown
•comp...
py.test fixtures
The purpose of test fixtures is to provide a fixed baseline upon which tests
can reliably and repeatedly ...
py.test fixtures discovery
The discovery of fixtures functions starts at test classes, then test modules,
then conftest.py...
py.test fixtures
@pytest.fixture
def driver():
_driver = webdriver.Firefox()
def driver_teardown():
_driver.quit()
request...
py.test fixtures
@pytest.yield_fixture
def driver():
_driver = webdriver.Firefox()
yield _driver
_driver.quit()
def test_s...
py.test parameterize
chrome_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY',
'browser...
py.test pytest-xdist
The pytest-xdist plugin extends py.test with some unique test execution modes:
•test run parallelizat...
py.test pytest-xdist
Localy : py.test -n5 test_ukrnet.py
Distribute: py.test -d --tx socket=192.168.1.102:8888 --rsyncdir ...
py.test CI-Travis
Travis CI is a hosted continuous integration service. It is integrated with GitHub.
Travis CI's build en...
py.test CI-Travis
language: python
python:
- "2.7"
before_install:
- "sh -e /etc/init.d/xvfb start"
- "export DISPLAY=:99....
py.test SauceLabs
https://docs.saucelabs.com/tutorials/python/
from selenium import webdriver
sauce_url = "http://YOUR_USE...
py.test CI-Jenkins
py.test --junitxml=path
py.test CI-Jenkins
Thank You!
Upcoming SlideShare
Loading in …5
×

Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks

6,428 views

Published on

March 31 2015

Published in: Engineering

Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks

  1. 1. Alexander Vasilyev Selenium+py.test
  2. 2. • Selenium overwiew • Some Samples • Actions • Fixtures • Travis CI • Jenkins CI Agenda
  3. 3. Parts of Selenium: •Selenium Webdriver (Selenium 2) •Selenium IDE •Selenium Server •Selenium-Grid Selenium Overview
  4. 4. • Google Chrome • Internet Explorer 6, 7, 8, 9, 10 - 32 and 64-bit where applicable • Firefox: latest ESR, previous ESR, current release, one previous release • Safari • Opera • HtmlUnit • phantomjs • Android (with Selendroid or appium) • iOS (with ios-driver or appium) Selenium Overview
  5. 5. Selenium Overview
  6. 6. • find_element_by_id • find_element_by_name • find_element_by_xpath • find_element_by_link_text • find_element_by_partial_link_text • find_element_by_tag_name • find_element_by_class_name • find_element_by_css_selector Find & Interact
  7. 7. def login_field(self): return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Login'))) def password_field(self): return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Password'))) def login_button(self): return self.wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']"))) def error_message(self): return self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='error-text']"))) def login_username(self): return self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "username"))) def logout_button(self): return self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "logout"))) Find
  8. 8. Interact def login(self, name, password): self.login_field().send_keys(name) self.password_field().send_keys(password) self.login_button().click()
  9. 9. Actions actions = ActionChains(driver) test_plan = wait.until(EC.presence_of_element_located((By.XPATH, ".//ul/li[1]"))) actions.move_to_element(test_plan) actions.click(test_plan) actions.perform()
  10. 10. Asserts Asserts •assertEqual(a, b) •assertNotEqual(a, b) •assertTrue(x) •assertFalse(x) error_message = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='error- text']"))) unittest.TestCase.assertEqual(error_message.is_displayed(), True, "Should return error- message")
  11. 11. All together import pageObjects.login_page import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys class TestClass(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.wait = WebDriverWait(self.driver, 10) def tearDown(self): self.driver.quit() pass def test_input_field(self): self.driver.get("http://www.ukr.net") login_page.login("name", "pasword") unittest.TestCase.assertEqual(login_page.error_message().is_displayed(), True, "Should return error- message") if __name__ == '__main__': unittest.main()
  12. 12. setUp&tearDown def setUp(self): self.driver = webdriver.Firefox() self.wait = WebDriverWait(self.driver, 10) def tearDown(self): self.driver.quit() pass
  13. 13. py.test http://pytest.org/ The pytest testing tool makes it easy to write small tests, yet scales to support complex functional testing. It provides •auto-discovery of test modules and functions, •detailed info on failing assert statements (no need to remember self.assert* names) •fixtures for managing small or parametrized long-lived test resources. •you can use pytest to run test suites based on unittest (or trial), nose •single-source compatibility from Python2.6 all the way up to Python3.4, PyPy-2.3 •many external plugins.
  14. 14. py.test test discovery pytest implements the following standard test discovery: •collection starts from the initial command line arguments which may be directories, filenames or test ids. •recurse into directories, unless they match norecursedirs •test_*.py or *_test.py files, imported by their test package name. •Test prefixed test classes (without an __init__ method) •test_ prefixed test functions or methods are test items
  15. 15. py.test asserts def test_set_comparison(): set1 = set("1308") set2 = set("8035") assert set1 == set2
  16. 16. py.test asserts ================================= FAILURES ================================= ___________________________ test_set_comparison ____________________________ def test_set_comparison(): set1 = set("1308") set2 = set("8035") > assert set1 == set2 E assert set(['0', '1', '3', '8']) == set(['0', '3', '5', '8']) E Extra items in the left set: E '1' E Extra items in the right set: E '5' E Use -v to get the full diff test_assert2.py:5: AssertionError ========================= 1 failed in 0.01 seconds =========================
  17. 17. py.test asserts Special comparisons are done for a number of cases: •comparing long strings: a context diff is shown •comparing long sequences: first failing indices •comparing dicts: different entries
  18. 18. py.test fixtures The purpose of test fixtures is to provide a fixed baseline upon which tests can reliably and repeatedly execute. pytest fixtures offer advantage over the classic xUnit style of setup/teardown functions: •fixtures have explicit names and are activated by declaring their use from test functions, modules, classes or whole projects. •fixtures are implemented in a modular manner, as each fixture name triggers a fixture function which can itself use other fixtures. •fixture management scales from simple unit to complex functional testing, allowing to parametrize fixtures and tests according to configuration and component options, or to re-use fixtures across class, module or whole test session scopes.
  19. 19. py.test fixtures discovery The discovery of fixtures functions starts at test classes, then test modules, then conftest.py files and finally built-in and third party plugins.
  20. 20. py.test fixtures @pytest.fixture def driver(): _driver = webdriver.Firefox() def driver_teardown(): _driver.quit() request.addfinalizer(driver_teardown) return _driver def test_server_connect(driver): driver.get("ukr.net") assert "UKR" in driver.title
  21. 21. py.test fixtures @pytest.yield_fixture def driver(): _driver = webdriver.Firefox() yield _driver _driver.quit() def test_server_connect(driver): driver.get("ukr.net") assert "UKR" in driver.title
  22. 22. py.test parameterize chrome_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY', 'browserName': 'chrome', 'version': '', 'javascriptEnabled': True}) firefox_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY', 'browserName': 'firefox', 'version': '', 'javascriptEnabled': True}) @pytest.mark.parametrize('driver', [chrome_driver, firefox_driver]) def test_login(driver): login_page = LoginPage(driver) driver.get("http://www.ukr.net") login_page.login(login, password) assert login_page.login_username().is_displayed() is True
  23. 23. py.test pytest-xdist The pytest-xdist plugin extends py.test with some unique test execution modes: •test run parallelization: if you have multiple CPUs or hosts you can use those for a combined test run. This allows to speed up development or to use special resources of remote machines. •--boxed: (not available on Windows) run each test in a boxed subprocess to survive SEGFAULTS or otherwise dying processes •--looponfail: run your tests repeatedly in a subprocess. After each run py.test waits until a file in your project changes and then re-runs the previously failing tests. This is repeated until all tests pass after which again a full run is performed. •Multi-Platform coverage: you can specify different Python interpreters or different platforms and run tests in parallel on all of them.
  24. 24. py.test pytest-xdist Localy : py.test -n5 test_ukrnet.py Distribute: py.test -d --tx socket=192.168.1.102:8888 --rsyncdir mypkg mypkg
  25. 25. py.test CI-Travis Travis CI is a hosted continuous integration service. It is integrated with GitHub. Travis CI's build environment provides different runtimes for different languages, for instance multiple versions of Python, Ruby, PHP, Node.js. It also comes preinstalled with a variety of data stores and common tools like message brokers.
  26. 26. py.test CI-Travis language: python python: - "2.7" before_install: - "sh -e /etc/init.d/xvfb start" - "export DISPLAY=:99.0" - "wget http://selenium-release.storage.googleapis.com/2.44/selenium-server-standalone-2.44.0.ja - "java -jar selenium-server-standalone-2.44.0.jar > /dev/null &" - "sleep 10" # command to install dependencies install: - "pip install -r requirements.txt" # command to run tests script: py.test
  27. 27. py.test SauceLabs https://docs.saucelabs.com/tutorials/python/ from selenium import webdriver sauce_url = "http://YOUR_USERNAME:YOUR_ACCESS_KEY@ondemand.saucelabs.com:80/wd/hub" desired_capabilities = { 'platform': "Mac OS X 10.9", 'browserName': "chrome", 'version': "31", } driver = webdriver.Remote(desired_capabilities=desired_capabilities, command_executor=sauce_url) driver.implicitly_wait(10)
  28. 28. py.test CI-Jenkins py.test --junitxml=path
  29. 29. py.test CI-Jenkins
  30. 30. Thank You!

×