拳打开发脚踢厂商,web自动化乱不乱,测试说了算

2032 篇文章 51 订阅
777 篇文章 1 订阅
文章介绍了在进行web自动化时遇到验证码的挑战,推荐使用ddddocr,一个由sml2h3和kerlomz开发的Python库,用于验证码识别。虽然识别效果依赖于随机性,但它在文字和数字验证码上的表现良好。此外,文章还详细阐述了如何使用ddddocr结合Selenium处理滑块验证码,通过获取和分析背景图和滑块图片,计算滑动轨迹来模拟用户操作。
摘要由CSDN通过智能技术生成

前言

在做web自动化的时候大家一定碰到过各式各样的验证码,验证码作为一种安全机制,可以有效防止暴力破解密码、发帖、灌水、刷票等,大家在做web自动化的时候应该有碰到验证码这个难题,一般我们可以和开发沟通请求他们的帮助:去掉验证码或者设置一个万能验证码,而如果开发不帮忙我们该如何去解决呢?

ddddocr

ddddocr是由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。

项目地址:

https://github.com/sml2h3/ddddocr

安装:

pip install ddddocr

如果安装速度比较慢的话可以指定国内镜像服务器:

pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple/

接下来以几种常见的验证码识别场景来看看ddddocr的能力如何

图文验证码

这里摘取ddddocr官网的样例来测试下:

图片

代码如下:

import ddddocr


ocr = ddddocr.DdddOcr()
with open('111.png', 'rb') as f:
    image = f.read()
res = ocr.classification(image)
print(res)

在这里插入图片描述

ddddocr对于文字、数字这种验证码识别准确率还是挺高的

滑块验证码

目前非常多项目采用的是滑块验证码方式,此种破解方式的关键点在于如何获取滑块到背景缺口图的距离

在这里插入图片描述

滑块验证码实战

以https://www.kgcaptcha.com这个网站上面的验证码demo为例,选择滑块验证码,通过F12查看验证码区域元素信息。

1、验证码背景图

可以看到验证码背景图数据是在style属性中,并且直接是base64编码的数据,所以在后面我们需要对其进行base64解码得到原始的图片数据(有些可能是图片url地址,我们需要将其下载下来)。

图片

2、滑块图片

滑块图片也是base64编码的数据,其背景是透明底色

图片

接下来看操作(代码):

driver = webdriver.Chrome()
driver.implicitly_wait(5)


driver.get('https://www.kgcaptcha.com/demo/content?t=1')
driver.find_element(By.LINK_TEXT, '弹出式').click()
driver.find_element(By.ID, 'captchaButton').click()
# 获取验证码背景图
bg_pic_style = driver.find_element(By.ID, 'KgBasemap').get_attribute('style')
pattern = re.compile('url\("(.*?)"\)')
# 获取验证码背景图base64编码的数据
bg_src_data = pattern.findall(bg_pic_style)[0]
# base64数据进行解码
bg_src_content = bg_src_data.split(',')[1]
bg_src_data = base64.b64decode(bg_src_content.encode())


# 获取滑块图
slider_pic_data = driver.find_element(By.XPATH, '//*[@id="KgBasemap"]/img[1]').get_attribute('src')
slider_src_content = slider_pic_data.split(',')[1]
# 获取滑块图base64编码的数据
slider_pic_data = base64.b64decode(slider_src_content.encode())

上述代码主要获取验证码背景图和滑块的数据,接下来使用ddddocr来识别验证码背景图中的缺口位置

# 使用ddddocr识别验证码背景图缺口
det = ddddocr.DdddOcr(det=False, ocr=False)
res = det.slide_match(slider_pic_data, bg_src_data, simple_target=True)
print(f'{res}')
distance = res['target'][0]

图片

target中的四组数据代表的是缺口左上角和右下角的位置信息(X、Y轴),所以我们这里只需要拿到第一个149数据即可

拿到距离信息之后,我们还需要通过距离生成滑动轨迹信息,不能直接从开始点直接滑动到终止点(有些网站会判定为脚本操作)

def get_move_track(distance):
    """
    获取滑动轨迹
    不能直接从开始点直接滑动到终止点(有些网站会判定为脚本操作)
    根据滑动距离生成滑动轨迹,开始慢->中间快->最后慢
    :param distance:滑动距离
    :return:滑动轨迹列表
    """
    remain_distance = distance
    track_list = []
    while remain_distance > 0:
        ratio = (distance - remain_distance) / distance
        if ratio < 0.1:
            span = 4
        elif ratio < 0.9:
            span = 16
        else:
            span = 2
        track_list.append(span)
        remain_distance -= span
    return track_list

最后通过Selenium的ActionChains进行滑动即可:

# 使用selenium Actionchains进行滑动
slide_button_element = driver.find_element(By.XPATH, '//*[@id="KgSlide"]/div[3]')
ActionChains(driver).click_and_hold(slide_button_element).perform()
time.sleep(0.5)


for i in get_move_track(distance):
    time.sleep(0.01)
    ActionChains(driver).move_by_offset(i, 0).perform()
ActionChains(driver).release(on_element=slide_button_element).perform()


time.sleep(5)
driver.quit()

来看看最后的效果:

在这里插入图片描述

最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用QDebug类来实现类似于XSHELL的打印输出。QDebug类提供了用于打印调试信息的函数,例如qDebug()、qInfo()、qWarning()和qCritical()。这些函数可以接受多个参数,并会将它们打印到终端或输出到调试器中。 下面是一个例子,演示了如何在Qt中使用QDebug来实现打印输出: ``` #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); qDebug() << "This is a debug message."; qInfo() << "This is an informational message."; qWarning() << "This is a warning message."; qCritical() << "This is a critical message."; return a.exec(); } ``` 以上代码会在终端或调试器中输出不同级别的消息,分别用方括号标识了引用的内容: 根据输入,产生什么输出,你说了算。我只是为了学习下V8,胡乱加了点代码。 onEditFinished()。 #include <QtGui/QtGui> #include "shelldemo.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); ShellDemo w; w.setWindowTitle("Dbzhang800's Qt5 V8-Shell"); w.show(); return a.exec(); } 前两个图,是在Qt5下的结果。(你可以访问V8 初次接触(Qt5)来了解Qt5和V8的关系) 第三个图,是Qt4下编译后的结果(没有V8的参与)。难点? 通过使用QDebug类,你可以在Qt应用程序中实现类似于XSHELL的打印输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [用Qt实现一个简单的shell (Qt5+V8)](https://blog.csdn.net/dbzhang800/article/details/6751775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值