痛苦而艱難 才寫出這一點點,這是個登陸測試 main 抓包類login_tst 剛學測試和python 寫的一般 讓各位見笑了 ...
痛苦而艱難 才寫出這一點點,這是個登陸測試
main
# -*- coding: utf-8 -*- from selenium import webdriver import login_tst import time import thread ms={} def thread_start_(): global ms ms=login_tst.GST_start()#開始抓包 return driver='' try: driver = webdriver.Chrome()#驅動載入 火狐用Firefox() except Exception as e: print format(e) driver.get('http://***.***.***:8765/Index/login.html') time.sleep(1) name=unicode("13864619000","utf-8")#只抓取了與伺服器之間交互的值做判斷,所以js的語句沒辦法測試 password=unicode("000ww000","utf-8")#也就是無法測試手機號格式不符,密碼為空的情況, driver.find_element_by_name('phone').send_keys(name)#這個使用find_element_by_name獲取其元素是否顯示應該就很好判斷 time.sleep(1) driver.find_element_by_name('password').send_keys(password) time.sleep(1) thread.start_new_thread(thread_start_,()) time.sleep(2) driver.find_element_by_tag_name('button').click() time.sleep(1) if ms=={}: print "系統錯誤" elif ms['msg']==u'帳號或密碼錯誤!' and ms['state']==u"0" : print "密碼不對" elif ms['msg']==u"登錄成功..."and ms['state']==u"1" : print "密碼正確" elif ms['msg']==u"驗證碼錯誤!"and ms['state']==u"3" : print "驗證碼錯誤" elif ms['msg']==u"此賬號沒有經過授權,請聯繫管理員!"and ms['state']==u"0" : print "賬號錯誤" else: print "系統錯誤" if(driver.current_url=='http://***.***.***.25:8765/Index/index'): print "進入網頁成功"
抓包類login_tst
# -*- coding: utf-8 -*- from scapy.all import * import re ms={} def GET_print(packet): global ms for i in packet: # po=i.show()#沒有返回值 print "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" qq = i.sprintf("{Raw:%Raw.load%}").split(r"\r\n") # 獲取數據包內的raw數據 不過該項目沒有raw 呵呵 for li in qq: patm = '{"msg":"(.*?)"' # 依靠表達式獲取msg內部值 text_listm = re.compile(patm).findall(str(li)) pats = ',"state":(.?)' #獲取state後的一個值 text_lists = re.compile(pats).findall(str(li)) if text_listm != []: z = 0 while z < len(text_listm) and z < len(text_lists): # for oo in text_listm and (ss in text_lists):#顯然是不行 oo = text_listm[z] ss = text_lists[z] oo = oo.encode('utf-8').decode('unicode_escape')# 轉為uncode編碼用來顯示漢字 o = eval(repr(oo).replace('\\\\', '\\')) #repr()與str()相對 repr可以更清楚的顯示python對數據的處理 str更清楚的顯示用戶可見的信息 # strinfo = re.compile(r'\\\\') # 字元串有大量\\\ 用來替換 記得前面加r 作廢!!! # oo = strinfo.sub(r'\\', oo) # oo=oo.encode('utf-8').decode('unicode_escape') ms['msg'] = o print ms['msg'] ms['state'] = ss.encode('utf-8').decode('unicode_escape')#轉不轉碼無所謂,為了便於管理還是轉碼了 z += 1 print u"--------------" return def stopf(packet): global ms print ms if ms!={}:#判斷是否抓到關鍵包(狀態碼) return True #退出抓包 else: return False #繼續抓包 def GST_start(): a = sniff(prn=GET_print, lfilter=lambda p: "HTTP/1.1 200 OK" in str(p), filter="tcp and host ***.***.***.25", count=0,stop_filter=stopf) # lfilter為抓包篩選語句 作用為只抓含有"HTTP/1.1 200 OK"開頭的包 filter為抓包的BPF語言 包含tcp 以及host的包, count為抓包數,stop_filter退出抓包條件 return ms # 遇到的困難有 # 起py名要避開關鍵詞 和其他的包名類名 等等 # linux pip安裝包要上root許可權 打開charm也要開root許可權 sudo su - root #註意編碼的區別 #如果接收不到值可能是sinff的lfilter或filter的BPF書寫有問題 #uncode編碼非常麻煩儘量最後輸出時再轉換格式 #關於uncode編碼的‘\’轉換 由於python內部不能存在單獨的反斜杠所以替換後都是成對的反斜杠 在進行uncode編碼轉換時會不識別, # 解決辦法:可以先將字元串先轉換為uncode類型後再替換,替換後字元串會自動變為中文,在字典內輸出顯示依舊為utf8碼, # 對比uncode編碼字元串時 要註意在字元串前加u 比如:if ms['msg']==u'帳號或密碼錯誤!' #使用import調用自己寫的類時 註意不要在方法外寫執行函數 如果非要執行請參考 if __name__ == '__main__': #抓包代碼要寫在按鈕前面 使用線程務必在按鈕事件前激活抓包 #thread.start_new_thread沒有返回值 因為很討厭線程問題所以會避開使用threading類庫繼承之類的方法,儘量簡單一些 #pats = ',"state":(.?)' 的後面(.?)不能跟其他條件 不清楚為什麼? 總之不能跟 #亂碼有可能是ide控制台輸出的問題,也有可能是值的問題,要謹慎思考 #使用到的知識有 #scapy庫:一點點的正則,BPF語句的使用,http傳輸格式,tcp深入瞭解, #python:全局變數使用,回調的寫法,字典的使用,線程,編碼的區別與更改,類庫絕對路徑與相對路徑的區別,關於亂碼的解決思路,大小寫的註意 #ide:pycharm的一些功能的瞭解,特別是註意選用合適python,這樣pip安裝類庫後才能正常顯示在charm中 #seleium:自動化框架的選擇,http的基本瞭解,可以插入js,各個瀏覽器版本驅動安裝皆不同, #win是將驅動放入瀏覽器文件夾,寫入環境變數中,linux的我忘了。。 # #fiddle:都是些基本操作, #javascript:似乎有框架可以用於ajax 這點屬於知識盲區,方法的重寫與重載,http的網頁格式, #提升的空間 #使用excel,批量載入數值,真正實現自動化, #日誌的實現,可以做到無人值守 #選用更好的線程類 #深度優化bpf語句 #優化代碼結構,使scapy類可以得到更好的重用 #減少sleep的使用,優化速度 #對於驗證碼顯示以及網頁各元素顯示的驗證 #自動輸入正確的驗證碼登陸驗證 這點比較有意思 需要找個介面 #還是希望使用純粹的seleium做判斷而不是依據抓包來判斷登入成功 #操作步驟 #登陸-》fiddle抓包——》觀察傳值有哪些,使用哪種方式傳值——》觀察網頁源代碼,js等推斷出值的選用範圍和邏輯方向,-》據此在scapy中編寫bpf寫入sniff #儘量抓到準確的包-》解析包-》提取關鍵的值來做邏輯判斷-》seleium控制網頁,輸入數值,->scapy新建線程等待抓包,-》點擊確定-》抓到包 #根據數值判斷執行不同方法 #至此學習合計大概花費4天的時間 每天8個小時左右 #抓包scapy,自動化框架seleium,學習加編寫各一天 #linux系統問題一天(我py起名時竟然起了個跟selenium裡面類名一樣的,結果報錯找不到類,我只好把類庫和python裝了卸,卸了裝,足足花了6個小時才解決。。) #最扯的是linux的更新把瀏覽器內核還更新了 造成原本正常的seleium的瀏覽器內核作廢,我又找了很長時間的錯 #網頁分析一天 工具的選用與設計(至今不懂,登陸裡面的javascript怎麼寫的,原想要寫個js插入進去獲值來判斷是否登陸成功的,但對自己的js功力沒啥信心,還是算了) #其餘還有很多時間用在了梳理知識 寫筆記,硬剛uncode編碼,win和linux之間的相容性問題上 #至此告一段落 這種自動化成本忒高了 要是滑鼠流早完事邊上喝茶去了
剛學測試和python 寫的一般 讓各位見笑了