6
6
import gzip
7
7
import logging
8
8
import os
9
- import re
9
+ import Queue
10
10
import subprocess
11
11
import time
12
12
import monotonic
13
13
import ujson as json
14
+ from ws4py .client .threadedclient import WebSocketClient
14
15
15
16
class DevTools (object ):
16
17
"""Interface into Chrome's remote dev tools protocol"""
17
18
def __init__ (self , job , task , use_devtools_video ):
18
- self .url = "http://localhost :{0:d}/json" .format (task ['port' ])
19
+ self .url = "http://127.0.0.1 :{0:d}/json" .format (task ['port' ])
19
20
self .websocket = None
20
21
self .job = job
21
22
self .task = task
@@ -84,11 +85,13 @@ def connect(self, timeout):
84
85
# Close extra tabs
85
86
requests .get (self .url + '/close/' + tabs [index ]['id' ])
86
87
if websocket_url is not None :
87
- from websocket import create_connection
88
- self .websocket = create_connection (websocket_url )
89
- if self .websocket :
90
- self .websocket .settimeout (1 )
88
+ try :
89
+ self .websocket = DevToolsClient (websocket_url )
90
+ self .websocket .connect ()
91
91
ret = True
92
+ except Exception :
93
+ logging .critical ("Connect to dev tools websocket Error: %s" ,
94
+ err .__str__ ())
92
95
else :
93
96
time .sleep (0.5 )
94
97
else :
@@ -182,10 +185,9 @@ def collect_trace(self):
182
185
logging .info ('Collecting trace events' )
183
186
done = False
184
187
last_message = monotonic .monotonic ()
185
- self .websocket .settimeout (1 )
186
188
while not done and monotonic .monotonic () - last_message < 30 :
187
189
try :
188
- raw = self .websocket .recv ( )
190
+ raw = self .websocket .get_message ( 1 )
189
191
if raw is not None and len (raw ):
190
192
msg = json .loads (raw )
191
193
if 'method' in msg :
@@ -346,9 +348,8 @@ def flush_pending_messages(self):
346
348
"""Clear out any pending websocket messages"""
347
349
if self .websocket :
348
350
try :
349
- self .websocket .settimeout (0 )
350
351
while True :
351
- raw = self .websocket .recv ( )
352
+ raw = self .websocket .get_message ( 0 )
352
353
if raw is not None and len (raw ):
353
354
logging .debug (raw [:1000 ])
354
355
msg = json .loads (raw )
@@ -369,11 +370,10 @@ def send_command(self, method, params, wait=False, timeout=30):
369
370
logging .debug ("Sending: %s" , out )
370
371
self .websocket .send (out )
371
372
if wait :
372
- self .websocket .settimeout (1 )
373
373
end_time = monotonic .monotonic () + timeout
374
374
while ret is None and monotonic .monotonic () < end_time :
375
375
try :
376
- raw = self .websocket .recv ( )
376
+ raw = self .websocket .get_message ( 1 )
377
377
if raw is not None and len (raw ):
378
378
logging .debug (raw [:1000 ])
379
379
msg = json .loads (raw )
@@ -389,13 +389,12 @@ def send_command(self, method, params, wait=False, timeout=30):
389
389
def wait_for_page_load (self ):
390
390
"""Wait for the page load and activity to finish"""
391
391
if self .websocket :
392
- self .websocket .settimeout (1 )
393
392
start_time = monotonic .monotonic ()
394
393
end_time = start_time + self .task ['time_limit' ]
395
394
done = False
396
395
while not done :
397
396
try :
398
- raw = self .websocket .recv ( )
397
+ raw = self .websocket .get_message ( 1 )
399
398
if raw is not None and len (raw ):
400
399
logging .debug (raw [:1000 ])
401
400
msg = json .loads (raw )
@@ -671,3 +670,40 @@ def get_header_value(self, headers, name):
671
670
value = headers [header_name ]
672
671
break
673
672
return value
673
+
674
+ class DevToolsClient (WebSocketClient ):
675
+ """DevTools Websocket client"""
676
+ def __init__ (self , url , protocols = None , extensions = None , heartbeat_freq = None ,
677
+ ssl_options = None , headers = None ):
678
+ WebSocketClient .__init__ (self , url , protocols , extensions , heartbeat_freq ,
679
+ ssl_options , headers )
680
+ self .connected = False
681
+ self .messages = Queue .Queue ()
682
+
683
+ def opened (self ):
684
+ """Websocket interface - connection opened"""
685
+ logging .debug ("DevTools websocket connected" )
686
+ self .connected = True
687
+
688
+ def closed (self , code , reason = None ):
689
+ """Websocket interface - connection closed"""
690
+ logging .debug ("DevTools websocket disconnected" )
691
+ self .connected = False
692
+
693
+ def received_message (self , raw ):
694
+ """Websocket interface - message received"""
695
+ if raw .is_text :
696
+ message = raw .data .decode (raw .encoding ) if raw .encoding is not None else raw .data
697
+ self .messages .put (message )
698
+
699
+ def get_message (self , timeout ):
700
+ """Wait for and return a message from the queue"""
701
+ message = None
702
+ try :
703
+ if timeout is None or timeout <= 0 :
704
+ message = self .messages .get_nowait ()
705
+ else :
706
+ message = self .messages .get (True , timeout )
707
+ except Exception :
708
+ pass
709
+ return message
0 commit comments