用於UI自動化登錄拼圖滑動驗證碼
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019/11/15 14:32 4 # @Site : 5 # @File : puzzleCaptcha.py 6 # @Software: PyCharm 7 8 import os 9 import cv2 10 import time 11 from PIL import Image 12 from SiteTest.datas.data_Files import *#自行創建的package,存放頁面元素數據 13 from selenium.webdriver import ActionChains 14 from selenium.webdriver.common.by import By 15 16 path = os.path.abspath(os.path.dirname(os.getcwd())) 17 18 class puzzleCaptcha(): 19 def __init__(self): 20 21 #常量和元素數據加載 22 self.Data = Datas()#可按照分類保存元素路徑數據 23 self.data = self.Data.puzzleCaptchaData()#實例化所需數據方法,用到該參數的地方都需要按照實際建立的數據文件取值self.data.**** 24 25 def analog_drag(self,driver,distance,bgImagePath,sliderImagePath):#滑動過程 26 """ 27 滑動過程 28 :param driver: 瀏覽器 29 :param distance 滑塊滑動距離 30 :param bgImagePath 函數pic_get()獲取的背景圖片保存路徑 31 :param sliderImagePath 函數pic_get()獲取的滑塊圖片保存路徑 32 :return: 背景圖和滑塊圖 33 """ 34 # time.sleep(1)#防止加載緩慢找不到元素buttonDrag 35 buttonDrag = driver.find_element(By.XPATH,self.data.buttonDrag_xpath) 36 ActionChains(driver).click_and_hold(buttonDrag).move_by_offset(distance,0).perform() 37 time.sleep(1)#移動到指定距離后停留1s再釋放鼠標 38 ActionChains(driver).release(buttonDrag).perform() 39 flag = self.ifElementExist(driver,By.XPATH,self.data.succes_xpath) 40 while True: 41 if flag == False:#拼圖不成功一直重試 42 # time.sleep(0.5) 43 driver.refresh() 44 self.pic_get(driver,bgImagePath,sliderImagePath) 45 distance01 = self.move_Distance(bgImagePath,sliderImagePath) 46 self.analog_drag(driver,distance01,bgImagePath,sliderImagePath) 47 else:#拼圖成功后輸入賬戶密碼並登陸 48 # time.sleep(0.5) 49 driver.find_element_by_class_name(self.data.userName_class).send_keys(self.data.userName) 50 driver.find_element(By.XPATH,self.data.pwd_xpath).send_keys(self.data.pwd) 51 driver.find_element(By.XPATH,self.data.btnLogin_xpath).click() 52 break 53 time.sleep(1)#便於查找元素 54 55 def ifElementExist(self,driver,method,elementPath): 56 """ 57 判斷查找的元素是否存在 58 :param driver: 瀏覽器 59 :param method:查找元素方法(By.XPATH,By.CLASS_NAME,By.LINK_TEXT,By.ID,By.NAME等) 60 :param elementPath: 元素在html中的路徑 61 :return: 背景圖和滑塊圖 62 """ 63 try: 64 time.sleep(1)#防止頁面加載過慢,找不到元素導致拼圖成功時 flag==False 65 driver.find_element(method,elementPath) 66 flag = True 67 except: 68 flag=False 69 return flag 70 71 def pic_get(self,driver,bgImagePath,sliderImagePath): 72 """ 73 獲取拼圖圖片 74 :param driver: 瀏覽器 75 :param bgImagePath: 背景圖片 76 :param liderImagePath:滑塊圖片 77 :return: 背景圖和滑塊圖 78 """ 79 time.sleep(1) 80 buttonDrag = driver.find_element(By.XPATH,self.data.buttonDrag_xpath) 81 ActionChains(driver).click_and_hold(buttonDrag).perform() 82 83 bgImage = driver.find_element(By.XPATH,self.data.bgPic_xpath)#背景圖片元素獲取 84 driver.save_screenshot(bgImagePath) 85 # print bgImage.location 86 # print(bgImage.size) 87 left_bg = bgImage.location['x'] 88 top_bg = bgImage.location['y'] 89 right_bg = bgImage.location['x'] + bgImage.size['width'] 90 bottom_bg = bgImage.location['y'] + bgImage.size['height'] 91 im_bg = Image.open(bgImagePath) 92 im_bg = im_bg.crop((left_bg, top_bg, right_bg, bottom_bg)) 93 im_bg.save(bgImagePath) 94 self.change_bgImage(bgImagePath) 95 96 sliderImage =driver.find_element(By.XPATH,self.data.sliderPic_xpath)#滑塊圖片元素獲取 97 driver.save_screenshot(sliderImagePath) 98 # print sliderImage.location 99 # print(sliderImage.size) 100 left_slider = sliderImage.location['x'] 101 top_slider = sliderImage.location['y'] 102 right_slider = sliderImage.location['x'] + sliderImage.size['width'] 103 bottom_slider = sliderImage.location['y'] + sliderImage.size['height'] 104 im_slider = Image.open(sliderImagePath) 105 im_slider = im_slider.crop((left_slider, top_slider, right_slider, bottom_slider)) 106 im_slider.save(sliderImagePath) 107 # print(im_bg,im_slider) 108 return im_slider,im_bg 109 110 def change_bgImage(self,bgImagePath):#選用,點擊才會出現拼圖時有用, 111 """ 112 覆蓋函數pic_get()獲取背景圖片中滑塊凸起 113 :param bgImagePath 函數pic_get()獲取的背景圖片保存路徑 114 :return: 背景圖和滑塊圖 115 """ 116 img = cv2.imread(bgImagePath) 117 img2 = img[0:150,65:120] 118 img[0:150,10:65]=img2 119 cv2.imwrite(bgImagePath,img) 120 121 def move_Distance(self,bgImagePath, sliderImagePath): 122 """ 123 找出圖像中最佳匹配位置 124 :param target: 目標即背景圖 125 :param template: 模板即需要找到的圖 126 :return: 返回最佳匹配及其最差匹配和對應的坐標 127 """ 128 target_rgb = cv2.imread(bgImagePath) 129 target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY) 130 template_rgb = cv2.imread(sliderImagePath, 0) 131 # template_gray = cv2.cvtColor(template_rgb,cv2.COLOR_BGR2GRAY) 132 res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED) 133 value = cv2.minMaxLoc(res) 134 value2 = value[3][0]-10 135 # print(value) 136 # print(value2) 137 return value2 138 139 if __name__ == '__main__': 140 puzzleCaptcha()