• Web自动化处理“滑动验证码”


    即便乌云尽染天空,旭阳依然在某处照耀

    验证码的种类有很多,我们常见的有短信验证码、语音验证码、字符验证码、图片验证码、滑动验证码等。今天主要给小伙伴们分享在web自动化测试中,如何处理滑动验证码?
    首先,处理滑动验证码的方法有以下几种:

    • 图像处理
    • 通过cookie绕过
    • 接口绕过

    今天主要分享的是通过图像处理的方法来处理滑动验证码。
    豆瓣官网为例,进入官网之后,点击密码登录,输入账号和密码之后,点击登录,即可跳出滑动验证码,随即人工操作即可成功。那我们现在使用自动化的方式来操作这一系列步骤。
    在这里插入图片描述
    整个过程可以分为以下几步

    1. 显示验证码
    2. 获得滑块以及滑板的图片地址
    3. 下载滑块以及滑板图片
    4. 人工智能匹配滑块验证码距离(opencv)
    5. 缩放比例以及校准滑块偏移量
    6. ActionChains滑动解锁
    7. 滑动失败后增加重试机制

    环境准备:

    pip install opencv-python
    
    • 1

    完整代码如下

    import cv2
    from selenium import webdriver
    import requests
    from time import sleep
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    while True:
        #1. 显示滑动验证码
        driver.get('https://www.douban.com/')
        driver.implicitly_wait(10)
        sleep(3)
        driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe'))
        driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
        driver.find_element(By.XPATH,"//*[@id='username']").send_keys("18888888888")
        driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("123456")
        driver.find_element(By.XPATH,'/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
        sleep(2)
        #2. 获取到滑块以及滑板到图片地址
        driver.switch_to.frame(driver.find_element(By.XPATH,'//*[@id="tcaptcha_iframe"]'))
        ##2.1 滑块
        slideBlock = driver.find_element(By.XPATH,'//*[@id="slideBlock"]')
        slideBlock_url = slideBlock.get_attribute("src")
        ##2.2 滑板
        slideBg = driver.find_element(By.XPATH,'//*[@id="slideBg"]')
        slideBg_url = slideBg.get_attribute("src")
        #print(slideBg_url)
        #print(slideBlock_url)
    
        #3. 下载滑块和滑板
        with open('images/big_images.jpg','wb') as f:
            f.write(requests.get(slideBg_url).content)
            f.close()
    
        with open('images/small_images.jpg','wb') as f:
            f.write(requests.get(slideBlock_url).content)
            f.close()
    
        #4. 智能匹配滑块和滑板的小图重叠后x的距离
        big_grag = cv2.imread("images/big_images.jpg",0) # 以灰度模式加载图片
        small_grag = cv2.imread("images/small_images.jpg",0) # 以灰度模式加载图片)
        res = cv2.matchTemplate(big_grag,small_grag,cv2.TM_CCORR_NORMED) #匹配对象
        cv2.imread
        value = cv2.minMaxLoc(res)
        print("value的值",value)
        x = value[2][0]
        print(x)
    
        #5. 缩放比例以及校准滑块偏移量,原图是680*390,实际是282*162
        x = int(x*282/680)
        py = 31 - int(20*282/680)
        x = x-py
        print(x)
    
        #6. 通过ActionChains滑动解锁
        hk_ele = driver.find_element(By.XPATH,'//*[@id="slideBlock"]')
        action = ActionChains(driver) # 初始化一个鼠标对象
        action.click_and_hold(hk_ele).perform()  #鼠标按住不动
        action.drag_and_drop_by_offset(hk_ele,x,0).perform() #把滑动移动到指定的坐标,0代表纵坐标
        sleep(3)
    
        ## 如果元素不存在,则表示成功
        #7. 滑动失败后增加重试机制
        try:
            driver.find_element(By.XPATH,'//*[@id="captcha_close"]/div')
        except Exception as e:
            break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    如果觉的还不错,给个赞呗,在这个夏天,让我们共同进步。

  • 相关阅读:
    并发编程学习笔记 之 常用并发容器的概念及使用方法
    Python安装教程(Windows10系统)
    Microsoft.IO.RecyclableMemoryStream源码解读
    到底什么是TORCH.NN?
    icmp报文及用go实现
    特殊的类——集合与泛型(C#)
    Spring系列-细说bean标签的parent属性使用
    Java 计算两个日期相差多少天
    找不到名称 “$“。是否需要安装 jQuery 的类型定义? 请尝试使用 `npm i --save-dev @types/jquery`。
    Rust中的输入输出格式变化(非常详细)
  • 原文地址:https://blog.csdn.net/weixin_42182599/article/details/125895385