接到这样的一个需求就是,通过抓取接口的操作日志,然后解析出来相应的参数,然后通过rpc接口回放这些日志。
获取log
这里有一点特殊的是,我的log并不是来自于控制台,而是来自于Chrome浏览器的开发者工具,因为后台是用node.js写的。页面相当于一个触发器。打开一个页面,这个页面会触发一些单元测试用例,然后会产生一系列的log。
所以问题的关键就是如何获取Chrome开发者工具控制台的信息?答案就是:利用selenium,selenium会有一个接口,get_log(),通过这个接口,就可以获得相应的日志。示例代码如下:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
# enable browser logging
d = DesiredCapabilities.CHROME
d['loggingPrefs'] = { 'browser':'ALL' }
chromedriver="/Users/mac/Desktop/chromedriver"
driver = webdriver.Chrome(chromedriver,desired_capabilities=d)
# load some site
driver.get('http://localhost:5000/test.html')
# print messages
time.sleep(10)
with open('red.txt','w') as f:
for entry in driver.get_log('browser'):
print (entry)
f.write(str(entry))
f.write('\n')
但是这样打印出来的日志,并不能打印出json数组,也不能打印出对象。所以需要在log打印源头上改。
解析log
上一步的log都放在了txt文件中,所以先读取文件。findall是匹配到所有的。先筛选出含有的部分,在用[A-Za-z0-9-_]{1,50}
提取出来
with open('red.txt','r') as f:
a=f.readlines()
all_obj={}
s=0
for i in a:
temp_dict={}
#获取入参
in_p=re.compile(r'\\"(.*)\"')
in_matchObj=in_p.findall(i)
in_p_last=re.compile(r'[A-Za-z0-9-_]{1,50}')
in_lastObj=in_p_last.findall(str(in_matchObj))
RPC接口
这里不同的RPC框架使用不同的方式吧,但结构大致都类似,我当时的后端,他们用的是zbus这个rpc方式,官方文档上有Python的请求方式,
from zbus import ClientBootstrap
b = ClientBootstrap() #重对象,里面有连接池,建议应用层面共享,!切记不能每次方法调用实例化一次!
#b.ha(True) #默认直连,不启用HA
b.service_address('localhost:15555')
b.service_token('')
b.service_name('hiposNewAge') #设置默认的服务标识,可动态改变
b.module('OrderService') #设置默认的模块, 可动态改变
b.timeout(10)
rpc = b.invoker()
r=rpc.OpenOrder(ticketId)#调用相应的RPC服务
参考链接:
zbus官方文档