selenium-滑动验证码实现

selenium-滑动验证码实现

selenium-滑动验证码实现_第1张图片

    def move_code(self,loc1,loc2,loc3):
        '''滑动滑块验证码
        loc1 = 滑块图片的元素定位
        loc2 = 背景图片的元素定位
        loc3 = 滑动按钮的元素定位
        脚本位置是在Testcase/Test***/test_**.py
        '''

        n = 1
        while True:
            # 定位图片的位置
            # 获取元素属性
            front_img_src = self.get_element_null(loc1)
            bg_img_scr = self.get_element_null(loc2)
            time.sleep(1)
            front_img_src = front_img_src.get_attribute('src')
            bg_img_scr = bg_img_scr.get_attribute('src')
            # 判断文件夹是否存在不存在则创建'
            os.makedirs('../../outputs/image/', exist_ok=True)
            # 下载滑块和背景图
            urllib.request.urlretrieve(front_img_src, '../../outputs/image/bkBlock.png')
            urllib.request.urlretrieve(bg_img_scr, '../../outputs/image/slideBlock.png')
            # 读取图片
            front = cv2.imread('../../outputs/image/slideBlock.png')
            bg = cv2.imread('../../outputs/image/bkBlock.png')
            # 对图片进行灰度处理
            front = cv2.cvtColor(front, cv2.COLOR_BGR2GRAY)
            bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)
            # 去掉滑块黑色部分
            front = front[front.any(1)]  # 0表示黑色,1表示高亮部分
            # 匹配->cv图像匹配算法,匹配出划片图片在背景图的位置
            result = cv2.matchTemplate(bg, front, cv2.TM_CCORR_NORMED)  # match匹配,Template模板;精度高,速度慢的方法
            index_max = np.argmax(result)  # 返回的是一维的位置,最大值索引,作为匹配的横向坐标X
            # 反着推最大值的二维位置,和opencv是相反的
            x, y = np.unravel_index(index_max, result.shape)
            # 移动滑动按钮
            drop = self.get_element_null(loc3) #查找到元素locator
            try:
                action = ActionChains(self.driver)
                # 鼠标左键按下不放
                action.click_and_hold(drop).perform()
                # 平行移动大于解锁的长度的距离
                action.drag_and_drop_by_offset(drop, xoffset=y + 10, yoffset=0).perform()
                time.sleep(1)
                # 通过当前滑块图片是否存在判断是否跳出循环
                self.get_element_null(loc1).is_displayed()
                print('第%s次进行滑动验证码校验' % n, '\n')
                n = n + 1
                time.sleep(1)
            except:
                break

你可能感兴趣的:(selenium,selenium,python,计算机视觉)