篇幅較長,請大家耐心看完,建議收藏慢慢看,另外文末給大家準備了福利(好幾套面試題加學習資料等),需要自?。?/b>

做自動化 UI 測試時,遇到登錄有驗證碼校驗無法繞過時,可以使用下面的方法。
就是登錄模塊的這種騰訊云滑塊驗證碼。
發(fā)現(xiàn)有缺口的圖片和沒有缺口的圖片,url 里的 img_index 參數(shù)不同。(一個 img_index=1,一個 img_index=0)
所以用 PIL 庫,對比 驗證碼圖片 有缺口和無缺口的不同,計算出偏移量,模擬滑塊滑動。
import random
import io
from PIL import Image
from urllib.request import urlopen
from selenium.webdriver.common.action_chains import ActionChains
import time
# 打開圖片鏈接
def open_img_url(src):
? ? img_url = urlopen(src, timeout=2).read()
? ? img = Image.open(io.BytesIO(img_url))
? ? # 恢復原始大小
? ? img_resize = (int(i // 2) for i in img.size)
? ? return img.resize(img_resize, Image.ANTIALIAS)
def get_img(dr):
? ? dr.switch_to.frame('tcaptcha_iframe')
? ? src1 = dr.find_element_by_id('slideBg').get_attribute('src')
? ? src2 = src1.replace('img_index=1', 'img_index=0')
? ? return open_img_url(src1), open_img_url(src2)
# 比較兩張圖片同一點上的像數(shù)值,差距大于設(shè)置標準返回False
def is_pixel(img1, img2, x, y):
? ? i = 100
? ? px1, px2 = img1.load()[x, y], img2.load()[x, y]
? ? r, g, b = [abs(p1 - p2) for p1, p2 in zip(px1, px2)]
? ? return True if r < i and g < i and b < i else False
# 獲取缺口的偏移量,兩張圖片對比,(i,j)像素點的RGB差距,過大則該x為偏移值
def get_offset(img1, img2):
? ? offset, distance = None, 70
? ? x, y = img1.size
? ? for i in range(distance, x):
? ? ? ? for j in range(y):
? ? ? ? ? ? if not is_pixel(img1, img2, i, j):
? ? ? ? ? ? ? ? offset = i
? ? ? ? ? ? ? ? return offset
? ? return offset
# 計算滑塊的移動軌跡 滑塊并不是從0開始移動,有一個初始值
def get_track(offset):
? ? offset -= 30
? ? return [offset / 4] * 4
# 模擬釋放鼠標抖動
def shake(dr):
? ? ActionChains(dr).move_by_offset(xoffset=-2, yoffset=0).perform()
? ? ActionChains(dr).move_by_offset(xoffset=2, yoffset=0).perform()
? ? time.sleep(random.random())
# 按軌跡移動
def move(dr, track):
? ? for i in track:
? ? ? ? ActionChains(dr).move_by_offset(xoffset=i, yoffset=0).perform()
? ? ? ? time.sleep(random.random() / 100)
? ? time.sleep(random.random())
# 完成拖動操作
def slider_btn(dr, track):
? ? btn = dr.find_element_by_id('tcaptcha_drag_thumb')
? ? ActionChains(dr).click_and_hold(btn).perform()? # 按住按鈕不放
? ? move(dr, track)? # 按正向軌跡移動
? ? move(dr, [-1, -0.5, -1])? # 按逆向軌跡移動
? ? shake(dr)? # 模擬人手抖動
? ? ActionChains(dr).release().perform()? # 松開滑塊按鈕
# 處理驗證碼
def deal_slider_captcha(dr):
? ? time.sleep(3)
? ? img1, img2 = get_img(dr)
? ? offset = get_offset(img1, img2)
? ? track = get_track(offset)
? ? slider_btn(dr, track)
基于 selenium 的 webdriver
from selenium import webdriver
if __name__ == '__main__':
? ? dr = webdriver.Chrome('chromedriver的地址')
? ? deal_slider_captcha(dr)
福利
下面有我整理的一些資料有興趣可以一起學習最后祝大家 前程似錦?。?/b>
這份資料整體是圍繞著【軟件測試】來進行整理的,主體內(nèi)容包含:python自動化測試專屬視頻、Python自動化詳細資料、全套面試題等知識內(nèi)容。對于軟件測試的的朋友來說應該是最全面和完整的備戰(zhàn)倉庫了,這個倉庫也陪伴我走過了很多坎坷的路,希望也能幫助到你。
1.可以關(guān)注我的公眾號 清風酔 獲取
2.可以關(guān)注我的B站號,里面有詳細的教程感興趣的可以去看看
感謝相遇,感謝緣分,感謝支持,感謝選擇,感謝信任。祝大家可以順利找到心儀的工作!
