├── README.md ├── parallel ├── README.md ├── nose │ ├── test_nose.py │ └── test_nose2.py └── multithreaded │ └── parallel.py ├── .gitignore ├── basic.py ├── drag-and-drop.py ├── login-form.py └── todo-app.py /README.md: -------------------------------------------------------------------------------- 1 | ## selenium-python 2 | 3 | Selenium script examples in Python for CrossBrowserTesting.com 4 | 5 | 6 | -------------------------------------------------------------------------------- /parallel/README.md: -------------------------------------------------------------------------------- 1 | ## selenium-parallel-python 2 | ### Runs selenium scripts in parallel on Crossbrowsertesting.com 3 | #### Written in Python 4 | 5 | Its done 2 different ways: 6 | 7 | 1. Multithreaded 8 |
9 | python multithreaded/parallel.py
10 |
11 | 2. Nose
12 |
13 | nosetests --processes=\ --where=nose
14 |
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 |
5 | # C extensions
6 | *.so
7 |
8 | # Distribution / packaging
9 | .Python
10 | env/
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | *.egg-info/
23 | .installed.cfg
24 | *.egg
25 |
26 | # PyInstaller
27 | # Usually these files are written by a python script from a template
28 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
29 | *.manifest
30 | *.spec
31 |
32 | # Installer logs
33 | pip-log.txt
34 | pip-delete-this-directory.txt
35 |
36 | # Unit test / coverage reports
37 | htmlcov/
38 | .tox/
39 | .coverage
40 | .coverage.*
41 | .cache
42 | nosetests.xml
43 | coverage.xml
44 | *,cover
45 |
46 | # Translations
47 | *.mo
48 | *.pot
49 |
50 | # Django stuff:
51 | *.log
52 |
53 | # Sphinx documentation
54 | docs/_build/
55 |
56 | # PyBuilder
57 | target/
58 |
59 | # Mac Files
60 | .DS_Store
61 |
62 |
--------------------------------------------------------------------------------
/parallel/nose/test_nose.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import unittest
4 | from selenium import webdriver
5 |
6 | USERNAME = "mikeh"
7 | API_KEY = ""
8 |
9 |
10 | class SeleniumCBT(unittest.TestCase):
11 | def setUp(self):
12 | caps = {}
13 |
14 | caps['name'] = 'Python Nose Parallel'
15 | caps['build'] = '1.0'
16 | caps['browser_api_name'] = 'Chrome43x64'
17 | caps['os_api_name'] = 'Win8.1'
18 | caps['screen_resolution'] = '1024x768'
19 |
20 | # start the remote browser on our server
21 | self.driver = webdriver.Remote(
22 | desired_capabilities=caps,
23 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub" % (USERNAME, API_KEY)
24 | )
25 |
26 | self.driver.implicitly_wait(20)
27 |
28 | def test_CBT(self):
29 |
30 | # load the page url
31 | print('Loading Url')
32 | self.driver.get('http://crossbrowsertesting.github.io/selenium_example_page.html')
33 |
34 | # check the title
35 | print('Checking title')
36 | self.assertTrue("Selenium Test Example Page" in self.driver.title)
37 |
38 | def tearDown(self):
39 | print("Done with session %s" % self.driver.session_id)
40 | self.driver.quit()
41 |
42 | if __name__ == '__main__':
43 | unittest.main()
44 |
--------------------------------------------------------------------------------
/parallel/nose/test_nose2.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import unittest
4 | from selenium import webdriver
5 |
6 | USERNAME = "mikeh"
7 | API_KEY = ""
8 |
9 |
10 | class SeleniumCBT(unittest.TestCase):
11 | def setUp(self):
12 | caps = {}
13 |
14 | caps['name'] = 'Python Nose Parallel'
15 | caps['build'] = '1.0'
16 | caps['browser_api_name'] = 'IE10'
17 | caps['os_api_name'] = 'Win7x64-C2'
18 | caps['screen_resolution'] = '1024x768'
19 |
20 | # start the remote browser on our server
21 | self.driver = webdriver.Remote(
22 | desired_capabilities=caps,
23 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub" % (USERNAME, API_KEY)
24 | )
25 |
26 | self.driver.implicitly_wait(20)
27 |
28 | def test_CBT(self):
29 |
30 | # load the page url
31 | print('Loading Url')
32 | self.driver.get('http://crossbrowsertesting.github.io/selenium_example_page.html')
33 |
34 | # check the title
35 | print('Checking title')
36 | self.assertTrue("Selenium Test Example Page" in self.driver.title)
37 |
38 | def tearDown(self):
39 | print("Done with session %s" % self.driver.session_id)
40 | self.driver.quit()
41 |
42 | if __name__ == '__main__':
43 | unittest.main()
44 |
--------------------------------------------------------------------------------
/parallel/multithreaded/parallel.py:
--------------------------------------------------------------------------------
1 | from threading import Thread
2 | from selenium import webdriver
3 | import time
4 |
5 | USERNAME = "USERNAME"
6 | API_KEY = "API_KEY"
7 |
8 |
9 | def get_browser(caps):
10 | return webdriver.Remote(
11 | desired_capabilities=caps,
12 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub" % (USERNAME, API_KEY)
13 | )
14 |
15 | browsers = [
16 | {"platform": "Windows 7 64-bit", "browserName": "Internet Explorer","version": "10", "name": "Python Parallel"},
17 | {"platform": "Windows 8.1", "browserName": "Chrome", "version": "50", "name": "Python Parallel"},
18 | ]
19 | browsers_waiting = []
20 |
21 |
22 | def get_browser_and_wait(browser_data):
23 | print ("starting %s\n" % browser_data["browserName"])
24 | browser = get_browser(browser_data)
25 | browser.get("http://crossbrowsertesting.com")
26 | browsers_waiting.append({"data": browser_data, "driver": browser})
27 | print ("%s ready" % browser_data["browserName"])
28 | while len(browsers_waiting) < len(browsers):
29 | print ("working on %s.... please wait" % browser_data["browserName"])
30 | browser.get("http://crossbrowsertesting.com")
31 | time.sleep(3)
32 |
33 | threads = []
34 | for i, browser in enumerate(browsers):
35 | thread = Thread(target=get_browser_and_wait, args=[browser])
36 | threads.append(thread)
37 | thread.start()
38 |
39 |
40 | for thread in threads:
41 | thread.join()
42 |
43 | print ("all browsers ready")
44 | for i, b in enumerate(browsers_waiting):
45 | print ("browser %s's title: %s" % (b["data"]["name"], b["driver"].title))
46 | b["driver"].quit()
47 |
--------------------------------------------------------------------------------
/basic.py:
--------------------------------------------------------------------------------
1 | # Please visit http://selenium-python.readthedocs.org/en/latest/index.html for detailed installation and instructions
2 | # Getting started: http://docs.seleniumhq.org/docs/03_webdriver.jsp
3 | # API details: https://github.com/SeleniumHQ/selenium#selenium
4 |
5 | # Requests is the easiest way to make RESTful API calls in Python. You can install it by following the instructions here:
6 | # http://docs.python-requests.org/en/master/user/install/
7 |
8 | import unittest
9 | from selenium import webdriver
10 | import requests
11 |
12 | class BasicTest(unittest.TestCase):
13 | def setUp(self):
14 |
15 | # Put your username and authey below
16 | # You can find your authkey at crossbrowsertesting.com/account
17 | self.username = "user@email.com"
18 | self.authkey = "12345"
19 |
20 | self.api_session = requests.Session()
21 | self.api_session.auth = (self.username,self.authkey)
22 |
23 | self.test_result = None
24 |
25 | caps = {}
26 |
27 | caps['name'] = 'Basic Example'
28 | caps['build'] = '1.0'
29 | caps['browserName'] = 'Safari'
30 | caps['version'] = '8'
31 | caps['platform'] = 'Mac OSX 10.10'
32 | caps['screenResolution'] = '1366x768'
33 | caps['record_video'] = 'true'
34 | caps['record_network'] = 'false'
35 |
36 | # start the remote browser on our server
37 | self.driver = webdriver.Remote(
38 | desired_capabilities=caps,
39 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub"%(self.username,self.authkey)
40 | )
41 |
42 | self.driver.implicitly_wait(20)
43 |
44 | def test_CBT(self):
45 | # We wrap this all in a try/except so we can set pass/fail at the end
46 | try:
47 | # load the page url
48 | print('Loading Url')
49 | self.driver.get('http://crossbrowsertesting.github.io/selenium_example_page.html')
50 |
51 | # maximize the window - DESKTOPS ONLY
52 | #print('Maximizing window')
53 | #self.driver.maximize_window()
54 |
55 | #check the title
56 | print('Checking title')
57 | self.assertEqual("Selenium Test Example Page", self.driver.title)
58 |
59 | # if we are still in the try block after all of our assertions that
60 | # means our test has had no failures, so we set the status to "pass"
61 | self.test_result = 'pass'
62 |
63 | except AssertionError as e:
64 |
65 | # if any assertions are false, we take a snapshot of the screen, log
66 | # the error message, and set the score to "during tearDown()".
67 |
68 | snapshot_hash = self.api_session.post('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots').json()['hash']
69 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots/' + snapshot_hash,
70 | data={'description':"AssertionError: " + str(e)})
71 | self.test_result = 'fail'
72 | raise
73 |
74 | def tearDown(self):
75 | print("Done with session %s" % self.driver.session_id)
76 | self.driver.quit()
77 | # Here we make the api call to set the test's score.
78 | # Pass it it passes, fail if an assertion fails, unset if the test didn't finish
79 | if self.test_result is not None:
80 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id,
81 | data={'action':'set_score', 'score':self.test_result})
82 |
83 |
84 | if __name__ == '__main__':
85 | unittest.main()
86 |
--------------------------------------------------------------------------------
/drag-and-drop.py:
--------------------------------------------------------------------------------
1 | # Please visit http://selenium-python.readthedocs.org/en/latest/index.html for detailed installation and instructions
2 | # Getting started: http://docs.seleniumhq.org/
3 | # API details: https://github.com/SeleniumHQ/selenium#selenium
4 |
5 | # Requests is the easiest way to make RESTful API calls in Python. You can install it by following the instructions here:
6 | # http://docs.python-requests.org/en/master/user/install/
7 |
8 | import unittest
9 | from selenium import webdriver
10 | import requests
11 | from selenium.webdriver.support import expected_conditions as EC
12 | from selenium.webdriver.common.by import By
13 | from selenium.webdriver.support.ui import WebDriverWait
14 | from selenium.webdriver import ActionChains
15 |
16 | class DragAndDrop(unittest.TestCase):
17 | def setUp(self):
18 |
19 | # Put your username and authey below
20 | # You can find your authkey at crossbrowsertesting.com/account
21 | self.username = "user@email.com"
22 | self.authkey = "12345"
23 |
24 | self.api_session = requests.Session()
25 | self.api_session.auth = (self.username,self.authkey)
26 |
27 | self.test_result = None
28 |
29 | caps = {}
30 |
31 | caps['name'] = 'Drag-and-Drop Example'
32 | caps['build'] = '1.0'
33 | caps['browserName'] = 'Chrome'
34 | caps['version'] = '53'
35 | caps['platform'] = 'Windows 10'
36 | caps['screenResolution'] = '1366x768'
37 | caps['record_video'] = 'true'
38 | caps['record_network'] = 'false'
39 |
40 | # start the remote browser on our server
41 | self.driver = webdriver.Remote(
42 | desired_capabilities=caps,
43 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub"%(self.username,self.authkey)
44 | )
45 |
46 | self.driver.implicitly_wait(20)
47 |
48 | def test_CBT(self):
49 | # We wrap this all in a try/except so we can set pass/fail at the end
50 | try:
51 | # load the page url
52 | print('Loading Url')
53 | self.driver.get('http://crossbrowsertesting.github.io/drag-and-drop.html')
54 |
55 | # maximize the window - DESKTOPS ONLY
56 | # print('Maximizing window')
57 | # self.driver.maximize_window()
58 |
59 | # grab the first element
60 | print('Grabbing draggable element')
61 | draggable = self.driver.find_element_by_id("draggable")
62 |
63 | # then the second element
64 | print('Grabbing the droppable element')
65 | droppable = self.driver.find_element_by_id("droppable")
66 |
67 | # we use ActionChains to move the element
68 | print('Dragging the element')
69 | actionChains = ActionChains(self.driver)
70 | actionChains.drag_and_drop(draggable, droppable).perform()
71 |
72 | # let's assert that the droppable element is in the state we want it to be
73 | droppableText = self.driver.find_element_by_xpath('//*[@id="droppable"]/p').text
74 | self.assertEqual('Dropped!', droppableText)
75 |
76 | print("Taking snapshot")
77 | snapshot_hash = self.api_session.post('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots').json()['hash']
78 |
79 | # if we are still in the try block after all of our assertions that
80 | # means our test has had no failures, so we set the status to "pass"
81 | self.test_result = 'pass'
82 |
83 | except AssertionError as e:
84 | # log the error message, and set the score to "during tearDown()".
85 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots/' + snapshot_hash,
86 | data={'description':"AssertionError: " + str(e)})
87 | self.test_result = 'fail'
88 | raise
89 |
90 | def tearDown(self):
91 | print("Done with session %s" % self.driver.session_id)
92 | self.driver.quit()
93 | # Here we make the api call to set the test's score.
94 | # Pass it it passes, fail if an assertion fails, unset if the test didn't finish
95 | if self.test_result is not None:
96 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id,
97 | data={'action':'set_score', 'score':self.test_result})
98 |
99 |
100 | if __name__ == '__main__':
101 | unittest.main()
102 |
--------------------------------------------------------------------------------
/login-form.py:
--------------------------------------------------------------------------------
1 | # Please visit http://selenium-python.readthedocs.org/ for detailed installation and instructions
2 | # Getting started: http://docs.seleniumhq.org/docs/03_webdriver.jsp
3 | # API details: https://github.com/SeleniumHQ/selenium#selenium
4 |
5 | # Requests is the easiest way to make RESTful API calls in Python. You can install it by following the instructions here:
6 | # http://docs.python-requests.org/en/master/user/install/
7 |
8 | import unittest
9 | from selenium import webdriver
10 | import requests
11 | from selenium.webdriver.support import expected_conditions as EC
12 | from selenium.webdriver.common.by import By
13 | from selenium.webdriver.support.ui import WebDriverWait
14 |
15 | class LoginForm(unittest.TestCase):
16 | def setUp(self):
17 |
18 | # Put your username and authey below
19 | # You can find your authkey at crossbrowsertesting.com/account
20 | self.username = "user@email.com"
21 | self.authkey = "12345"
22 |
23 | self.api_session = requests.Session()
24 | self.api_session.auth = (self.username,self.authkey)
25 |
26 | self.test_result = None
27 |
28 | caps = {}
29 |
30 | caps['name'] = 'Login Form Example'
31 | caps['build'] = '1.0'
32 | caps['browserName'] = 'Chrome'
33 | caps['version'] = '53'
34 | caps['platform'] = 'Windows 10'
35 | caps['screenResolution'] = '1366x768'
36 | caps['record_video'] = 'true'
37 | caps['record_network'] = 'false'
38 |
39 | # start the remote browser on our server
40 | self.driver = webdriver.Remote(
41 | desired_capabilities=caps,
42 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub"%(self.username,self.authkey)
43 | )
44 |
45 | self.driver.implicitly_wait(20)
46 |
47 | def test_CBT(self):
48 | # We wrap this all in a try/except so we can set pass/fail at the end
49 | try:
50 | # load the page url
51 | print('Loading Url')
52 | self.driver.get('http://crossbrowsertesting.github.io/login-form.html')
53 |
54 | # maximize the window - DESKTOPS ONLY
55 | #print('Maximizing window')
56 | self.driver.maximize_window()
57 |
58 | # we'll start the login process by entering our username
59 | print('Entering username')
60 | self.driver.find_element_by_name('username').send_keys('tester@crossbrowsertesting.com')
61 |
62 | # then by entering our password
63 | print('Entering password')
64 | self.driver.find_element_by_name('password').send_keys('test123')
65 |
66 | # now we'll click the login button
67 | print('Logging in')
68 | self.driver.find_element_by_css_selector('body > div > div > div > div > form > div.form-actions > button').click()
69 |
70 | # if we've passed the login, we should see the welcome text
71 |
72 | elem = WebDriverWait(self.driver, 10).until(
73 | EC.presence_of_element_located((By.XPATH, '//*[@id=\"logged-in-message\"]/h2'))
74 | )
75 |
76 | welcomeText = elem.text
77 | self.assertEqual("Welcome tester@crossbrowsertesting.com", welcomeText)
78 |
79 | print("Taking snapshot")
80 | snapshot_hash = self.api_session.post('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots').json()['hash']
81 |
82 | # if we are still in the try block after all of our assertions that
83 | # means our test has had no failures, so we set the status to "pass"
84 | self.test_result = 'pass'
85 |
86 | except AssertionError as e:
87 | # log the error message, and set the score to "during tearDown()".
88 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots/' + snapshot_hash,
89 | data={'description':"AssertionError: " + str(e)})
90 | self.test_result = 'fail'
91 | raise
92 |
93 | def tearDown(self):
94 | print("Done with session %s" % self.driver.session_id)
95 | self.driver.quit()
96 | # Here we make the api call to set the test's score.
97 | # Pass it it passes, fail if an assertion fails, unset if the test didn't finish
98 | if self.test_result is not None:
99 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id,
100 | data={'action':'set_score', 'score':self.test_result})
101 |
102 |
103 | if __name__ == '__main__':
104 | unittest.main()
105 |
--------------------------------------------------------------------------------
/todo-app.py:
--------------------------------------------------------------------------------
1 | # Please visit http://selenium-python.readthedocs.org/en/latest/index.html for detailed installation and instructions
2 | # Getting started: http://docs.seleniumhq.org/docs/03_webdriver.jsp
3 | # API details: https://github.com/SeleniumHQ/selenium#selenium
4 |
5 | # Requests is the easiest way to make RESTful API calls in Python. You can install it by following the instructions here:
6 | # http://docs.python-requests.org/en/master/user/install/
7 |
8 | import unittest
9 | from selenium import webdriver
10 | import requests
11 |
12 | class TodoAppTest(unittest.TestCase):
13 | def setUp(self):
14 |
15 | # Put your username and authey below
16 | # You can find your authkey at crossbrowsertesting.com/account
17 | self.username = "user@email.com"
18 | self.authkey = "12345"
19 |
20 | self.api_session = requests.Session()
21 | self.api_session.auth = (self.username,self.authkey)
22 |
23 | self.test_result = None
24 |
25 | caps = {}
26 |
27 | caps['name'] = 'Todo App Example'
28 | caps['build'] = '1.0'
29 | caps['browserName'] = 'Chrome'
30 | caps['version'] = '53'
31 | caps['platform'] = 'Windows 10'
32 | caps['screenResolution'] = '1366x768'
33 | caps['record_video'] = 'true'
34 | caps['record_network'] = 'false'
35 |
36 | # start the remote browser on our server
37 | self.driver = webdriver.Remote(
38 | desired_capabilities=caps,
39 | command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub"%(self.username,self.authkey)
40 | )
41 |
42 | self.driver.implicitly_wait(20)
43 |
44 | def test_CBT(self):
45 | # We wrap this all in a try/except so we can set pass/fail at the end
46 | try:
47 | # load the page url
48 | print('Loading Url')
49 | self.driver.get('http://crossbrowsertesting.github.io/todo-app.html')
50 |
51 | # maximize the window - DESKTOPS ONLY
52 | #print('Maximizing window')
53 | self.driver.maximize_window()
54 |
55 | # if the checkboxes work, I should be able to click on them
56 | print('Clicking Checkbox')
57 | self.driver.find_element_by_name('todo-4').click()
58 | print('Clicking Checkbox')
59 | self.driver.find_element_by_name('todo-5').click()
60 |
61 | # if I clicked on them, their class name should now be 'done-true'
62 | elems = self.driver.find_elements_by_class_name('done-true')
63 | self.assertEqual(2, len(elems))
64 | # if my form element works, I should be able to enter text and add it to my list.
65 | print('Entering Text')
66 | self.driver.find_element_by_id('todotext').send_keys('Run your first Selenium Test')
67 | self.driver.find_element_by_id('addbutton').click()
68 |
69 | # if I entered the text, the following element should contain that text
70 | span_text = self.driver.find_element_by_xpath('/html/body/div/div/div/ul/li[6]/span').text
71 | self.assertEqual('Run your first Selenium Test', span_text)
72 |
73 | # if my archive link works, my checked elements should be archived
74 | print('Archiving old todos')
75 | self.driver.find_element_by_link_text('archive').click()
76 |
77 | elems = self.driver.find_elements_by_class_name('done-false')
78 | self.assertEqual(4, len(elems))
79 |
80 | snapshot_hash = self.api_session.post('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots').json()['hash']
81 |
82 | # if we are still in the try block after all of our assertions that
83 | # means our test has had no failures, so we set the status to "pass"
84 | self.test_result = 'pass'
85 |
86 | except AssertionError as e:
87 | # log the error message, and set the score to "during tearDown()".
88 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots/' + snapshot_hash,
89 | data={'description':"AssertionError: " + str(e)})
90 | self.test_result = 'fail'
91 | raise
92 |
93 | def tearDown(self):
94 | print("Done with session %s" % self.driver.session_id)
95 | self.driver.quit()
96 | # Here we make the api call to set the test's score.
97 | # Pass it it passes, fail if an assertion fails, unset if the test didn't finish
98 | if self.test_result is not None:
99 | self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id,
100 | data={'action':'set_score', 'score':self.test_result})
101 |
102 |
103 | if __name__ == '__main__':
104 | unittest.main()
105 |
--------------------------------------------------------------------------------