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

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

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

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

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

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

环境准备:

pip install opencv-python

完整代码如下

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

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

猜你喜欢

转载自blog.csdn.net/weixin_42182599/article/details/125895385