篇幅較長(zhǎng)紧帕,請(qǐng)大家耐心看完盔然,建議收藏慢慢看,另外文末給大家準(zhǔn)備了福利(好幾套面試題加學(xué)習(xí)資料等)焕参,需要自惹峒汀!
做自動(dòng)化 UI 測(cè)試時(shí)叠纷,遇到登錄有驗(yàn)證碼校驗(yàn)無(wú)法繞過(guò)時(shí),可以使用下面的方法潦嘶。
就是登錄模塊的這種騰訊云滑塊驗(yàn)證碼涩嚣。
發(fā)現(xiàn)有缺口的圖片和沒(méi)有缺口的圖片,url 里的 img_index 參數(shù)不同掂僵。(一個(gè) img_index=1航厚,一個(gè) img_index=0)
所以用 PIL 庫(kù),對(duì)比 驗(yàn)證碼圖片 有缺口和無(wú)缺口的不同锰蓬,計(jì)算出偏移量幔睬,模擬滑塊滑動(dòng)。
import random
import io
from PIL import Image
from urllib.request import urlopen
from selenium.webdriver.common.action_chains import ActionChains
import time
# 打開(kāi)圖片鏈接
def open_img_url(src):
? ? img_url = urlopen(src, timeout=2).read()
? ? img = Image.open(io.BytesIO(img_url))
? ? # 恢復(fù)原始大小
? ? 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)
# 比較兩張圖片同一點(diǎn)上的像數(shù)值芹扭,差距大于設(shè)置標(biāo)準(zhǔn)返回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
# 獲取缺口的偏移量麻顶,兩張圖片對(duì)比,(i,j)像素點(diǎn)的RGB差距赦抖,過(guò)大則該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
# 計(jì)算滑塊的移動(dòng)軌跡 滑塊并不是從0開(kāi)始移動(dòng),有一個(gè)初始值
def get_track(offset):
? ? offset -= 30
? ? return [offset / 4] * 4
# 模擬釋放鼠標(biāo)抖動(dòng)
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())
# 按軌跡移動(dòng)
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())
# 完成拖動(dòng)操作
def slider_btn(dr, track):
? ? btn = dr.find_element_by_id('tcaptcha_drag_thumb')
? ? ActionChains(dr).click_and_hold(btn).perform()? # 按住按鈕不放
? ? move(dr, track)? # 按正向軌跡移動(dòng)
? ? move(dr, [-1, -0.5, -1])? # 按逆向軌跡移動(dòng)
? ? shake(dr)? # 模擬人手抖動(dòng)
? ? ActionChains(dr).release().perform()? # 松開(kāi)滑塊按鈕
# 處理驗(yàn)證碼
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)
福利
下面有我整理的一些資料有興趣可以一起學(xué)習(xí)最后祝大家 前程似錦8ㄉ觥队萤!
這份資料整體是圍繞著【軟件測(cè)試】來(lái)進(jìn)行整理的,主體內(nèi)容包含:python自動(dòng)化測(cè)試專屬視頻矫钓、Python自動(dòng)化詳細(xì)資料要尔、全套面試題等知識(shí)內(nèi)容。對(duì)于軟件測(cè)試的的朋友來(lái)說(shuō)應(yīng)該是最全面和完整的備戰(zhàn)倉(cāng)庫(kù)了新娜,這個(gè)倉(cāng)庫(kù)也陪伴我走過(guò)了很多坎坷的路赵辕,希望也能幫助到你。
1.可以關(guān)注我的公眾號(hào) 清風(fēng)酔 獲取
2.可以關(guān)注我的B站號(hào)概龄,里面有詳細(xì)的教程感興趣的可以去看看
程序員丶醉清風(fēng)的個(gè)人空間_嗶哩嗶哩_Bilibili
感謝相遇匆帚,感謝緣分,感謝支持旁钧,感謝選擇吸重,感謝信任。祝大家可以順利找到心儀的工作歪今!