当前位置: 首页 > news >正文

Playwright 自动化验证码教程

Playwright 自动化点击验证码教程

在自动化测试中,Playwright 是一个流行的浏览器自动化工具,支持多种浏览器的高效操作。验证码(如图片验证码、滑动验证码等)是网页中常见的反自动化机制,常常需要特别处理。我们将介绍如何使用 Playwright 自动化点击验证码,并提供几种常见验证码的处理方案。

官方文档链接:

Playwright 官方文档


一、Playwright 环境搭建

1.1 安装 Playwright

首先,需要在项目中安装 Playwright。你可以使用以下命令安装:

pip install playwright
# 初始化 Playwright
playwright install

1.2 启动 Playwright 脚本

Playwright 支持 Python、Node.js 等多种语言。以下是 Python 的一个基础示例,展示如何启动浏览器并访问网页:

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)  # 启动浏览器,headless=False 表示显示浏览器窗口page = browser.new_page()page.goto("https://example.com")  # 打开目标网页browser.close()

解释

  • 使用 playwright.sync_api 提供同步的 API。
  • launch() 启动浏览器,headless=False 用于可见浏览器窗口。
  • goto() 导航到指定的网页。

二、自动化点击验证码

验证码有多种形式,如单击图片验证码、滑动验证码等。在 Playwright 中,处理这些验证码需要一些额外的步骤。

2.1 单击图片验证码

对于要求点击特定图片的验证码,我们可以通过 Playwright 查找图片按钮并模拟点击操作。

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 打开目标网页page.goto("https://example.com")# 等待验证码图片出现,点击验证码图片page.wait_for_selector("#captcha_image")  # 确保验证码图片加载完成page.click("#captcha_image")  # 假设验证码图片的选择器为 #captcha_image# 等待几秒,方便观察点击效果page.wait_for_timeout(3000)browser.close()

解释

  • wait_for_selector() 确保验证码图片元素加载完成。
  • click() 方法可以模拟鼠标点击操作。

2.2 滑动验证码

滑动验证码要求用户拖动滑块到特定位置。我们可以使用 Playwright 的 drag_and_drop() 方法来模拟滑动行为。

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 打开目标网页page.goto("https://example.com")# 等待滑动验证码的出现page.wait_for_selector("#slider")  # 确保滑块加载完成# 获取滑块的元素slider = page.query_selector("#slider")# 执行滑动操作,模拟用户拖动滑块slider.bounding_box()  # 获取滑块的位置和大小page.mouse.move(slider.bounding_box()["x"], slider.bounding_box()["y"])page.mouse.down()page.mouse.move(slider.bounding_box()["x"] + 300, slider.bounding_box()["y"], steps=10)page.mouse.up()# 等待几秒观察滑动结果page.wait_for_timeout(3000)browser.close()

解释

  • bounding_box() 获取滑块的位置与大小,用于确定滑动的起点。
  • mouse.down() 模拟按下鼠标,mouse.move() 模拟滑动,mouse.up() 模拟释放鼠标。

三、处理验证码的常见挑战

3.1 验证码绕过

验证码本质上是为了防止自动化操作,因此绕过验证码可能需要更复杂的策略。常见的解决办法包括:

  1. 使用验证码识别服务:通过 OCR(如 ddddocr)来识别验证码内容。
  2. 滑块验证码破解:通过分析滑动轨迹、AI 模型进行模拟破解。
  3. 手动输入验证码:如果验证码较复杂且识别困难,某些情况下可能需要人工干预,或通过 API 提交验证码。

3.2 使用 OCR 库识别验证码

可以使用 ddddocr 来识别验证码图像并自动填写表单。结合 Playwright 和 ddddocr,你可以自动处理验证码。

import ddddocr
from playwright.sync_api import sync_playwrightocr = ddddocr.DdddOcr()with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 打开目标网页page.goto("https://example.com")# 截图验证码page.wait_for_selector("#captcha_image")page.screenshot(path="captcha.png", selector="#captcha_image")  # 截图保存为 captcha.png# 使用 ddddocr 识别验证码with open('captcha.png', 'rb') as f:img_bytes = f.read()result = ocr.classification(img_bytes)print(f"识别的验证码为: {result}")# 填写验证码page.fill("#captcha_input", result)  # 假设输入框的 ID 为 captcha_input# 点击提交按钮page.click("#submit_button")  # 假设提交按钮的选择器为 #submit_buttonpage.wait_for_timeout(3000)browser.close()

解释

  • 截图验证码并将其保存为 captcha.png
  • 使用 ddddocr 来识别验证码的文本。
  • 自动填写验证码到输入框中并提交表单。

我们将继续扩展之前的教程,增加针对坐标点击验证码的处理。坐标点击验证码通常会要求用户在验证码图片中的特定位置点击,比如点击指定的文字、图形或区域。通过 Playwright,我们可以获取验证码图片的坐标和尺寸,然后通过 mouse.click() 方法来模拟点击指定的坐标位置。


四、处理坐标点击验证码

为了处理坐标点击验证码,我们需要:

  1. 获取验证码图像的尺寸和位置
  2. 确定要点击的坐标(可以是通过OCR识别或者根据其他规则判断)。
  3. 使用 Playwright 的鼠标点击功能,模拟点击验证码图像中的指定位置。

4.1 获取验证码的坐标和尺寸

通过 Playwrightbounding_box() 方法,可以获取验证码图片在页面中的位置和大小,返回值包含 xywidthheight 等信息。

4.2 代码实现:坐标点击验证码

以下代码扩展了前面的示例,展示如何在识别验证码后点击指定的坐标:

import ddddocr
from playwright.sync_api import sync_playwrightocr = ddddocr.DdddOcr()def get_click_coordinates(result, bounding_box):"""根据识别结果和验证码的 bounding_box 确定点击的坐标。假设识别出的字符对应的点击区域是已知的。"""# 这里可以根据识别结果手动设定点击坐标,假设 result 是 "ABC",点击 "A"# 我们假设字符 "A" 需要点击在图像的 1/4 位置,"B" 是 2/4,"C" 是 3/4# 此处根据实际场景和验证码需求来调整if result == "A":x = bounding_box['x'] + bounding_box['width'] * 0.25y = bounding_box['y'] + bounding_box['height'] * 0.5elif result == "B":x = bounding_box['x'] + bounding_box['width'] * 0.5y = bounding_box['y'] + bounding_box['height'] * 0.5elif result == "C":x = bounding_box['x'] + bounding_box['width'] * 0.75y = bounding_box['y'] + bounding_box['height'] * 0.5else:x = bounding_box['x'] + bounding_box['width'] * 0.5  # 默认点击中心y = bounding_box['y'] + bounding_box['height'] * 0.5return x, ywith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 打开网页page.goto("https://example.com")# 等待验证码图片加载page.wait_for_selector("#captcha_image")# 获取验证码的 bounding box 信息 (位置和尺寸)captcha_box = page.locator("#captcha_image").bounding_box()# 截图验证码并保存page.screenshot(path="captcha.png", selector="#captcha_image")# 使用 ddddocr 识别验证码with open('captcha.png', 'rb') as f:img_bytes = f.read()result = ocr.classification(img_bytes)print(f"识别结果: {result}")# 获取需要点击的坐标x, y = get_click_coordinates(result, captcha_box)print(f"将要点击的坐标: ({x}, {y})")# 模拟点击验证码图像的指定坐标page.mouse.click(x, y)# 等待几秒,观察操作page.wait_for_timeout(5000)browser.close()

4.3 代码解读

  1. 获取验证码的坐标信息

    • 我们通过 page.locator("#captcha_image").bounding_box() 获取验证码图片的 bounding_box,包含 xywidthheight 信息。
    • xy 是验证码图像在页面中的起始坐标,widthheight 是图像的宽度和高度。
  2. 确定点击的坐标

    • get_click_coordinates(result, bounding_box) 函数根据 OCR 识别出的结果(假设识别结果是 “A”, “B”, “C” 等字符)来决定点击的精确坐标。
    • 我们假设每个字符对应验证码图像中的不同区域,通过计算 bounding_box 来定位这些区域。例如,如果识别的结果是 “A”,我们点击图像的左边1/4的位置。
  3. 模拟点击

    • 使用 page.mouse.click(x, y) 来模拟点击指定的坐标位置。

五、总结

在这个扩展的教程中,我们学习了如何使用 Playwright 来自动化处理坐标点击验证码。我们首先通过 Playwright 获取验证码图像的坐标和尺寸信息,然后根据识别结果计算需要点击的精确位置,最后通过 mouse.click() 模拟点击验证码图像中的特定坐标。

关键步骤:

  1. 获取验证码的 bounding_box:用于确定图像在页面中的位置和尺寸。
  2. 识别验证码内容:通过 ddddocr 对验证码进行 OCR 识别。
  3. 计算点击坐标:根据 bounding_box 和识别结果计算具体的点击坐标。
  4. 模拟点击操作:使用 Playwrightmouse.click() 实现点击。

这个解决方案可以适应大部分要求点击坐标的验证码场景,进一步增强了自动化脚本在复杂验证码中的能力。如果验证码类型更加复杂,可以引入更多的预处理或自定义坐标计算逻辑。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ansible_find模块
  • 计算机三级 - 数据库技术 - 第十三章 大规模数据库架构 笔记
  • Java面试八股文
  • 一些实用的高阶用法--python
  • OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
  • 监控易监测对象及指标之:全面监控Oracle数据库
  • cartographer从入门到精通(一):cartographer介绍
  • java八股!5(线程创建+并发容器+线程锁)
  • [网络原理]关于网络的基本概念 及 协议
  • 郑州建筑智能化乙级资质申请,人员资质要求详解
  • NLP-文本分类文献阅读-前置基础-词汇解释-通俗易懂-9月份-学习总结
  • 如何将 Electron 项目上架 Apple Store
  • JDBC API详解二
  • 基于SSM和VUE的药品管理系统(含源码+sql+视频导入教程+文档)
  • 解锁全球机遇:澳大利亚服务器租用市场的独特魅力
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 4个实用的微服务测试策略
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular2开发踩坑系列-生产环境编译
  • Linux快速复制或删除大量小文件
  • Logstash 参考指南(目录)
  • MYSQL 的 IF 函数
  • REST架构的思考
  • storm drpc实例
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从零开始学习部署
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对JS继承的一点思考
  • 模型微调
  • 什么是Javascript函数节流?
  • const的用法,特别是用在函数前面与后面的区别
  • HanLP分词命名实体提取详解
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • ## 基础知识
  • #Linux(权限管理)
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #图像处理
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C#)一个最简单的链表类
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Java入门)学生管理系统
  • (web自动化测试+python)1
  • (备份) esp32 GPIO
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (不用互三)AI绘画工具应该如何选择
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (三十五)大数据实战——Superset可视化平台搭建
  • (算法二)滑动窗口
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)Google的Objective-C编码规范