《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)
拉票
亲爱的小伙伴们或者童鞋们,喜欢宏哥文章的,请动动你们发财小手,给我投投票票 。
祝2025小伙伴们工作顺利,家庭和睦,心想事成,财源滚滚!
我的票还有7票,互票的朋友私信给我。
投票链接:https://www.csdn.net/blogstar2024/detail/296
1.简介
跟随宏哥学习的小伙伴或者童鞋们想必已经在宏哥Python+Playwright系列文章中知道宏哥如何处理前边文章中提到的反爬虫机制。今天跟随宏哥看一下java语言是如何处理的,已经按照之前的处理方式是否可以成功的处理呢?那么接下来就随宏哥一步步来探索这个未知之谜。好了废话不说,直接进入今天的主题。
2.启动浏览器的模式
宏哥按照自己的理解将其分为两种启动模式,一种是:无痕模式启动浏览器,另一种是:非无痕模式启动浏览器。
playwright 提供了launchPersistentContext启动浏览器的方法,可以非无痕模式启动浏览器。
无痕模式启动浏览器适合做自动化测试的人员。
非无痕模式启动浏览器适合一些爬虫用户人员。
2.1launchPersistentContext
官方API的文档地址:浏览器类型 |Playwright Java
返回持久性浏览器上下文实例。
启动使用位于 userDataDir 的持久性存储的浏览器,并返回唯一的上下文。关闭此上下文将自动关闭浏览器。
2.2无痕模式启动浏览器
1.launch()方法是无痕模式启动浏览器。
参考代码如下:
package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)** 2024年02月14日*/
public class Test_Drag {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));BrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//浏览器打开百度page.navigate("https://www.cnblogs.com/du-hong");//关闭pagepage.close();//关闭browserbrowser.close();}}
}
2.无痕模式启动浏览器,会在浏览器右上角出现“无痕模式”,如下图所示:
2.3非无痕模式启动浏览器
1.如果网站被反爬虫机制识别或者被监测无痕模式不能使用,那么可以用launchPersistentContext()方法进行非无痕(有痕迹)模式启动浏览器。
相关参数说明:
- userDataDir : 用户数据目录,此参数是必须的,可以自定义一个目录
- setAcceptDownloads: 接收下载事件
- setHeadless: 是否设置无头模式
- setChannel: 指定浏览器类型,默认chromium
参考代码如下:
package com.bjhg.playwright;import java.io.File;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)** 2025年02月14日*/
public class Test_Dialog {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {BrowserType.LaunchPersistentContextOptions launch=new BrowserType.LaunchPersistentContextOptions(); launch.setViewportSize(1920,1080);launch.setAcceptDownloads(true);launch.setChannel("chrome");launch.setHeadless(false);launch.setSlowMo(3000); BrowserContext browserContext = playwright.chromium().launchPersistentContext(new File("C:\\Users\\Administrator\\Desktop\\test").toPath(),launch); Page page = browserContext.newPage(); page.navigate("https://www.baidu.com");System.out.println("Test Pass");//关闭pagepage.close();//关闭browserbrowserContext.close();}}
}
2.宏哥发现以上代码运行后,会多出一个空白页。如下图所示:
3.进入launchPersistentContext()方法,发现是因为使用launchPersistentContext()方法会自动打开一个tab标签页,后面代码browserContext.newPage()重新打开了一个新的page对象。所以才会多一个空白页。
解决办法很简单,去掉browserContext.newPage()代码即可。直接用默认打开发tab标签页对象。
参考代码如下:
package com.bjhg.playwright;import java.io.File;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)** 2025年02月14日*/
public class Test_Dialog {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {BrowserType.LaunchPersistentContextOptions launch=new BrowserType.LaunchPersistentContextOptions(); launch.setViewportSize(1920,1080);launch.setAcceptDownloads(true);launch.setChannel("chrome");launch.setHeadless(false);launch.setSlowMo(3000); BrowserContext browserContext = playwright.chromium().launchPersistentContext(new File("C:\\Users\\Administrator\\Desktop\\test").toPath(),launch); // Page page = browserContext.newPage(); Page page = browserContext.pages().get(0);page.navigate("https://www.baidu.com");System.out.println("Test Pass");//关闭pagepage.close();//关闭browserbrowserContext.close();}}
}
运行代码如下(可以清楚地看到没有 新增的空白页面了):
3.项目实战
这里宏哥还用之前的那个实例进行演示,也就是在文章最后提到反爬虫的那篇文章的例子:携程旅行,注册页面的一个滑动,进行项目实战。如下图所示:
3.1代码设计
参考前边提到的方法进行代码设计如下:
3.2参考代码
package com.bjhg.playwright;import java.io.File;import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)** 2025年02月14日*/
public class Test_Dialog {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {BrowserType.LaunchPersistentContextOptions launch=new BrowserType.LaunchPersistentContextOptions(); launch.setViewportSize(1920,1080);launch.setAcceptDownloads(true);launch.setChannel("chrome");launch.setHeadless(false);launch.setSlowMo(5000); launch.setBypassCSP(true);BrowserContext browserContext = playwright.chromium().launchPersistentContext(new File("C:\\Users\\Administrator\\Desktop\\test").toPath(),launch); // Page page = browserContext.newPage(); Page page = browserContext.pages().get(0);//3.浏览器访问demopage.navigate("https://passport.ctrip.com/user/reg/home");page.locator("//*[@id='agr_pop']/div[3]/a[2]").click();//4.开始拖拽//获取拖动按钮位置并拖动Locator slider = page.locator("//*[@id='slideCode']/div[1]/div[2]");// 使用鼠标滑动滑块page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 2, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().down();// 根据滑动的范围,这里使用滑动最大距离page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 0.5+380, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().up();//断点调试page.pause();System.out.println("Test Pass");//关闭pagepage.close();//关闭browserbrowserContext.close();}}
}
3.3运行代码
1.运行代码,右键Run As->Java Application,就可以看到控制台输出,如下图所示:
2.运行代码后电脑端的浏览器的动作((可以清楚地的看到滑动后,又出现了反爬虫机制,又弹出选字校验))。如下图所示:
4.小结
宏哥在实践的过程中,发现无论手动还是利用上边的代码进行自动化测试都会出现那个反爬虫的机制弹出,因此宏哥怀疑最可能的问题就是由于宏哥近期频繁访问演示,可能被反爬虫的机制判断后,进行了IP锁定,因此会出现这种情况,因为宏哥在第一次进行手动滑动验证的时候,就没有出现。所以宏哥怀疑是被锁定了。一开始宏哥以为是缓冲的问题,宏哥清除浏览器缓冲和历史记录,然后重启电脑最后结果仍然是一样。所以宏哥怀疑被网站的反爬虫锁定IP,最后经过Python和Java的这部分实践,宏哥觉得这种有痕迹的启动模式其实是说白了,就是启动本地安装的浏览器进行自动化测试,而非我们一开始搭建环境时下载的浏览器。因为宏哥在执行代码的过程中报了一个无法找到本地安装chrome的可执行文件的路劲的错误,将其安装文件拷贝到此路径下,代码运行正常没有报错。宏哥也查了各种反爬虫机制的资料,进行验证和实践,折腾了半天还是没有解决这个问题,也不知道python和java语言的有什么区别了,还是因为被锁定,有点懵。但是宏哥回过头来又用Python语言的处理方法试了一下这个注册页面,仍然可以成功处理,看来不是锁定的问题。但是其不是很稳定啊,后边在运行代码也会弹出选字校验。各位有什么好办法可以留言给宏哥,抱歉了没有帮到大家!
4.1实战过程中遇到的坑及解决办法
1.坑一:报错 message='Chromium distribution 'chrome' is not found at C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe ,如下图所示:
解决办法:找到chrome安装路径,将安装文件全部拷贝到代码中报错的路径下即可,如下图所示:
2.坑二:报错类似这样 navigating to "https://passport.ctrip.com/user/reg/home", waiting until "load"。如下图所示:
解决办法:将launch.setSlowMo(50);的时间加长即可。
4.2部分参数详细说明
1.launchPersistentContext创建的浏览器对象,为什么无法使用browser.newContext()创建上下文?
因为launchPersistentContext字面上意思就已经是一个context上下文对象了,所以无法创建上下文,只能创建page对象。
2.userDataDir路径参数的作用什么?
userDataDir是指定浏览器启动的用户数据缓存目录,当指定一个新的目录时,启动浏览器会发现自动生成缓存文件。打开C:\Users\\DELL\Desktop\Chrome\test目录会看到加载的浏览器缓存文件。如下图所示:
3.userDataDir能不能记住用户登录的状态?
userDataDir就是你自己定义的打开浏览器保存的用户数据,包含了用户的cookies,所以你只要登录过,就会自动保存。
所以你只要代码打开网站,如果不能通过代码自动登录(可能有一些验证码什么的),你可以断点后手工去登录一次,也会记住cookies。下次代码再打开就不需要登录了。
4.为什么按你的教程,我这个网站就无法保持登录?
能不能保持登录状态,主要看你网站的cookies有效期,有些网站关闭浏览器后就失效了,比如一些银行的网站,你只要关闭浏览器窗口,下次就需要再次登录。
简单来说一句话:你手工去操作一次,关闭浏览器,再打开还要不要登录,如果关闭浏览器需要再次登录,那代码也没法做到保持登录。
有些博客网站,你登录一次,cookies几个月都有效,这种就可以利用缓存的cookies保持登录。
5.为什么网上其他教程userDataDir写chrome的安装目录?
其实没必要非要写chrome的安装目录"C:\Users\{getpass.getuser()}\AppData\Local\Google\Chrome\UserData"。
如果你写的是系统默认安装目录的用户数据,那你本地浏览器打开后,执行代码就会报错。所以不推荐!
6.默认启动的是chromium浏览器,能不能换成其他的浏览器?
可以通过"channel"参数指定浏览器,可以支持chromium系列:chromium、chrome、chrome-beta、msedge。
相关文章:

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)
拉票 亲爱的小伙伴们或者童鞋们,喜欢宏哥文章的,请动动你们发财小手,给我投投票票 。 祝2025小伙伴们工作顺利,家庭和睦,心想事成,财源滚滚! 我的票还有7票,互票的朋友私信给我。 投…...
Netty源码解析之异步处理(二):盛赞Promise中的集合设计
前言 在阅读Netty源码的过程中,我越来越相信一句话:“Netty的源码非常好,质量极高,是Java中质量最高的开源项目之一”。如果认真研究,会有一种遍地黄金的感觉。 本篇文件我将记录一下鄙人在Promise的实现类DefaultPr…...

NetworkX布局算法:nx.spring_layout
诸神缄默不语-个人CSDN博文目录 官方文档:https://networkx.org/documentation/stable/reference/generated/networkx.drawing.layout.spring_layout.html 和nx.fruchterman_reingold_layout()等价。 这个函数主要是为了在可视化NetworkX图时设置节点分布布局的&…...

Navicat导入海量Excel数据到数据库(简易介绍)
目录 前言正文 前言 此处主要作为科普帖进行记录 原先Java处理海量数据的导入时,由于接口超时,数据处理不过来,后续转为Navicat Navicat 是一款功能强大的数据库管理工具,支持多种数据库系统(如 MySQL、PostgreSQL、…...
LeetCodehot100 力扣热题100 二叉树展开为链表
代码思路 目标: 将二叉树展平(flatten)为一个单链表。展平后的链表应该按照前序遍历的顺序排列节点,即: • 节点的左子树指针设置为 nullptr。 • 节点的右子树指针指向下一个节点。 代码注释及思路 class Solution…...

2.14学习总结
#include <stdio.h> #include <stdlib.h> #include <math.h>#define MAX_N 32767// 二分查找最接近目标值的元素 int binarySearch(int* arr, int left, int right, int target) {while (left < right) {int mid left (right - left) / 2;if (arr[mid] …...

在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程
既然我们已经在本地部署了DeepSeek,肯定希望能够利用本地的模型对自己软件开发、办公文档进行优化使用,接下来就先在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档的教程奉上。 前提: (1)已经部署好了DeepSeek,可以看我的文章:个人windows电脑上安装DeepSe…...
zola + github page,用 workflows 部署
之前的Zola都是本地build之后,再push到github上,这种方式很明显的弊端就是只能在本地编辑,而不能通过github编辑,再pull到本地,缺乏了灵活性。因此将zola用workflows来部署。 repo地址:https://github.com/…...
【科技革命】颠覆性力量与社会伦理的再平衡
目录 2025年科技革命:颠覆性力量与社会伦理的再平衡目录技术突破全景图认知智能的范式转移量子霸权实现路径生物编程技术革命能源结构重构工程 产业生态链重构医疗健康新范式教育系统智能进化金融基础设施变革制造范式革命 科技伦理与文明演进 2025年科技革命&#…...

UIView 与 CALayer 的联系和区别
今天说一下UIView 与 CALayer 一、UIView 和 CALayer 的关系 在 iOS 开发中,UIView 是用户界面的基础,它负责处理用户交互和绘制内容,而 CALayer 是 UIView 内部用于显示内容的核心图层(Layer)。每个 UIView 内部都有…...

Jenkins 新建配置 Freestyle project 任务 六
Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description:任务描述 勾选 Discard old builds Discard old builds:控制何时…...
深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现
1. A2DP概述 A2DP(Advanced Audio Distribution Profile)是一种高质量音频流媒体协议,旨在实现高质量音频内容的分发,通常用于通过蓝牙设备传输音频数据,例如将音乐从便携式播放器传输到耳机或扬声器。与传统的蓝牙语…...

mybatis-plus逆向code generator pgsql实践
mybatis-plus逆向code generator pgsql实践 环境准备重要工具的版本供参考pom依赖待逆向的SQL 配置文件CodeGenerator配置类配置类说明 环境准备 重要工具的版本 jdk1.8.0_131springboot 2.7.6mybatis-plus 3.5.7pgsql 14.15 供参考pom依赖 <?xml version"1.0&quo…...
Android Studio:RxBus结合ICompositeSubscription使用
我现在想用 RxBus 来发布和订阅事件,同时使用 ICompositeSubscription 来管理订阅。跟前一个博客的区别在于,事件流的产生方式不同,更加得全面。 目标 使用 RxBus 发布事件。使用 ICompositeSubscription 来管理订阅。在 Activity 中创建订…...

微软AutoGen高级功能——Magentic-One
介绍 大家好,博主又来给大家分享知识了,这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢,我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统,用于…...

redis cluster测试
集群节点信息这时候停掉一个master 172.30.60.31 从集群信息集中我们可以看到172.30.60.31的slave是172.30.60.41,查看41的日志,发现他成为了新的master 这时候我们在将172.30.60.41也杀死,会发现集群异常了 尝试把172.30.60.31启动ÿ…...

【ARM】JTAG接口介绍
1、 文档目标 对 JTAG 接口有更多的认识,在遇到关于 JTAG 接口问题时有一些排查的思路。 2、 问题场景 在使用调试器过程时,免不了要接触到 JTAG 接口,当出现连接不上时,就不知道从哪来进行排查。 3、软硬件环境 1 软件版本&am…...

处理项目中存在多个版本的jsqlparser依赖
异常提示 Correct the classpath of your application so that it contains a single, compatible version of net.sf.jsqlparser.statement.select.SelectExpressionIte实际问题 原因:项目中同时使用了 mybatis-plus 和 pagehelper,两者都用到了 jsqlpa…...

部署 DeepSeek R1各个版本所需硬件配置清单
DeepSeek-R1 通过其卓越的推理性能和灵活的训练机制,在 2025 年的春节期间受到了广泛关注。 DeepSeek-R1 是一款高性能的 AI 推理模型,主要通过强化学习技术来增强模型在复杂任务场景下的推理能力。 在本地部署 DeepSeek-R1 时,尤其是完整的…...

数据结构:Map Set(一)
目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 (1)纯key模型 (2)Key-Value模型 三、Map的使用 1、什么是Map? 2、Map的常用方法 (1)V put(K …...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...