6

我想使用遠程套接字調試Python的Chrome devtools(link)。 我使用的代碼改編自here使用來自Python的遠程chrome devtools

我設法得到pinglist_tabs工作。但我不知道如何evaluate_javascript。有人可以告訴我我做錯了什麼嗎?

import subprocess 
import time, json, socket 

from jca.files import my_paths 

def request(tool, destination=None, **kw): 
    # Send a command via socket to 'DevToolsService' or 'V8Debugger' 
    j = json.dumps(kw) 
    request = 'Content-Length:%d\r\nTool:%s\r\n' % (len(j), tool) 
    if destination: 
    request += 'Destination:%s\r\n' % (destination,) 
    request += '\r\n%s\r\n' % (j,) 
    sock.send(request) 
    if kw.get('command', '') not in RESPONSELESS_COMMANDS: 
    time.sleep(.1) 
    response = sock.recv(30000) 
    if response.strip(): 
     j = response.split('\r\n\r\n', 1)[1] 
     return json.loads(j) 

if __name__ == '__main__': 
    proc = subprocess.Popen('"%s" --remote-shell-port=9222' % my_paths.chrome_exe) 
    RESPONSELESS_COMMANDS = ['evaluate_javascript'] 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect(('localhost', 9222)) 
    sock.send('ChromeDevToolsHandshake\r\n') 
    result = sock.recv(1024) 
    print 'ping: ', request('DevToolsService', command='ping') 
    time.sleep(4) 
    print 'list_tabs: ', request('DevToolsService', command='list_tabs') 
    request('V8Debugger', command='evaluate_javascript', 
      data='javascript:window.location.reload()') 
    sock.close() 
    print 'done' 

回答

1

問題是我沒有設置目標的tab_id。將請求呼叫添加到目的地= 2可以解決問題。

2

我爲垃圾郵件對不起,有這一個Java庫: http://code.google.com/p/chromedevtools/

因爲你很可能選擇Python的不是隨機的,你可以把它作爲一個參考實現,如果運行的Java代碼是OK爲你。我想你可以檢查從Java調試器發送和接收的實際消息。

+0

是的,我知道Java庫。 (如果你仔細觀察,我的問題其實在我的問題中也有相同的鏈接:)雖然沒有考慮過通過源代碼進行查看。猜猜我會嘗試,如果沒有人有更好的想法。 –

+1

哎呀,對不起,現在我明白了。我其實不會推薦閱讀那麼多的源代碼 - 它們非常複雜(部分原因是支持新的Chrome協議「WIP」),從調試器中看它的運行方式可能更有趣:) – beefeather

+0

你可以發現有趣的是http ://code.google.com/p/chromedevtools/source/browse/#svn%2Ftrunk%2Fplugins%2Forg.chromium.sdk%2Fsrc%2Forg%2Fchromium%2Fsdk%2Finternal%2Fv8native%2Fprotocol%2Finput - 它包含Java實際上是1:1協議定義的接口(僅適用於傳入數據)。 – beefeather