UI自動化自動驗證登錄滑動拼圖驗證碼


用於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()


免責聲明!

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



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