Selenium UI自動化驗證碼:識別+輸入


思路:使用UI+接口的方式來查找驗證碼圖片和獲取驗證碼元素進行參數輸入(用截圖方式)(非圖片類型驗證碼無法實現)

 

我們以訪問當當網的注冊界面來演示

1.通過selenium定位查找驗證碼並截圖保留

1引入selenium包,創建web驅動,進入登錄界面,執行無誤

2創建截圖函數:查找驗證碼元素,截下當前的圖片

定位驗證碼圖片

對驗證碼圖片進行截圖

使用代碼獲取驗證碼圖片左上角的坐標(x,y),使用代碼獲取驗證碼圖片的長度和寬度,求出兩個對角的橫縱坐標(四個邊的x,y坐標)

3通過已經獲得的驗證碼的兩個對角線的點的四個坐標將驗證碼截圖(后面用接口獲取值)

獲取到的截圖

這部分實現的代碼

 

 

 

2. 新建獲取驗證碼函數,通過接口方法獲取驗證碼

1這個操作需要花錢,參考網址:https://www.showapi.com/apiGateway/view?apiCode=184

2注冊登錄並購買套餐(花錢就行,注意使用時的消耗和次數)推薦買最便宜的試,有需要再說

3使用方法:根據當前驗證碼的規則是4位英文字母,所以我們使用只含英數字符的就行

檢查驗證碼類型和長度(當前驗證碼是四位,且均是英文字母)

選擇業務類型(因此選擇英文數字類型的待識別內容)

4選擇操作語言,查看指引方法(上一張圖往下滾)

選擇語言后出現代碼的指引操作,點擊下載右邊的SDK下載(soft-develop-kit 軟件開發包)

下載是一個zip壓縮包,解壓后是一個py同名不同格式名的文件

將這個文件放到工作路徑並引用,引用方法參照代碼指引,並需要下載接口請求的requests

調用這個文件里的方法我們需要三個參數(urlmy_appidmy_appsecret)其中接口地址在上面已給出

my_appidmy_secret在登錄后的個人中心——我的應用處獲取 my_secret需要輸入密碼

查看appid

查看密碼(得先輸入登錄密碼)

 

其他操作內容——對文件的獲取,以及內容及長度的識別,這里只展示使用方法,上面有使用參數的介紹,根據個人需要配置參數,最后調用發送請求獲取響應

使用方法介紹

參數介紹

5完成驗證碼函數的代碼實現

6使用變量接收獲取到的驗證碼,定位到輸入框,輸入獲取到的驗證碼

7一切都准備好后,點擊運行

 

 

 

 

 

 

 

最后附上全部代碼

from selenium import webdriver
from PIL import Image
from ShowapiRequest import ShowapiRequest


driver = webdriver.Chrome()
driver.get("https://login.dangdang.com/register.php?returnurl=http://book.dangdang.com/?_utm_brand_id=11106&_ddclickunion=460-5-biaoti|ad_type=0|sys_id=1")

def screen_shot():
    driver.save_screenshot(r"D:\zhuce.png") #截下當前頁面的圖
    left_angle = driver.find_element_by_id("imgVcode").location #獲取驗證碼左上角坐標
    print(left_angle) #查看驗證碼圖片左上角點的坐標
    left = left_angle["x"] #獲取驗證碼圖片最左邊的x軸坐標
    top = left_angle["y"] #獲取驗證碼圖片最上面的y軸坐標
    image = driver.find_element_by_id("imgVcode") #對整個圖片進行定位
    width = image.size["width"] #獲取圖片的寬度
    height = image.size["height"] #獲取圖片的高度
    right = left+width #獲取驗證碼圖片最右邊的x軸坐標
    down = top+height #獲取驗證碼圖片最下面的y軸坐標
    print(left,top,right,down) #打印四個角的橫縱坐標

    openim = Image.open(r"D:\zhuce.png") #打開剛才截下的整個的圖片
    jietu = openim.crop((left,top,right,down)) #通過剛才獲得的四個坐標進行截圖(Imagez中的方法) 這里是兩個小括號
    jietu.save(r"D:\xi.png") #截取驗證碼的小圖並繼續保存

def yanzhengma():
    yz = ShowapiRequest("http://route.showapi.com/184-4","104117","6baff26b20aa48edb6584955c0e08559")
    yz.addFilePara("image",r"D:\xi.png") #小驗證碼的照片來源
    yz.addBodyPara("typeId","24") #這個是純英文數字,我輸入24就可以
    yz.addBodyPara("convert_to_jpg","0") #照片類型不做轉換
    yz.addBodyPara("needMorePrecise","1") #精度轉換
    res = yz.post().json() #獲取json格式的響應,方便取值
    d = res["showapi_res_body"]["Result"] #獲取Result下的驗證碼的值
    print(d) #打印
    return d #返回

if __name__=="__main__":
    screen_shot()
    c = yanzhengma() #賦值 用於輸入
    driver.find_element_by_id("txt_vcode").send_keys(c)

 

 

 

 

 

 

 

 

 

補充一下,這個套餐有次數和時間限制,想知道使用情況可以登錄並查看即時情況

本篇博文雖然用的是Python,但驗證碼接口識別支持多種語言。也可以用其他語言實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM