python作為一門比較常見的編程語(yǔ)言,在工作當(dāng)中的應(yīng)用還是比較的廣泛的,比如可以對(duì)此進(jìn)行相關(guān)的自動(dòng)化測(cè)試,比如自動(dòng)化測(cè)試相關(guān)的代碼,另外還有破解滑動(dòng)驗(yàn)證碼。那么,具體的操作手法是怎樣的呢?下面就給大家詳細(xì)解答下。
在Web自動(dòng)化測(cè)試的過程中,經(jīng)常會(huì)被登錄的驗(yàn)證碼給卡住,不知道如何去通過驗(yàn)證碼的驗(yàn)證。
一般的情況下遇到驗(yàn)證碼我們可以都可以找開發(fā)去幫忙解決,關(guān)閉驗(yàn)證碼,或者給一個(gè)萬(wàn)能的驗(yàn)證碼!
那么如果開發(fā)不提供幫助的話,我們自己有沒有辦法來(lái)處理這些驗(yàn)證碼的問題呢?
答案當(dāng)然是有的,常見的驗(yàn)證碼一般分為兩類,一類是圖文驗(yàn)證碼,一類是滑動(dòng)驗(yàn)證碼!滑動(dòng)驗(yàn)證破解思路
關(guān)于滑動(dòng)驗(yàn)證碼破解的思路大體上來(lái)講就是以下兩個(gè)步驟:
1、獲取滑塊滑動(dòng)的距離
2、模擬拖動(dòng)滑塊,通過驗(yàn)證。
關(guān)于這種滑動(dòng)的驗(yàn)證碼,滑塊和缺口背景都是分別是一張獨(dú)立的圖片,我們可以把這兩張圖片,
下載下來(lái)借助于圖像識(shí)別的技術(shù),去識(shí)別缺口在背景圖中的位置,然后減去滑塊當(dāng)前所在位置,就可以得出需要滑動(dòng)的距離。
案例講解
話不多說,我們先來(lái)看一個(gè)案例(QQ空間登錄),QQ空間登錄案例實(shí)現(xiàn)步驟如下:
1、創(chuàng)建一個(gè)driver對(duì)象,訪問qq登錄頁(yè)面
2、輸入賬號(hào)密碼
3、點(diǎn)擊登錄
4、模擬滑動(dòng)驗(yàn)證
實(shí)現(xiàn)代碼
import time from selenium import webdriver from slideVerfication import SlideVerificationCode #1、創(chuàng)建一個(gè)driver對(duì)象,訪問qq登錄頁(yè)面 browser=webdriver.Chrome() browser.get("https://qzone.qq.com/") #2、輸入賬號(hào)密碼 #2.0點(diǎn)擊切換到登錄的iframe browser.switch_to.frame('login_frame') #2.1點(diǎn)擊賬號(hào)密碼登錄 browser.find_element_by_id('switcher_plogin').click() #2.2定位賬號(hào)輸入框,輸入賬號(hào) browser.find_element_by_id("u").send_keys("123456") #2.3定位密碼輸入輸入密碼 browser.find_element_by_id("p").send_keys("PYTHON") #3、點(diǎn)擊登錄 browser.find_element_by_id('login_button').click() time.sleep(3) #4、模擬滑動(dòng)驗(yàn)證 #4.1切換到滑動(dòng)驗(yàn)證碼的iframe中 tcaptcha=browser.find_element_by_id("tcaptcha_iframe") browser.switch_to.frame(tcaptcha) #4.2獲取滑動(dòng)相關(guān)的元素 #選擇拖動(dòng)滑塊的節(jié)點(diǎn) slide_element=browser.find_element_by_id('tcaptcha_drag_thumb') #獲取滑塊圖片的節(jié)點(diǎn) slideBlock_ele=browser.find_element_by_id('slideBlock') #獲取缺口背景圖片節(jié)點(diǎn) slideBg=browser.find_element_by_id('slideBg') #4.3計(jì)算滑動(dòng)距離 sc=SlideVerificationCode(save_image=True) distance=sc.get_element_slide_distance(slideBlock_ele,slideBg) #滑動(dòng)距離誤差校正,滑動(dòng)距離*圖片在網(wǎng)頁(yè)上顯示的縮放比-滑塊相對(duì)的初始位置 distance=distance*(280/680)-22 print("校正后的滑動(dòng)距離",distance) #4.4、進(jìn)行滑動(dòng) sc.slide_verification(browser,slide_element,distance=100)
運(yùn)行效果:
其實(shí)關(guān)于這個(gè)模塊圖像識(shí)別,是借助了第三方的圖像處理模塊來(lái)進(jìn)行識(shí)別的,python中有很多現(xiàn)成的用來(lái)處理圖片的庫(kù),本文使用的是opencv-python來(lái)進(jìn)行識(shí)別的。slideVerfication模塊上面用到的兩個(gè)方法的部分參考代碼如下:
根據(jù)傳入滑塊,和背景的節(jié)點(diǎn),計(jì)算滑塊的距離
def get_element_slide_distance(self,slider_ele,background_ele,correct=0): """ 根據(jù)傳入滑塊,和背景的節(jié)點(diǎn),計(jì)算滑塊的距離 該方法只能計(jì)算滑塊和背景圖都是一張完整圖片的場(chǎng)景, 如果背景圖是通過多張小圖拼接起來(lái)的背景圖, 該方法不適用,請(qǐng)使用get_image_slide_distance這個(gè)方法 :param slider_ele:滑塊圖片的節(jié)點(diǎn) :type slider_ele:WebElement :param background_ele:背景圖的節(jié)點(diǎn) :type background_ele:WebElement :param correct:滑塊缺口截圖的修正值,默認(rèn)為0,調(diào)試截圖是否正確的情況下才會(huì)用 :type:int :return:背景圖缺口位置的X軸坐標(biāo)位置(缺口圖片左邊界位置) """ #獲取驗(yàn)證碼的圖片 slider_url=slider_ele.get_attribute("src") background_url=background_ele.get_attribute("src") #下載驗(yàn)證碼背景圖,滑動(dòng)圖片 slider="slider.jpg" background="background.jpg" self.onload_save_img(slider_url,slider) self.onload_save_img(background_url,background) #讀取進(jìn)行色度圖片,轉(zhuǎn)換為numpy中的數(shù)組類型數(shù)據(jù), slider_pic=cv2.imread(slider,0) background_pic=cv2.imread(background,0) #獲取缺口圖數(shù)組的形狀-->缺口圖的寬和高 width,height=slider_pic.shape[::-1] #將處理之后的圖片另存 slider01="slider01.jpg" background_01="background01.jpg" cv2.imwrite(background_01,background_pic) cv2.imwrite(slider01,slider_pic) #讀取另存的滑塊圖 slider_pic=cv2.imread(slider01) #進(jìn)行色彩轉(zhuǎn)換 slider_pic=cv2.cvtColor(slider_pic,cv2.COLOR_BGR2GRAY) #獲取色差的絕對(duì)值 slider_pic=abs(255-slider_pic) #保存圖片 cv2.imwrite(slider01,slider_pic) #讀取滑塊 slider_pic=cv2.imread(slider01) #讀取背景圖 background_pic=cv2.imread(background_01) #比較兩張圖的重疊區(qū)域 result=cv2.matchTemplate(slider_pic,background_pic,cv2.TM_CCOEFF_NORMED) #獲取圖片的缺口位置 top,left=np.unravel_index(result.argmax(),result.shape) #背景圖中的圖片缺口坐標(biāo)位置 print("當(dāng)前滑塊的缺口位置:",(left,top,left+width,top+height)) return left 滑動(dòng)滑塊進(jìn)行驗(yàn)證 def slide_verification(self,driver,slide_element,distance): """ 滑動(dòng)滑塊進(jìn)行驗(yàn)證 :param driver:driver對(duì)象 :type driver:webdriver.Chrome :param slide_element:滑塊的元組 :type slider_ele:WebElement :param distance:滑動(dòng)的距離 :type:int :return: """ #獲取滑動(dòng)前頁(yè)面的url地址 start_url=driver.current_url print("需要滑動(dòng)的距離為:",distance) #根據(jù)滑動(dòng)距離生成滑動(dòng)軌跡 locus=self.get_slide_locus(distance) print("生成的滑動(dòng)軌跡為:{},軌跡的距離之和為{}".format(locus,distance)) #按下鼠標(biāo)左鍵 ActionChains(driver).click_and_hold(slide_element).perform() time.sleep(0.5) #遍歷軌跡進(jìn)行滑動(dòng) for loc in locus: time.sleep(0.01) ActionChains(driver).move_by_offset(loc,random.randint(-5,5)).perform() ActionChains(driver).context_click(slide_element) #釋放鼠標(biāo) ActionChains(driver).release(on_element=slide_element).perform()
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/128430.html
小編寫這篇文章的主要目的,主要是用來(lái)給大家介紹關(guān)于python自動(dòng)化測(cè)試的一些事情,涉及到的內(nèi)容主要有包括破解圖文驗(yàn)證碼等相關(guān)的一些事宜,具體怎么才能夠破解圖文驗(yàn)證碼呢?下面就給大家詳細(xì)解答下。 對(duì)于web應(yīng)用程序來(lái)講,處于安全性考慮,在登錄的時(shí)候,都會(huì)設(shè)置驗(yàn)證碼, 驗(yàn)證碼的類型種類繁多,有圖片中辨別數(shù)字字母的,有點(diǎn)擊圖片中指定的文字的,也有算術(shù)計(jì)算結(jié)果的,再?gòu)?fù)雜一點(diǎn)就是滑動(dòng)驗(yàn)證的?! ≈T...
摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:驗(yàn)證碼旨在確認(rèn)訪問者是人還是程序,并防止惡意程序的入侵。自年以來(lái),改為在我不是機(jī)器人的方框中打勾,進(jìn)而完成判別。 選自 Github 作者:George Hughey 機(jī)器之心編譯 每個(gè)人都討厭驗(yàn)證碼,這些惱人的圖片中包含你必須輸入的字符,我們只有正確地填寫才能繼續(xù)訪問網(wǎng)站。驗(yàn)證碼旨在確認(rèn)訪問者是人還是程序,并防止惡意程序的入侵。然而,隨著深度學(xué)習(xí)和計(jì)算機(jī)視覺技術(shù)的發(fā)展,現(xiàn)在這些認(rèn)證方...
閱讀 1066·2023-01-14 11:38
閱讀 1062·2023-01-14 11:04
閱讀 901·2023-01-14 10:48
閱讀 2377·2023-01-14 10:34
閱讀 1147·2023-01-14 10:24
閱讀 1026·2023-01-14 10:18
閱讀 654·2023-01-14 10:09
閱讀 733·2023-01-14 10:02