/
browser.py
146 lines (104 loc) · 4.22 KB
/
browser.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
144
145
146
import os
import time
from behave import step
from splinter.browser import Browser
from selenium.common.exceptions import WebDriverException
@step(u'{brand} as the default browser')
def given_some_browser(context, brand):
brand = brand.lower()
context.default_browser = brand
@step(u'a browser')
def given_a_browser(context):
named_browser(context, '')
@step(u'browser "{name}"')
def named_browser(context, name):
single_browser = hasattr(context, 'single_browser')
if single_browser and hasattr(context, 'browser') and context.browser == name:
# don't start up multiple browsers
return
if name not in context.browsers:
args = context.browser_args.copy()
if context.remote_webdriver:
args['driver_name'] = 'remote'
if context.default_browser:
args['browser'] = context.default_browser
elif context.default_browser:
args['driver_name'] = context.default_browser
if context.default_browser == 'electron':
assert context.electron_app, u'You need to set the electron app path'
args['binary'] = context.electron_app
browser_attempts = 0
while browser_attempts < context.max_browser_attempts:
try:
context.browsers[name] = Browser(**args)
break
except WebDriverException:
browser_attempts += 1
else:
raise WebDriverException("Failed to initialize browser")
context.browser = context.browsers[name]
if single_browser:
context.is_connected = True
if context.default_browser_size:
context.browser.driver.set_window_size(*context.default_browser_size)
@step(u'the electron app "{app_path}"')
def given_an_electron_app(context, app_path):
assert os.path.isfile(app_path), u'Electron app not found'
app_path = os.path.abspath(app_path)
context.electron_app = app_path
@step(u'I close the browser "{name}"')
def close_browser(context, name):
context.browsers[name].driver.close()
@step(u'I reload')
def reload(context):
context.browser.reload()
@step(u'I go back')
def go_back(context):
context.browser.back()
@step(u'I go forward')
def go_forward(context):
context.browser.forward()
@step(u'I set the cookie "{key}" to "{value}"')
def set_cookie(context, key, value):
context.browser.cookies.add({key: value})
@step(u'I delete the cookie "{key}"')
def delete_cookie(context, key):
context.browser.cookies.delete(key)
@step(u'I delete all cookies')
def delete_all_cookies(context):
context.browser.cookies.delete()
@step(u'I clear the localStorage')
def clear_local_storage(context):
context.browser.execute_script('localStorage.clear();')
@step(u'I clear the sessionStorage')
def clear_session_storage(context):
context.browser.execute_script('sessionStorage.clear();')
@step(u'I clear the browser storage')
def clear_browser_storage(context):
context.browser.execute_script('localStorage.clear();sessionStorage.clear();')
@step(u'I resize the browser to {width}x{height}')
def resize_browser(context, width, height):
context.browser.driver.set_window_size(int(width), int(height))
@step(u'I resize the viewport to {width}x{height}')
def resize_viewport(context, width, height):
width = int(width)
height = int(height)
b_size = context.browser.driver.get_window_size()
b_width = b_size['width']
b_height = b_size['height']
v_width = context.browser.evaluate_script("document.documentElement.clientWidth")
v_height = context.browser.evaluate_script("document.documentElement.clientHeight")
context.browser.driver.set_window_size(
b_width + width - v_width,
b_height + height - v_height)
@step(u"I maximize the browser's window")
def maximize_window(context):
context.browser.driver.maximize_window()
@step(u'I take a screenshot')
def take_screenshot(context):
assert context.screenshots_dir != '', u'no screenshots_dir specified'
filename = context.scenario.feature.name + u'-' + \
context.scenario.name + u'-' + \
time.strftime("%Y-%m-%d-%H%M%S", time.gmtime(time.time()))
filename = os.path.join(context.screenshots_dir, filename)
context.browser.screenshot(filename)