《刚刚问世》系列初窥篇-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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南

文章目录 1. 什么是 DeepSeek R1?a. 主要介绍a. 版本区别 2. 部署资源要求a. 硬件资源要求 3. 本地安装DeepSeek-R1a. 为什么选择本地部署?b. 部署工具对比c. 演示环境配置d. Ollama安装流程 4. 可视化工具a. 工具对比b. Open-WebUI部署 5. AI API应用a.…

学习总结2.14

深搜将题目分配&#xff0c;如果是两个题目&#xff0c;就可以出现左左&#xff0c;左右&#xff0c;右左&#xff0c;右右四种时间分配&#xff0c;再在其中找最小值&#xff0c;即是两脑共同处理的最小值 #include <stdio.h> int s[4]; int sum0; int brain[25][25]; …

Qt Creator 5.0.2 (Community)用久了突然变得很卡

目录 1.现象 2.解决方案 1.现象 很久没有用Qt Creator开发项目了&#xff0c;刚刚结束的项目又是用VS2019开发的&#xff1b;这两天刚好有时间去学习一下Qt&#xff0c;刚好要用Qt Creator&#xff0c;结果一打开就没反应&#xff0c;主界面显示出来要好几分钟&#xff0c;最…

DeepSeek的深度解析:由来、研发过程、公司背景、优势、劣势与总结

DeepSeek的由来 DeepSeek&#xff0c;中文名“深度求索”&#xff0c;是一个在人工智能领域崭露头角的创新项目。其英文名“DeepSeek”由“深思”&#xff08;Deep&#xff09;与“探索”&#xff08;Seek&#xff09;组合而成&#xff0c;寓意着凭借深度学习技术不断探索未知…

初阶c语言(练习题,猜随机数)

前言&#xff1a; 学习c语言&#xff0c;学习来源b站鹏哥&#xff0c;37天吧应该是 内容&#xff1a; 这集内容挺多&#xff0c;源代码放到文章最后 题目是&#xff0c;使用函数编写一个随机数&#xff0c;然后自己猜&#xff0c;猜随机数 这里囊括了很多的知识点&#xf…

w206基于Spring Boot的农商对接系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下载Continue插件 安装 下载中 下载完成后,点击OK 配…

鸿蒙开发:了解@Builder装饰器

前言 本文代码案例基于Api13&#xff0c;温馨提示&#xff1a;内容相对来说比较简单&#xff0c;如果您已掌握&#xff0c;略过即可。 如果说一个页面中组件有很多&#xff0c;我们都统一写到build函数中&#xff0c;显而易见&#xff0c;会导致build函数代码非常冗余&#xff…

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…

Linux进程管理

一、进程查看 1、进程 进程 process 计算机执行任务的最小单位 2、进程查看 ps auxa&#xff1a;all u&#xff1a;user x&#xff1a;所有终端 所有用户所有终端的所有进程 COMMAND&#xff1a; 进程名称 USER&#xff1a; 启动进程的用户&…

(5/100)每日小游戏平台系列

新增一个数字迷宫游戏&#xff01; 数字迷宫游戏是一款基于迷宫探索的益智游戏。玩家从迷宫的起点出发&#xff0c;必须根据迷宫中的数字指示&#xff0c;选择正确的方向&#xff0c;通过迷宫最终到达终点。游戏的目标是尽快找到并到达终点。 游戏规则 起点与终点&#xff1a;…

latex二重闭合积分显示

latex二重闭合积分显示 环境 texlive2024texstdio4.8.6 解决 添加宏包 \usepackage{esint} % 在导言区加载宏包符号 \oiint测试 documentclass[12pt]{article} \usepackage{esint} % 在导言区加载宏包 \title{Hello} \author{Houor}\begin{document}\maketitleHello, \L…

WebP2P+自研回音消除:视频通话SDK嵌入式EasyRTC构建高交互性音视频应用

随着移动互联网时代的到来&#xff0c;手机端的扬声器大多采用外置设计&#xff0c;且音量较大。在这种情况下&#xff0c;扬声器播放的声音更容易被麦克风捕捉&#xff0c;从而导致回声问题显著加剧。这种设计虽然方便用户在免提模式下使用&#xff0c;但也带来了更复杂的音频…

二分查找sql时间盲注,布尔盲注

目录 一&#xff1a;基础知识引导 数据库&#xff1a;information_schema里面记录着数据库的所有元信息 二&#xff0c;布尔盲注&#xff0c;时间盲注 &#xff08;1&#xff09;布尔盲注案例&#xff08;以sqli-labs第八关为例&#xff09;&#xff1a; &#xff08;2&am…

机器学习 - 理论和定理

在机器学习中&#xff0c;有一些非常有名的理论或定理&#xff0c;对理解机器学习的内在特性非常有帮助。本文列出机器学习中常用的理论和定理&#xff0c;并举出对应的举例子加以深化理解&#xff0c;有些理论比较抽象&#xff0c;我们可以先记录下来&#xff0c;慢慢啃&#…

Linux Mem -- ARM8.5-A Memory Tagging Extension

目录 1 介绍 2 威胁模型 3 MTE的内存安全 4 架构细节 5 在ARMv8-A架构&#xff0c;MTE添加了如下指令&#xff0c;可根据策略分为三种&#xff1a; 6 大量部署MTE 7 MTE的硬件层部署 8 MTE的软件层部署 8.1 Heap Tagging 8.2 Stack Tagging 9 MTE优化 近期在深入了解A…

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址&#xff1a;https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次&#xff0c;他将立足于 DeepSeek 技术报告&#xff0c;介绍用于构建推理模型的四种主要方法&#xff0c;也就是…

如何保持 mysql 和 redis 中数据的一致性?PegaDB 给出答案

MySQL 与 Redis 数据保持一致性是一个常见且复杂的问题&#xff0c;一般来说需要结合多种策略来平衡性能与一致性。 传统的解决策略是先读缓存&#xff0c;未命中则读数据库并回填缓存&#xff0c;但方式这种维护成本较高。 随着云数据库技术的发展&#xff0c;目前国内云厂商…

Vue 入门到实战 十

第10章 Vue Router​​​​​​​ 目录 10.1 什么是路由 10.2 Vue Router的安装 10.2.1 本地独立版本方法 10.2.2 CDN方法 10.2.3 NPM方法 10.2.4 命令行工具&#xff08;Vue CLI&#xff09;方法 10.3 Vue Router的基本用法 10.3.1 跳转与传参 10.3.2 配置路由 10.…

Java并发中的CAS机制:原理、应用与挑战(通俗易懂版)

上一期文章内容&#xff1a;Java并发中的乐观锁与悲观锁&#xff0c; 本期文章我们来讲一下Java并发中的CAS机制 一、从银行账户案例理解CAS CAS 是一种乐观锁机制&#xff0c;用于在不使用锁的情况下实现多线程对共享资源的并发访问。 它包含三个操作数&#xff1a;内存位置&a…