SlideShare a Scribd company logo
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, current release, one previous
release
• Safari
• Opera
• HtmlUnit
• phantomjs
• Android (with Selendroid or appium)
• iOS (with ios-driver or appium)
Selenium Overview
Selenium Overview
• 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
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
Interact
def login(self, name, password):
self.login_field().send_keys(name)
self.password_field().send_keys(password)
self.login_button().click()
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()
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")
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()
setUp&tearDown
def setUp(self):
self.driver = webdriver.Firefox()
self.wait = WebDriverWait(self.driver, 10)
def tearDown(self):
self.driver.quit()
pass
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.
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
py.test asserts
def test_set_comparison():
set1 = set("1308")
set2 = set("8035")
assert set1 == set2
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 =========================
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
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.
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.
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
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
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
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.
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
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.
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
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)
py.test CI-Jenkins
py.test --junitxml=path
py.test CI-Jenkins
Thank You!

More Related Content

PPTX
Mozilla Web QA - Evolution of our Python WebDriver framework
PDF
Py.test
PDF
Python testing using mock and pytest
ODP
Testes pythonicos com pytest
PDF
Effective testing with pytest
PDF
Pytest: escreva menos, teste mais
PDF
Testing Django Applications
PDF
Pytest - testing tips and useful plugins
Mozilla Web QA - Evolution of our Python WebDriver framework
Py.test
Python testing using mock and pytest
Testes pythonicos com pytest
Effective testing with pytest
Pytest: escreva menos, teste mais
Testing Django Applications
Pytest - testing tips and useful plugins

What's hot (20)

PDF
Test Driven Development With Python
ODT
Testing in-python-and-pytest-framework
PDF
Token Testing Slides
PDF
Python Unit Test
PDF
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
PDF
Keep your repo clean
PPTX
Unit testing in JavaScript with Jasmine and Karma
PDF
Modern Python Testing
KEY
Testing My Patience
PDF
Python unittest
PDF
Unit Testing JavaScript Applications
PDF
Testing in Django
PDF
Unit testing PHP apps with PHPUnit
PDF
Python-nose: A unittest-based testing framework for Python that makes writing...
PPTX
Automation patterns on practice
PDF
Painless JavaScript Testing with Jest
KEY
DjangoCon US 2011 - Monkeying around at New Relic
PDF
AngularJS Unit Testing w/Karma and Jasmine
PDF
Angular testing
PDF
Intro to testing Javascript with jasmine
Test Driven Development With Python
Testing in-python-and-pytest-framework
Token Testing Slides
Python Unit Test
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
Keep your repo clean
Unit testing in JavaScript with Jasmine and Karma
Modern Python Testing
Testing My Patience
Python unittest
Unit Testing JavaScript Applications
Testing in Django
Unit testing PHP apps with PHPUnit
Python-nose: A unittest-based testing framework for Python that makes writing...
Automation patterns on practice
Painless JavaScript Testing with Jest
DjangoCon US 2011 - Monkeying around at New Relic
AngularJS Unit Testing w/Karma and Jasmine
Angular testing
Intro to testing Javascript with jasmine
Ad

Similar to Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks (20)

PDF
Тестирование и Django
PDF
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
PPTX
Browser testing with nightwatch.js
PDF
JUnit5 and TestContainers
PDF
How to fake_properly
ODP
Good Practices On Test Automation
PPTX
Junit_.pptx
ODP
Grails unit testing
PDF
Data driven testing using Integrant & Spec
PPTX
Building frameworks over Selenium
DOC
Selenium Webdriver with data driven framework
KEY
Django’s nasal passage
PPT
Testing And Drupal
PPTX
PPTX
Testing ASP.NET - Progressive.NET
PDF
Web UI test automation instruments
PPTX
Testing basics for developers
KEY
Django Pro ORM
PPTX
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
PPT
Unit testing with Spock Framework
Тестирование и Django
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Browser testing with nightwatch.js
JUnit5 and TestContainers
How to fake_properly
Good Practices On Test Automation
Junit_.pptx
Grails unit testing
Data driven testing using Integrant & Spec
Building frameworks over Selenium
Selenium Webdriver with data driven framework
Django’s nasal passage
Testing And Drupal
Testing ASP.NET - Progressive.NET
Web UI test automation instruments
Testing basics for developers
Django Pro ORM
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
Unit testing with Spock Framework
Ad

More from Lohika_Odessa_TechTalks (20)

PPTX
OAuth2 Authorization Server Under the Hood
PPTX
Debugging Microservices - key challenges and techniques - Microservices Odesa...
PPTX
Design and Evolution of APIs in Microservice Architecture
PPTX
Micro-frontends – is it a new normal?
PPTX
Multithreading in go
PPTX
Druid - Interactive Analytics At Scale
PDF
DevOps Odessa #TechTalks 21.01.2020
PPTX
Jenkins' shared libraries in action
PPTX
Prometheus: infrastructure and application monitoring in kubernetes cluster
PPT
Architectural peripherals of react by Vadym Zhiltsov
PPTX
React native by example by Vadim Ruban
PPTX
Aws lambda by Leonid Amigud
PPT
Congratulations, you have been promoted to a manager role. You`ve got new pro...
PPT
"Don't touch me and give me my money" or how motivate people who can but don...
PPTX
Docker based Architecture by Denys Serdiuk
PPTX
SparkSpark in the Big Data dark by Sergey Levandovskiy
PPT
Burnout and how to avoid it in your team. Responsible person's issue by Andre...
PPTX
Performance evaluation process as a way to empower your employees and help th...
PPT
" Performance testing for Automation QA - why and how " by Andrey Kovalenko f...
PPT
"WEB applications security testing" by Kirill Semenov for Lohika Odessa QA Te...
OAuth2 Authorization Server Under the Hood
Debugging Microservices - key challenges and techniques - Microservices Odesa...
Design and Evolution of APIs in Microservice Architecture
Micro-frontends – is it a new normal?
Multithreading in go
Druid - Interactive Analytics At Scale
DevOps Odessa #TechTalks 21.01.2020
Jenkins' shared libraries in action
Prometheus: infrastructure and application monitoring in kubernetes cluster
Architectural peripherals of react by Vadym Zhiltsov
React native by example by Vadim Ruban
Aws lambda by Leonid Amigud
Congratulations, you have been promoted to a manager role. You`ve got new pro...
"Don't touch me and give me my money" or how motivate people who can but don...
Docker based Architecture by Denys Serdiuk
SparkSpark in the Big Data dark by Sergey Levandovskiy
Burnout and how to avoid it in your team. Responsible person's issue by Andre...
Performance evaluation process as a way to empower your employees and help th...
" Performance testing for Automation QA - why and how " by Andrey Kovalenko f...
"WEB applications security testing" by Kirill Semenov for Lohika Odessa QA Te...

Recently uploaded (20)

PPTX
Geodesy 1.pptx...............................................
PPTX
Lecture Notes Electrical Wiring System Components
PDF
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PPTX
UNIT-1 - COAL BASED THERMAL POWER PLANTS
PPT
Project quality management in manufacturing
PDF
Embodied AI: Ushering in the Next Era of Intelligent Systems
PDF
PPT on Performance Review to get promotions
PPTX
MET 305 2019 SCHEME MODULE 2 COMPLETE.pptx
PPTX
additive manufacturing of ss316l using mig welding
PDF
Evaluating the Democratization of the Turkish Armed Forces from a Normative P...
PDF
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
PPTX
web development for engineering and engineering
PDF
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
DOCX
573137875-Attendance-Management-System-original
PPTX
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
PPTX
KTU 2019 -S7-MCN 401 MODULE 2-VINAY.pptx
PDF
Well-logging-methods_new................
PPTX
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
PDF
Digital Logic Computer Design lecture notes
Geodesy 1.pptx...............................................
Lecture Notes Electrical Wiring System Components
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
UNIT-1 - COAL BASED THERMAL POWER PLANTS
Project quality management in manufacturing
Embodied AI: Ushering in the Next Era of Intelligent Systems
PPT on Performance Review to get promotions
MET 305 2019 SCHEME MODULE 2 COMPLETE.pptx
additive manufacturing of ss316l using mig welding
Evaluating the Democratization of the Turkish Armed Forces from a Normative P...
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
web development for engineering and engineering
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
573137875-Attendance-Management-System-original
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
KTU 2019 -S7-MCN 401 MODULE 2-VINAY.pptx
Well-logging-methods_new................
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
Digital Logic Computer Design lecture notes

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

  • 2. • Selenium overwiew • Some Samples • Actions • Fixtures • Travis CI • Jenkins CI Agenda
  • 3. Parts of Selenium: •Selenium Webdriver (Selenium 2) •Selenium IDE •Selenium Server •Selenium-Grid Selenium Overview
  • 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
  • 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. 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. Interact def login(self, name, password): self.login_field().send_keys(name) self.password_field().send_keys(password) self.login_button().click()
  • 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. 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. 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. setUp&tearDown def setUp(self): self.driver = webdriver.Firefox() self.wait = WebDriverWait(self.driver, 10) def tearDown(self): self.driver.quit() pass
  • 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. 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. py.test asserts def test_set_comparison(): set1 = set("1308") set2 = set("8035") assert set1 == set2
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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)