-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathproject.py
143 lines (123 loc) · 4.35 KB
/
project.py
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
from enum import Enum
from typing import Optional
import dotenv
import pydantic
from python_mobile_test_template.support import path
class EnvContext(Enum):
android = 'android'
ios = 'ios'
# bstack_android = 'bstack_android'
# bstack_ios = 'bstack_ios'
# local_android = 'local_android'
# local = 'local'
# local_ios = 'local_ios'
class Config(pydantic.BaseSettings):
context: EnvContext = EnvContext.android
# --- Selene settings --- #
driver_remote_url: str = 'http://127.0.0.1:4723'
timeout: float = 6
# --- App-wise settings --- #
app_package: Optional[str] = None
# --- General Capabilities --- #
newCommandTimeout: Optional[int] = 60
app: Optional[str] = None
appWaitActivity: Optional[str] = None
deviceName: Optional[str] = None
udid: Optional[str] = None
noReset: Optional[bool] = None
platformVersion: Optional[str] = None
browserName: Optional[str] = None
bstack_userName: Optional[str] = None
bstack_accessKey: Optional[str] = None
# --- Android Capabilities --- #
avd: Optional[str] = None
# --- iOS Capabilities --- #
bundleId: Optional[str] = None
initialDeeplinkUrl: Optional[str] = None
@property
def bstack_creds(self):
return {
'userName': self.bstack_userName,
'accessKey': self.bstack_accessKey,
}
@property
def runs_on_bstack(self):
return self.app.startswith('bs://')
def to_driver_options(self):
general_caps = {
**(
{'newCommandTimeout': self.newCommandTimeout}
if self.newCommandTimeout
else {}
),
**(
{'platformVersion': self.platformVersion}
if self.platformVersion
else {}
),
**({'browserName': self.browserName} if self.browserName else {}),
**({'deviceName': self.deviceName} if self.deviceName else {}),
**({'udid': self.udid} if self.udid else {}),
**({'noReset': self.noReset} if self.noReset is not None else {}),
**(
{
'app': (
self.app
if (self.app.startswith('/') or self.runs_on_bstack)
else path.relative_from_root(self.app)
)
}
if self.app
else {}
),
**(
{
"bstack:options": {
'projectName': 'Wikipedia App Tests',
# TODO: use some unique value
'buildName': 'browserstack-build-1',
# TODO: use some unique value
'sessionName': 'BStack first_test',
**self.bstack_creds,
}
}
if self.runs_on_bstack
else {}
),
}
if self.context is EnvContext.android:
from appium.options.android import UiAutomator2Options
android_caps = {
**general_caps,
**({'avd': self.avd} if self.avd else {}),
**(
{'appWaitActivity': self.appWaitActivity}
if self.appWaitActivity
else {}
),
}
return UiAutomator2Options().load_capabilities(android_caps)
elif self.context is EnvContext.ios:
from appium.options.ios import XCUITestOptions
ios_caps = {
**general_caps,
**({'bundleId': self.bundleId} if self.bundleId else {}),
**(
{'initialDeeplinkUrl': self.initialDeeplinkUrl}
if self.initialDeeplinkUrl
else {}
),
}
return XCUITestOptions().load_capabilities(ios_caps)
else:
raise ValueError(f'Unsupported context: {self.context}')
# To load env variables from .env file
# (they will override .env.{context}.defaults files)
dotenv.load_dotenv(
dotenv_path=dotenv.find_dotenv('.env', usecwd=True),
# but will not override env vars set out of .env file
override=False,
)
config = Config(
dotenv.find_dotenv(f'.env.{Config().context.value}.defaults', usecwd=True)
)