import json import pprint def getShortUrl(url): return url.replace('http://localhost:7456/', '') class ScriptMgr: def __init__(self, tab): self.curr_frame = 0 self.frames = [] self.scripts = [] self.tab = tab self.tab.set_listener('Debugger.scriptParsed', self.onScriptParsed) self.tab.set_listener('Debugger.breakpointResolved', self.onBreakpointResolved) self.tab.set_listener('Debugger.paused', self.onPaused) self.tab.set_listener('Debugger.resumed', self.onResumed) self.tab.set_listener('Debugger.scriptFailedToParse', self.onScriptFailedToParse) self.tab.set_listener('Runtime.consoleAPICalled', self.consoleAPICalled) def onScriptParsed(self, **kwargs): self.scripts.append(kwargs) def onBreakpointResolved(self, **kwargs): print('onBreakpointResolved') def onPaused(self, **kwargs): # print('onPaused') self.frames = [] for frame in kwargs['callFrames']: self.frames.append(frame) pprint.pprint('%s:%d' % ( getShortUrl(self.frames[0]['url']), self.frames[0]['location']['lineNumber'] ) ) def onResumed(self, **kwargs): print('onResumed') def onScriptFailedToParse(self, **kwargs): print('onScriptFailedToParse', kwargs['url']) def consoleAPICalled(self, **kwargs): for prop in kwargs['args']: if prop['type'] == 'object': pprint.pprint(prop['preview']['properties']) else: print('%s' % (str(prop['value']))) def getUrl(self, filename): for script in self.scripts: if filename in script['url']: return script['url'] return None def dumpStack(self): for frame in self.frames: print('%30s %s:%d' % ( frame['functionName'] + ':' + str(json.loads(frame['callFrameId'])['ordinal']) + ':' + str(json.loads(frame['callFrameId'])['injectedScriptId']), getShortUrl(frame['url']), frame['functionLocation']['lineNumber'], ) ) def getFrameId(self): return self.frames[self.curr_frame]['callFrameId']