-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathsession.py
More file actions
88 lines (70 loc) · 3.15 KB
/
session.py
File metadata and controls
88 lines (70 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import os
from selenium import webdriver
from selenium.webdriver.remote.remote_connection import RemoteConnection
from .options import SauceOptions
data_centers = {
'us-west': 'ondemand.us-west-1.saucelabs.com',
'us-east': 'ondemand.us-east-1.saucelabs.com',
'eu-central': 'ondemand.eu-central-1.saucelabs.com',
'apac-southeast': 'ondemand.apac-southeast-1.saucelabs.com'
}
class SauceSession():
def __init__(self, options=None, data_center='us-west', resolve_ip=False):
self.options = options if options else SauceOptions.chrome()
self._username = os.getenv('SAUCE_USERNAME', None)
self._access_key = os.getenv('SAUCE_ACCESS_KEY', None)
self.data_center = data_center if data_center else 'us-west'
self._remote_url = None
self._resolve_ip = resolve_ip if resolve_ip else False
self.driver = None
@property
def data_center(self):
return self._data_center
@data_center.setter
def data_center(self, data_center):
if data_center.lower() not in data_centers.keys():
raise ValueError("Invalid Data Center value, please select from:", list(data_centers.keys()))
self._data_center = data_center
@property
def remote_url(self):
if self._remote_url is None:
data_center = data_centers[self._data_center]
return 'https://{}:{}@{}:443/wd/hub'.format(self._username, self._access_key, data_center)
else:
return self._remote_url
@remote_url.setter
def remote_url(self, remote_url):
self._remote_url = remote_url
def start(self):
if not self._username:
raise KeyError("Cannot start session, Sauce Username is not set.")
elif not self._access_key:
raise KeyError("Cannot start session, Sauce Access Key is not set.")
self.driver = self.create_driver(self.remote_url, self.options.to_capabilities())
return self.driver
def stop(self, result):
self.update_test_result(result)
self.driver.quit()
def update_test_result(self, result_in):
result = ''
if result_in is True:
result = 'passed'
elif result_in is False:
result = 'failed'
elif result_in and 'pass' in result_in.lower():
result = 'passed'
elif result_in and 'fail' in result_in.lower():
result = 'failed'
self.driver.execute_script('sauce:job-result={}'.format(result))
# Add output for the Sauce OnDemand Jenkins plugin
# The first print statement will automatically populate links on Jenkins to Sauce
# The second print statement will output the job link to logging/console
if self.driver is not None:
print("SauceOnDemandSessioID={} job-name={}".format(self.driver.session_id, self.options.name))
print("Test Job Link: https://app.saucelabs.com/tests/{}".format(self.driver.session_id))
def create_driver(self, url, capabilities):
return webdriver.Remote(
command_executor=RemoteConnection(url, self._resolve_ip),
desired_capabilities=capabilities,
keep_alive=True
)