即便乌云尽染天空,旭阳依然在某处照耀
验证码
的种类有很多,我们常见的有短信验证码、语音验证码、字符验证码、图片验证码、滑动验证码
等。今天主要给小伙伴们分享在web自动化测试
中,如何处理滑动验证码?
首先,处理滑动验证码的方法有以下几种:
- 图像处理
- 通过cookie绕过
- 接口绕过
今天主要分享的是通过图像处理
的方法来处理滑动验证码。
以豆瓣官网为例,进入官网之后,点击密码登录,输入账号和密码之后,点击登录,即可跳出滑动验证码,随即人工操作即可成功。那我们现在使用自动化的方式来操作这一系列步骤。
整个过程可以分为以下几步
- 显示验证码
- 获得滑块以及滑板的图片地址
- 下载滑块以及滑板图片
人工智能
匹配滑块验证码距离(opencv
)- 缩放比例以及校准滑块偏移量
ActionChains
滑动解锁- 滑动失败后增加重试机制
环境准备:
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
如果觉的还不错,给个赞呗,在这个夏天,让我们共同进步。