我正在玩铬的无头网络浏览器API。基于chrome_remote_shell源代码,我提出了以下代码:
#!/usr/bin/env python
import json
import requests
import pprint
import websocket
tablist = json.loads(requests.get("http://%s:%s/json" % ("localhost", 9222)).text)
print(tablist)
wsurl = tablist[0]['webSocketDebuggerUrl']
conn = websocket.create_connection(wsurl)
navcom = json.dumps({"id":0, "method":"Network.enable"})
conn.send(navcom)
navcom = json.dumps({"id":1, "method":"Page.navigate", "params":{"url":"https://news.ycombinator.com/"}})
conn.send(navcom)
while True:
packet = json.loads(conn.recv())
if 'method' in packet:
print(packet['method'])
else:
print(packet)下面是输出示例:
[{u'description': u'', u'title': u'Hacker News', u'url': u'https://news.ycombinator.com/', u'webSocketDebuggerUrl': u'ws://localhost:9222/devtools/page/7d03a57d-77a9-4ceb-b645-3b85461de5be', u'type': u'page', u'id': u'7d03a57d-77a9-4ceb-b645-3b85461de5be', u'devtoolsFrontendUrl': u'/devtools/inspector.html?ws=localhost:9222/devtools/page/7d03a57d-77a9-4ceb-b645-3b85461de5be'}]
{u'id': 0, u'result': {}}
Network.requestWillBeSent
{u'id': 1, u'result': {u'frameId': u'21045.1'}}
Network.responseReceived
Network.dataReceived
Network.dataReceived
Network.loadingFinished
Network.requestWillBeSent
Network.requestWillBeSent
Network.requestServedFromCache
Network.responseReceived
Network.dataReceived
Network.loadingFinished
Network.requestWillBeSent
Network.requestServedFromCache
Network.responseReceived
Network.dataReceived
Network.loadingFinished
Network.requestWillBeSent
Network.requestServedFromCache
Network.responseReceived
Network.dataReceived
Network.loadingFinished
Network.responseReceived
Network.dataReceived
Network.loadingFinished
Network.requestWillBeSent
Network.requestServedFromCache
Network.responseReceived
Network.dataReceived
Network.loadingFinished我注意到我收到了一长串消息,最后一条消息是Network.loadingFinished,但我得到了多个requestIds的消息。我如何修改我的脚本,使它在页面完全加载并且我可以转义循环时终止?
发布于 2017-04-22 02:00:11
原来我也应该通过Page.enable订阅页面事件:
#!/usr/bin/env python
import json
import requests
import pprint
import websocket
import sys
tablist = json.loads(requests.get("http://%s:%s/json" % ("localhost", 9222)).text)
print(tablist)
wsurl = tablist[0]['webSocketDebuggerUrl']
conn = websocket.create_connection(wsurl)
navcom = json.dumps({"id":0, "method":"Network.enable"})
conn.send(navcom)
navcom = json.dumps({"id":1, "method":"Page.enable"})
conn.send(navcom)
navcom = json.dumps({"id":2, "method":"Page.navigate", "params":{"url":sys.argv[1]}})
conn.send(navcom)
while True:
s = conn.recv()
packet = json.loads(s)
if packet.get('method') == 'Page.loadEventFired':
break
print(s)我们在这里所做的是启用页面和网络项目的通知,然后打开网站并读取之后发生的所有消息。一旦到达Page.loadEventFired,我们就可以假设页面完成了加载,这就是我们可以退出循环并执行任何依赖于此条件的操作的时候。
发布于 2017-04-21 18:46:26
从一般意义上说你不能..。不怎么有意思。
给定当前的动态网页,您需要了解该页面实际上在做什么,并查找DOM元素或其他线索的某些特定事件/存在。
正如您所看到的,您得到了很多loadingFinished事件,但是如何知道它是“最后一个”事件呢?你需要理解这一页。例如,您能否通过观察页面将每个特定DOM元素类发出一个请求或基于javascript变量或XHR响应来确定发送了多少个请求?如果是这样的话,那么一旦得到n个响应,就可以停止。或者,最后一个请求(目标或有效载荷)或最后一个响应(例如,零长度,包含文本" last“、^D或^Z)有什么特殊之处吗?
另外,如果页面正在轮询服务器(通常带有套接字),“完成加载”意味着什么?
有载的更新
如果您正在寻找什么将是onload事件,您不需要做任何特别的事情。在此之前,driver.get(<url>)会阻塞。
WebDriver将等待页面完全加载(即
onload事件已经触发),然后再将控件返回到您的测试或脚本。值得注意的是,如果页面在加载时使用了大量AJAX,那么WebDriver可能不知道什么时候它已经完全加载了。如果您需要确保这样的页面是完全加载的,那么您可以使用等待。
发布于 2017-04-21 18:05:11
我不确定websockets是如何工作的,但是在套接字上,当您连接到远程服务器时,您将接收大量数据。因此,要接收整个响应,您应该在一个循环中这样做,直到得到一个比块长度更小的块,我的意思是,当您的块长度为4096字节时,最后一个块将是0或x<4096,其中x是接收到的块。因此,有了这些信息,您就知道所有的数据都是从远程服务器接收的。请阅读有关套接字的内容。
https://stackoverflow.com/questions/43548992
复制相似问题