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