-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbrowser.py
More file actions
145 lines (108 loc) · 3.81 KB
/
browser.py
File metadata and controls
145 lines (108 loc) · 3.81 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
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
import sys
import os
sys.path.append(os.path.dirname(__file__))
from .selenium.webdriver import Chrome
from .selenium.webdriver import Firefox
class Browser:
def __init__(self):
from .browser_integration import status
status("Intializing Browser instance.")
self.webdriver = None
self.selected_items = []
self.old_css_selector = ''
self.old_xpath_selector = ''
self.recording = False
def connected(self):
return self.webdriver is not None
def connect(self, browser):
if browser == 'Chrome':
self.webdriver = Chrome(os.path.join(os.path.dirname(__file__),
'..', 'chromedriver'))
elif browser == 'Firefox':
self.webdriver = Firefox()
else:
from .browser_integration import warning
warning('Unknow browser driver: {}'.format(browser))
def quit(self):
if self.webdriver:
self.webdriver.quit()
self.webdriver = None
def select_xpath(self, selector, highlight=True):
from .browser_integration import setting
self.unselect()
if selector:
try:
self.selected_items = \
self.webdriver.find_elements_by_xpath(selector)[:1]
self.execute(select_xpath_js % (selector,
setting('highlight_outline')))
self.old_xpath_selector = selector
except:
self.unselect()
else:
self.unselect()
return self.selected_items
def select_css(self, selector, highlight=True):
from .browser_integration import setting
self.unselect()
if selector:
try:
self.selected_items = \
self.webdriver.find_elements_by_css_selector(selector)
self.execute(select_css_js % (selector,
setting('highlight_outline')))
self.old_css_selector = selector
except:
self.unselect()
else:
self.unselect()
return self.selected_items
def unselect(self):
self.execute(unselect_js)
self.old_xpath_selector = ""
self.old_css_selector = ""
self.selected_items = []
def execute(self, script):
from .browser_integration import warning
print("BrowserIntegration :: Executing script:")
print(script)
try:
return self.webdriver.execute_script(script)
except Exception as e:
warning(str(e))
def __getattr__(self, attr):
from .browser_integration import warning
try:
return getattr(self.webdriver, attr)
except AttributeError as e:
raise e
except Exception as e:
warning(str(e))
select_css_js = """
elements = document.querySelectorAll("%s");
for (var i=0; i<elements.length; i++) {
var el = elements[i];
el.setAttribute("data-bi-outline", el.style.outline);
el.classList.add('bi-selected');
el.style.outline = "%s";
}
"""
unselect_js = """
elements = document.querySelectorAll(".bi-selected");
for (var i=0; i<elements.length; i++) {
var el = elements[i];
el.style.outline = el.getAttribute("data-bi-outline");
el.classList.remove('bi-selected');
}
"""
select_xpath_js = """
var evaluator = new XPathEvaluator();
var result = evaluator.evaluate('%s', document.documentElement,
null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
var el = result.singleNodeValue;
if (!!el) {
el.setAttribute("data-bi-outline", el.style.outline);
el.classList.add('bi-selected');
el.style.outline = "%s";
}
"""