java+selenium(资源全备,打开已使用浏览器信息,保留用户信息)

java+selenium(资源全备,打开已使用浏览器信息,保留用户信息)

一、介绍

我的代码可以实现以下效果:

保留用户信息,好处:可以在登录好一个账号后还保留原来的token验证信息

使用java+selenium实现爬取vue元素内容,获取里面的视频,图片信息等

我使用的jdk是17版本,你们如果用自己版本不行就使用我一样版本的jdk再试试

二、准备

1.坐标
            <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency>
2.下载Chrome及驱动
–下载地址

Chrome for Testing availability

–注意事项

在这个网址里面包含了,驱动以及浏览器下载

你选一个喜欢的版本下载就是了,注意下载两个东西

chrome,chromedriver,下载时注意电脑是32,还是64位

如果你的电脑包含了chrome,那你打开右上角三个点,选择帮助,选择关于浏览器,然后就能看到电脑浏览器的版本以及位数

你就下载对应的chromedriver就行了

–旧版本地址

版本在114及以下:http://chromedriver.storage.googleapis.com/index.html

三、代码

1.测试

下载后将驱动的存放地址放进来,运行后打开了浏览器,就代表成功了

package com.ruoyi.catai;import org.openqa.selenium.chrome.ChromeDriver;public class VueScraper {public static void main(String[] args) {// 设置ChromeDriver路径System.setProperty("webdriver.chrome.driver", "E:\\Project\\b-dimension\\b-dimension\\b-dimension\\b-fictiontweet\\src\\main\\java\\com\\ruoyi\\catai\\chromedriver-win64\\chromedriver.exe");//打开浏览器ChromeDriver chromeDriver=new ChromeDriver();//访问百度chromeDriver.get("http://www.baidu.com");}
}
2.方法
–8个方法

findElement(By.id())
findElement(By.name())
findElement(By.className())
findElement(By.tagName())
findElement(By.linkText())
findElement(By.partialLinkText())
findElement(By.xpath())
findElement(By.cssSelector())

–使用案例

​ 这是一个模拟登录的使用案例,还提供怎么获取多个元素集合

​ []这个是用于属性的等值匹配的

 // 使用CSS选择器定位class为el-input__inner且type为text的元素WebElement usernameInput = driver.findElement(By.cssSelector(".el-input__inner[type='text']"));// 输入用户名usernameInput.sendKeys("xxx");            // 定位用户名输入框,需要根据实际页面元素的 ID、name、class 等属性进行调整// 定位密码输入框,同样需要根据实际页面元素进行调整//WebElement passwordInput = driver.findElement(By.id("password"));WebElement passwordInput = driver.findElement(By.cssSelector(".el-input__inner[type='password']"));// 输入密码passwordInput.sendKeys("xxx");// 定位登录按钮,根据实际页面元素进行调整WebElement loginButton = driver.findElement(By.cssSelector(".el-button[type='button']"));// 点击登录按钮loginButton.click();// 等待登录完成,可以根据实际情况调整等待时间Thread.sleep(10000);*///driver.get("https://aigcbus.com/home/drawing");List<WebElement> mebox = driver.findElements(By.cssSelector(".message_box"));System.out.println(mebox.size());

四、优化

1.保留用户信息

上面的代码每次都是打开新的浏览器,之前的使用记录也没有,非常麻烦

我就通过保存浏览器的信息到本地文件夹,每次打开就读取对应用户信息

package com.ruoyi.catai;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class VueScraper {public static void main(String[] args) {WebDriver driver = null;try {//杀死占用该端口的进程,避免之前打开后的残留进程影响程序closeProcess("9222");Thread.sleep(1000);//运行浏览器在9222端口,指定保存和读取用户信息的文件夹String fullCommand = "cmd /c \"C: && cd /d C:\\Program Files\\Google\\Chrome\\Application && chrome.exe --remote-debugging-port=9222 --user-data-dir=\"D:\\chrome_temp\"\"";// 合并命令Runtime.getRuntime().exec(fullCommand);// 不等待 Chrome 进程结束,让 Java 程序继续执行// int exitCode = process.waitFor();// if (exitCode != 0) {//     throw new RuntimeException("命令执行失败,退出码: " + exitCode);// }System.out.println("Chrome 浏览器已启动");// 设置 ChromeDriver 的路径System.setProperty("webdriver.chrome.driver", "E:\\Project\\b-dimension\\b-dimension\\b-dimension\\b-fictiontweet\\src\\main\\java\\com\\ruoyi\\catai\\chromedriver-win64\\chromedriver.exe");// 创建 ChromeOptions 对象,可用于设置浏览器选项ChromeOptions options = new ChromeOptions();//设置自动化工具打开的浏览器地址,为本机9222端口的浏览器options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");// 禁用一些不必要的浏览器功能,提高性能options.addArguments("--disable-gpu","--no-sandbox");// 创建 ChromeDriver 实例driver = new ChromeDriver(options);// 打开目标网页driver.get("https://www.baidu.com");// 等待页面加载完成,可以根据实际情况调整等待时间Thread.sleep(5000);/*// 使用CSS选择器定位class为el-input__inner且type为text的元素WebElement usernameInput = driver.findElement(By.cssSelector(".el-input__inner[type='text']"));// 输入用户名usernameInput.sendKeys("xxx");            // 定位用户名输入框,需要根据实际页面元素的 ID、name、class 等属性进行调整// 定位密码输入框,同样需要根据实际页面元素进行调整//WebElement passwordInput = driver.findElement(By.id("password"));WebElement passwordInput = driver.findElement(By.cssSelector(".el-input__inner[type='password']"));// 输入密码passwordInput.sendKeys("xxx");// 定位登录按钮,根据实际页面元素进行调整WebElement loginButton = driver.findElement(By.cssSelector(".el-button[type='button']"));// 点击登录按钮loginButton.click();// 等待登录完成,可以根据实际情况调整等待时间Thread.sleep(10000);*///driver.get("https://aigcbus.com/home/drawing");List<WebElement> mebox = driver.findElements(By.cssSelector(".message_box"));System.out.println(mebox.size());// 使用findElements获取所有匹配的图片元素List<WebElement> imgList = driver.findElements(By.cssSelector(".el-image__inner[style='object-fit: cover;']"));//WebElement imgList = driver.findElement(By.cssSelector(".el-image__inner[style='object-fit: cover;']"));imgList.forEach(img -> {// 获取图片的src属性String src = img.getAttribute("src");System.out.println("图片地址:" + src);});} catch (Exception e) {e.printStackTrace();} finally {// 关闭浏览器driver.quit();}}/*public static void killProcessOnPort(int port) throws IOException, InterruptedException {// 查找占用指定端口的进程 IDString command = "netstat -ano | findstr :"+ port;Process process = Runtime.getRuntime().exec(command);BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {if (line.contains("LISTENING")) {// 提取 PIDString[] parts = line.trim().split("\\s+");String pid = parts[parts.length - 1];// 杀死进程String killCommand = "taskkill /F /PID " + pid;Process killProcess = Runtime.getRuntime().exec(killCommand);int exitCode = killProcess.waitFor();if (exitCode == 0) {System.out.println("成功杀死占用端口 " + port + " 的进程,PID: " + pid);} else {System.out.println("杀死占用端口 " + port + " 的进程失败,PID: " + pid);}}}reader.close();}*/public static void closeProcess(String port){String command = "netstat -ano | findstr :" + port;try {// 执行命令Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", command});// 获取命令完成后输出BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;//匹配pid内容规则Pattern pattern = Pattern.compile("\\s+(\\d+)$");//接收PID集合HashSet<String> set = new HashSet();while ((line = reader.readLine()) != null) {Matcher matcher = pattern.matcher(line);if (matcher.find()) {// 提取并打印PIDString pid = matcher.group(1);set.add(pid);}}//遍历关闭对应pidset.forEach(s-> {try {System.out.println("pid:"+s);Process process1 = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "taskkill","/PID",s,"/F"});} catch (IOException e) {throw new RuntimeException(e);}});// 等待进程结束process.waitFor();reader.close();} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}
2.总结

通过Java执行cmd命令打开谷歌浏览器,并指定保存用户信息的路径,也是读取用户信息的路径

自动化工具进入打开的这个谷歌浏览器,就能够实现,保留之前的登录信息了,无需再输入密码

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

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

相关文章

小白闯AI:Llama模型Lora中文微调实战

文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…

Linux基础开发工具——gdb/cgdb(7)

文章目录 前言一、生成可调试文件二、调试打开与关闭启动调试l 查看代码退出调试运行与断点单行与单步 三、查看变量bt 查看调用堆栈p 临时查看变量display 常显示变量 四、快速跳转until 指定行finish 函数c 断点 五、其他指令disable 断点使能set var 设置条件ptype 查看变量…

Python 3.13.2安装教程(安装包)Python 3.13.2 快速安装指南

文章目录 前言一 、Python 3.13.2下载二、Python 3.13.2安装教程1.运行安装程序2.选择安装方式3.自定义安装选项4.开始安装5.安装完成6.打开程序7.验证安装 前言 Python 作为一门通用编程语言&#xff0c;在全球拥有庞大的用户群体。其简洁易读的语法和丰富的库&#xff0c;使…

游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】

游戏MOD&#xff08;即游戏修改器&#xff09;是一种能够对游戏进行修改或增强的程序&#xff0c;因其能够提升游戏体验&#xff0c;在玩家群体中拥有一定的市场。然而&#xff0c;这类程序大多由第三方开发者制作&#xff0c;容易缺乏完善的安全保障机制&#xff0c;这就为不法…

【读点论文】Chain Replication for Supporting High Throughput and Availability

在分布式系统中&#xff0c;强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库&#xff0c;其保证了强一致性&#xff0c;但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库&#xff0c;虽然其吞吐量、和扩展性很高&#xff0c;但往往只支持最终一致性&#xff0c;无…

新书速览|云原生Kubernetes自动化运维实践

《云原生Kubernetes自动化运维实践》 本书内容&#xff1a; 《云原生Kubernetes自动化运维实践》以一名大型企业集群运维工程师的实战经验为基础&#xff0c;全面系统地阐述Kubernetes&#xff08;K8s&#xff09;在自动化运维领域的技术应用。《云原生Kubernetes自动化运维实践…

Linux驱动学习笔记(六)

平台总线 1.平台总线模型也叫platform总线模型&#xff0c;平台总线是Linux系统虚拟出来的总线, 引入总线的概念可以对驱动代码和设备信息进行分离。平台总线模型将一个驱动分成了两个部分&#xff1a;platform_device和platform_driver&#xff0c;例如可使用文件device.c和d…

高频GNSS同震形变计算方法

高频GNSS&#xff08;通常采样率为 1Hz-50Hz&#xff09;可以提供高时间分辨率的地震形变信息&#xff0c;计算同震形变&#xff08;coseismic displacement&#xff09;的方法主要包括 趋势线法 和 基线法。

从简单探测到业务模拟:IT监控如何突破传统监控边界

探测是一种用于主动检测和评估IT系统、网络设备、应用服务等目标对象运行状态和性能指标的技术手段。它通过模拟用户操作、发送测试信号或执行特定的检查任务&#xff0c;实时获取目标对象的响应情况和相关数据&#xff0c;从而帮助运维人员及时发现潜在问题、评估系统健康状况…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…

【sgAutocomplete_v2】自定义组件:基于elementUI的el-input组件开发的搜索输入框(支持本地保存历史搜索关键词、后台获取匹配项)

特性&#xff1a; 支持本地记录搜索关键词后台接口匹配搜索关键词支持自定义填充字段名支持user或address两种匹配列表布局样式 sgAutocomplete_v2 <template><div :class"$options.name" mouseover"inside true" mouseout"inside false…

算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)

文章目录 前言一、背包问题溯源&#xff08;动态规划&#xff09;1.1 动态规划的概念1.2 动态规划的基本步骤1.3 动态规划的实际应用 二、背包问题2.1 背包问题衍生2.2 0-1背包2.2.1 0-1背包描述2.2.2 0-1背包图解2.2.3 0-1背包代码刨析 2.3 完全背包2.3.1 完全背包描述2.3.2 完…

数据库原理及应用mysql版陈业斌实验一

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验一&#xff1a;数据库与数据表的定义和数据操作 1.实验数据如下 …

腾讯云创建DeepSeek AI应用及使用教程

文章目录 腾讯云大模型知识引擎创建 DeepSeek 应用文档一、前期准备二、创建应用1. 进入应用管理界面2. 应用配置3. 发布应用 三、管理应用四、测试应用五、API接入应用API接入文档详细链接HTTP 对话端接口文档WebSocket对话端接口文档 六、常见问题七、注意事项 腾讯云大模型知…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

Linux上位机开发实战(camera视频读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于linux camera&#xff0c;一般都是认为是mipi camera&#xff0c;或者是usb camera。当然不管是哪一种&#xff0c;底层的逻辑都是v4l2&#x…

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比

Elasticsearch零基础入门:从安装到入门

目录 一、Elasticsearch简介 二、环境快速搭建 1. 单节点本地部署&#xff08;Docker版&#xff09; 2. 验证安装 三、核心概念图解 与传统数据库对比 架构概念说明 四、REST API基础操作 1. 索引管理 2. 文档CRUD操作 五、基础搜索实战 1. 全文搜索 2. 精确匹配 …