背景:
讓測試人員測試一下,埋點的設備信息上報情況。
需要統計的設備字段如下:
名稱 |
說明 |
---|---|
platform | 操作系統平臺 |
adblock | 防廣告軟件:通過是否能插入dom判斷 |
cpuCoresCpu | cpu核心數:通過navigator判斷(cpu類型僅ie能獲取到,不做處理) |
audio | 聲卡指紋:通過window判斷 |
WebglVendorAndRenderer | 顯卡型號:通過canvas調用獲取 |
ip | 公網、局域網ip |
webglKey | webgl(不同瀏覽器不統一) |
touchSupport | 是否支持觸摸:通過navigator判斷,(觸碰點數目,觸碰事件) |
hasLiedLanguages | 是否修改語言:通過navigator判斷 |
scrDeviceXDPI | 設備的DPI:僅ie能獲取到,不做處理 |
pixelDepth | 顏色分辨率 |
colorDepth | 顏色深度 |
doNotTrack | 是否允許跟蹤 |
HasLiedResolution |
是否修改屏幕分辨率 |
cookieEnabled | 是否啓用cookie |
BrowserName |
瀏覽器名稱 |
timeZone | 時區 |
MimeTypes |
支持的 MIME 類型的數組(手機無) |
systemLanguage |
系統語言(僅ie) |
BrowserLanguage |
瀏覽器語言 |
Online |
系統是否處於脫機模式 |
wh |
屏幕分辨率:寬*高 |
brand |
手機品牌(品牌覆蓋度待測) |
執行:
訪問地址:https://testwx.aikaixin.com/vue/go
查看服務器會看到一條如下記錄:
10.10.15.9 - - [11/Feb/2020:09:30:05 +0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple%20Inc.~Apple%20GPU&brand=iPhone&platform=iPhone&startTime=1581384605010&wh=375%2A667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"
產品經理上來就問:測試大概什麼時間能夠測試完成?
我?什麼才叫測試完成呢。
當前在老家辦公,手頭上機器有限,如何才能測出他們想要的結果,又如何將數據導出到產品經理可以看的EXCEL呢。
首先看一下服務器產生的上面這條數據,會發現有些地方被url編碼了:
去站長工具http://tool.chinaz.com/tools/urlencode.aspx 裏面先解一下碼:
10.10.15.9 - - [11/Feb/2020:09:30:05 0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple Inc.~Apple GPU&brand=iPhone&platform=iPhone&startTime=1581384605010&wh=375*667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"
可以看到現在都顯示正常了。
當然可以手動將數據填到excel表裏,爲此還真嘗試了一下,填了兩組數據之後-------眼疼。
對在同一臺手機上,在瀏覽器,qq,微信,釘釘上打開同一個鏈接,經肉眼觀察,數據相差不大,可以初步假設其他手機上也是如此,那假如要大量的數據,用雲真機去訪問下這個鏈接,我再到服務器日誌裏將數據撈出來不就搞定收工了?
於是我百度了下,首先用衆測試了下,新用戶有免費30分鐘,但是用過之後發現巨卡。後來還是用了wetest,巨貴,扣起時間來也毫不手軟,30分鐘要19.8,然後花了兩個19.8,選用了主流品牌的幾款高端機型點擊了一下鏈接。
數據有了,接下來就是將數據導出來:cat access.log |grep "GET /s.png" > 5.log
隨便取兩條
10.10.15.9 - - [11/Feb/2020:09:30:05 +0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple%20Inc.~Apple%20GPU&brand=iPhone&platform=iPhone&startTime=1581384605010&wh=375%2A667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"
10.10.15.9 - - [11/Feb/2020:09:30:36 +0800] "GET /s.png?Adblock=false&Audio=48000_0_1_0_2_explicit_speakers&BrowserLanguage=zh-CN&BrowserName=WeChat&CookieEnabled=true&DoNotTrack=false&HasLiedLanguages=true&MimeTypes=&Online=true&TouchSupport=5_true&WebglFp=eff1c22f7a276449cca05e9be289b9ee&WebglVendorAndRenderer=Apple%20Inc.~Apple%20GPU&brand=iPhone&platform=iPhone&startTime=1581384636223&wh=375%2A667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.10(0x17000a21) NetType/WIFI Language/zh_CN" "49.67.212.46"
第一步現將數據url解碼,將導出來的日誌文件解碼後存入到新的文件裏面
def filedecode():
#導出log文件,通過這種命令導出cat access.log |grep "GET /s.png" > 5.log
with open('5.log','r') as f:
content = f.readlines()
#將導出的文件解碼,解碼後的文件存到6.txt
with open('6.txt','w') as f:
for line in content:
contentdecode = parse.unquote(line)
f.write(contentdecode)
第二步對每一行的數據通過“&”分段,用到字符串處理split函數
datalist = line.split('&')
數據處理之後大概是這樣子的一個列表:
['10.10.15.9 - - [11/Feb/2020:09:30:05 +0800] "GET /s.png?Adblock=false','Audio=48000_0_1_0_2_explicit_speakers'.......,'wh=375*667 HTTP/1.0" 200 70 "https://testwx.aikaixin.com/vue/go" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AliApp(DingTalk/4.7.25) com.laiwang.DingTalk/12472299 Channel/201200 language/zh-Hans-CN UT4Aplus/0.0.6 WK" "49.67.212.46"']
可以看到列表的第一個元素和最後一個元素需要特殊處理,中間的字段是 A=B的形式。
處理第一個元素,獲取Adblock=flase:
datalist[0] = datalist[0].split('?')[1]
處理最後一個元素,獲取wh
lastdatalist = datalist[-1].split(' ')
datalist[-1] = lastdatalist[0]
我們的最終目的是將是將數據處理成一條條的字典,然後再將這些字典寫入到excel的指定位置。
將處理完成的數據轉化爲字典 將A=B的這種,A作爲字典的key值,B作爲value值,因爲數據裏有這種A=,或者A的情況,沒有B所以他的value將沒有值,這裏需要特殊處理一下,將沒有值的給他一個默認值“無數據”
dlist = d.split('=')
if len(dlist) == 2 and dlist[1] != '':
dkey = dlist[0]
dvalue = dlist[1]
else:
dkey = dlist[0]
dvalue = '無數據'
datadict[dkey] = dvalue
數據處理完成後,就是將其寫入到EXCEL表中,這裏用到的是openpyxl
表格樣式如下:
爲了使得數據靈活一些,這裏直接使用表格中第二行的值作爲key值,如果這個key值在我們處理的數據中不存在,那麼就給他默認“無數據”
這個就比較簡單了。
詳細代碼如下:
from urllib import parse
import openpyxl
from openpyxl.styles import colors,PatternFill
#讀取文件信息,進行url解碼
def filedecode():
#導出log文件,通過這種命令導出cat access.log |grep "GET /s.png" > 5.log
with open('5.log','r') as f:
content = f.readlines()
#將導出的文件解碼,解碼後的文件存到6.txt
with open('6.txt','w') as f:
for line in content:
contentdecode = parse.unquote(line)
f.write(contentdecode)
#對數據文件進行處理
def dealdata():
#對文件解碼
filedecode()
#讀取需要處理的數據文件
with open('6.txt','r') as f:
data = f.readlines()
#定義一個數組用於存儲處理完成的字典數據
datadonelist = []
#對每一行數據進行處理
for line in data:
#將一行的數據通過&和?符號分隔開來
datalist = line.split('&')
#第一次處理後,數組裏的第一個元素和最後一個元素需要進行進一步處理,獲取準確的數據
#數組裏的第一個元素獲取Adblock
datalist[0] = datalist[0].split('?')[1]
#數組裏最後一個元素取wh和ip地址
lastdatalist = datalist[-1].split(' ')
datalist[-1] = lastdatalist[0]
#取ip,然後將其加到數組裏去
lastdata = "ip="+lastdatalist[-1]
datalist.append(lastdata)
#將數據處理成字典格式
#1.先通過“=”分隔數據,左側爲key,右側爲value
#2.定義一個字典用於存儲數據
datadict = {}
for d in datalist:
#因爲有的字段爲空值,所以要判斷數組長度
dlist = d.split('=')
if len(dlist) == 2 and dlist[1] != '':
dkey = dlist[0]
dvalue = dlist[1]
else:
dkey = dlist[0]
dvalue = '無數據'
datadict[dkey] = dvalue
datadonelist.append(datadict)
return datadonelist
#將處理好的數據寫入excel表
def writexls():
#1.讀取excel表格數據
wb = openpyxl.load_workbook('data.xlsx')
#2.定位表格
sheet1 = wb['Sheet1']
#3.獲取最大列
maxcolumn = sheet1.max_column
#獲取處理好的數據
data = dealdata()
print(len(data))
#從第三行開始寫入excel表,根據第二行的值來寫
for i in range(3,len(data)+3):
for j in range(1,maxcolumn+1):
titlekey = sheet1.cell(2,j).value
#需要判斷鍵值是否在字典中存在,因爲存在鍵值不存在的情況
sheet1.cell(i,j).value = data[i-3].get(titlekey,'無數據')
#對結果數據進行標識處理,將無數據的標黃
fillcolor = PatternFill(fill_type='solid',fgColor=colors.YELLOW)
#遍歷表格數據,如果爲無數據,將它標黃
#獲取最大行
maxrow = sheet1.max_row
for i in range(1,maxrow+1):
for j in range(1,maxcolumn+1):
if sheet1.cell(i,j).value == '無數據':
sheet1.cell(i,j).fill = fillcolor
#保存表格
wb.save('data.xlsx')
writexls()
最終處理結果如下:
第一階段測試搞定收工!後續就等開發他們優化,增加了字段之後,只要小改代碼就行了