-
Notifications
You must be signed in to change notification settings - Fork 1
/
AutoChrome.py
110 lines (98 loc) · 4.19 KB
/
AutoChrome.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
import time
import platform
import Event
import Launcher
import PyChromeDevTools
from AutoPage import AutoPage
from AutoWindow import AutoWindow
MIN_TIMEOUT = 0.15
class AutoChrome(AutoPage, AutoWindow):
def __init__(self, port=9222, chrome_process=None):
self.port = port
self.chrome_process = chrome_process
self.chrome = PyChromeDevTools.ChromeInterface(port=self.port, auto_connect=False)
while True:
try:
time.sleep(0.05)
self.chrome.get_tabs()
break
except IOError:
pass
for index, tab in enumerate(self.chrome.tabs):
if 'page' == tab['type'] and 'about:blank' == tab['url']:
self.target_id = tab['id']
self.chrome.connect(tab=index, update_tabs=False)
self.chrome.Page.enable()
self.chrome.Network.enable()
self.chrome.Page.setLifecycleEventsEnabled(enabled=True)
return
def get_this(self):
return self
def wait_condition(self, condition, timeout):
return self.wait_conditions(conditions=[condition], timeout=timeout)
def wait_conditions(self, conditions, timeout):
if conditions is None:
raise ValueError('conditions is None!')
if type(conditions) is not list:
raise ValueError('conditions expect list!')
if len(conditions) == 0:
raise ValueError("conditions length is zero!")
if timeout is None:
raise ValueError('timeout is None!')
if timeout < MIN_TIMEOUT:
raise ValueError('timeout less than ' + str(MIN_TIMEOUT) + ' s')
start = time.time()
while True:
time.sleep(MIN_TIMEOUT)
for condition in conditions:
result = condition(self.chrome)
if result is not None:
return result
if time.time() - start >= timeout:
raise TimeoutError
def wait_event(self, event, timeout):
if event is None:
raise ValueError('event is None!')
if type(event) is not Event.Events:
raise ValueError('event not in Events!')
if timeout is None:
raise ValueError('timeout is None!')
if timeout < MIN_TIMEOUT:
raise ValueError('timeout less than ' + str(MIN_TIMEOUT) + ' s')
return self.chrome.wait_event(str(event), timeout)
def wait_lifecycle_event(self, event, timeout):
if event is None:
raise ValueError('event is None!')
if type(event) is not Event.LifecycleEvents:
raise ValueError('event not in LifecycleEvents!')
if timeout is None:
raise ValueError('timeout is None!')
if timeout < MIN_TIMEOUT:
raise ValueError('timeout less than ' + str(MIN_TIMEOUT) + ' s')
start = time.time()
while True:
lifecycle_event = self.chrome.wait_event(str(Event.Events.PageLifecycleEvent))[0]
if str(event) == lifecycle_event['params']['name']:
return lifecycle_event
if time.time() - start >= timeout:
raise TimeoutError
def close(self):
try:
self.chrome.Target.closeTarget(targetId=self.target_id)
self.chrome.close()
except IOError:
if self.chrome_process is not None:
self.chrome_process.terminate()
if __name__ == '__main__':
if 'Darwin' == platform.system():
launcher = Launcher.Launcher(path='/Users/kba977/Others/SoftWare/chrome-mac/Chromium.app/Contents/MacOS/Chromium')
else:
launcher = Launcher.Launcher(path='C:/app/chrome-win/chrome.exe')
auto_chrome = launcher.launch()
auto_chrome.navigate(url='https://persons.shgjj.com')
auto_chrome.get_window_bounds()
auto_chrome.set_window_bounds(100, 100, 800, 600)
auto_chrome.set_window_state('minimized')
# auto_chrome.wait_condition(condition=Conditions.wait_dom_ready, timeout=18)
# result = auto_chrome.wait_event(event=Event.Events.PageFrameStoppedLoading, timeout=10)
# auto_chrome.wait_lifecycle_event(event=Event.LifecycleEvents.firstMeaningfulPaint, timeout=15)