Java+selenium+chrome+linux/windows实现数据获取

news2024/9/19 14:18:30

背景:在进行业务数据获取或者自动化测试时,通常会使用模拟chrome方式启动页面,然后获取页面的数据。在本地可以使用windows的chromedriver.exe进行打开chrome页面、点击等操作。在linux 下通常使用无界面无弹窗的方式进行操作。接下来是实现方案。

代码层面:

关键工具类:ChromeDriverUtil
public class ChromeDriverUtil {
    public WebDriver getWebDriver() {
        ChromeOptions options = new ChromeOptions();
        String driverPath = ChromeDriverUtil.getDriverPath(options);
        System.setProperty("webdriver.chrome.driver", driverPath);
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 设置最长等待时间
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        return driver;
    }

    public static String getDriverPath(ChromeOptions options) {
        String driverPath = "";
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("win")) {
            driverPath = "chromedriver-win64/chromedriver.exe";
        } else if (os.contains("nix") || os.contains("nux")) {
            driverPath = "chromedriver-linux64/chromedriver";
            // 设置无界面模式
            options.addArguments("--headless");
            options.addArguments("--no-sandbox");
            log.info("————————————————————————————————linux开启无界面模式设置————————————————————————————————");
        } else {
            throw new RuntimeException("Unsupported operating system: " + os);
        }
        return driverPath;
    }

    public static int getSleepRandom() {
        Random random = new Random();

        // Define the lower and upper bounds
        int lowerBound = 6000;
        int upperBound = 8000;

        // Generate a random integer between lowerBound and upperBound (inclusive)
        return random.nextInt(upperBound - lowerBound + 1) + lowerBound;
    }

    public static String extractDate(String url) {
        // 正则表达式匹配 announcementTime 参数
        Pattern pattern = Pattern.compile("announcementTime=(\\d{4}-\\d{2}-\\d{2})");
        Matcher matcher = pattern.matcher(url);

        // 查找匹配项并返回日期
        if (matcher.find()) {
            return matcher.group(1); // 获取第一个捕获组,即日期部分
        }
        return null; // 如果没有匹配项,则返回 null
    }


    // 等待一定时间
    public static void sleep(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 判断某个元素是否存在


    public static double parseDoubleStr(String doublestr) {
        if (doublestr.equals("-")) {
            return 0.0;
        } else {
            return Double.parseDouble(doublestr.replaceAll(",", ""));
        }
    }

    public static long parseLongStr(String longstr) {
        // System.out.println("longstr=" + longstr);
        int flag = 1;
        if (longstr.contains("-1")) {
            flag = -1;
        }
        longstr = longstr.replaceAll("-", "");
        longstr = longstr.replaceAll(",", "");
        // 如果有小数点
        if (longstr.contains(".")) {
            longstr = longstr.replaceAll("\\.", "");
            return Long.parseLong(longstr) * 100 * flag;
        } else { // 没有小数点
            return Long.parseLong(longstr) * 10000 * flag;
        }
    }


    // 关闭当前窗口
    public static void closeWindow(WebDriver driver) {
        // 获取所有句柄的集合
        List<String> winHandles = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(winHandles.get(0));
        driver.close();
        log.info("————————————————————————————————页面关闭————————————————————————————————");
    }
}

使用使用时:

public class Demo{

   public static void main(String[] args) throws IOException, InterruptedException {
        WebDriver driver = new ChromeDriverUtil().getWebDriver();
        String SEARCH_URL="XXXX";
        driver.get(SEARCH_URL);
        log.info("开始获取页面数据!!!---------------" + driver.getCurrentUrl());
        //todo 处理过程

        ChromeDriverUtil.closeWindow(driver);
    }


}

windows环境:

windows环境下在src目录平级下增加驱动文件夹chromedriver-win64,即可直接使用。本项目所使用的包chromedriver-win64.zip

linux环境:

linux环境需要在linux下载chrome、chrome驱动。

chrome下载(我用的是124版本):

//创建目录
mkdir chrome

//下载rpm
wget http://dist.control.lth.se/public/CentOS-7/x86_64/google.x86_64/google-chrome-stable-124.0.6367.118-1.x86_64.rpm

//install 
yum install google-chrome-stable-124.0.6367.118-1.x86_64.rpm 

//查看版本
google-chrome --version

看到版本后就是下载成功了

接下来就是下载驱动,可自己从Chrome for Testing availability获取。我是用的是

https://storage.googleapis.com/chrome-for-testing-public/125.0.6422.4/linux64/chromedriver-linux64.zip

然后将这个文件夹解压后,放在与jar平级目录。(这个要根据自己的项目放置,或者直接用绝对路径)

还需要给chromedriver-linux64文件夹下的chromedriver赋权限,

chmod +x chromedriver

然后就可以使用了。

遇到的问题:

1. linux安装chrome的时候报错软件包:google-chrome-stable-128.0.6613.119-1.x86_64 (/google-chrome-stable_current_x86_64)           需要:libc.so.6(GLIBC_2.25)(64bit)

解决:应该是chrome版本与centos7版本不匹配,后面我下载了124版本的就可以了。

2. 报错session not created: DevToolsActivePort file doesn't exist

解决:这个应该是没有弄好chrome和chromedriver版本的问题,如果使用的是我用的124版本就是用我提供的driver就行了。

3. 运行报错The process started from chrome location /opt/google/chrome/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed

解决:大概的意思就是没有启动成功,打开浏览器失败了,因为是linux,所以不需要弹窗启动浏览器,所以需要增加设置使用无弹窗方式启动。所以在ChromeDriverUtil中对Linux环境做了设置增加参数。

options.addArguments("--headless");
options.addArguments("--no-sandbox");

然后就可以正常运行了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI绘画】Midjourney之Lighting详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;为什么要学习光影控制光影控制的作用 &#x1f4af;强化主题hard lighting&#xff08;硬光 &#xff09;soft lighting&#xff08;软光/柔光&#xff09;测试 &…

宠物浮毛怎么办,用专业工具——希喂、小米、美的宠物空气净化器

前段时间被医生科普&#xff0c;原来猫咪的毛发也分好几种的&#xff0c;我不是最后一个知道的吧...事情的起因是这样的&#xff0c;上次我去朋友家和她的猫咪玩&#xff0c;实在太可爱了所以自己也养了一只猫。一人一猫的幸福生活没过多久&#xff0c;我就发现自己的鼻炎好像复…

如何用AI先行者2.0轻松画出美图?我的亲身体验分享给你看!

越来越多的AI绘画工具开始出现在市场上。AI先行者2.0是一款备受关注的AI绘画软件。本文将为大家详细介绍这款软件的功能特点&#xff0c;并分享一些使用心得。 AI先行者2.0拥有强大的图像处理能力。 它支持多种AI模型&#xff0c;包括Midjourney、Niji、DallE3和Stable Diffu…

【C++】——string类的使用

目录 一.为什么学习string类&#xff1f; 1.1 C语言的字符串 二. 标准库中的string类 2.1 string类(了解) 2.2 string类成员函数 ● string类对象的常见构造 ● string类析构函数 ● 赋值重载 2.3 string的迭代器 <1>正向迭代器 Iterator <2> 反向迭代器…

接口测试工具:Postman详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性…

面试笔试 场景题(部分总结)

文章目录 题目--找出一堆随机数中的前 k 大数字PriorityQueue 类PriorityQueue 常用方法 题目--数组中的第 K 个最大元素 题目–找出一堆随机数中的前 k 大数字 找出一堆随机数中的前 k 大数字&#xff0c;找出一堆随机数中的前 k 小数字。都一样 方法&#xff1a;快速排序。…

【springsecurity】使用PasswordEncoder加密用户密码

目录 1. 导入依赖2. 配置 PasswordEncoder3. 使用 PasswordEncoder 加密用户密码4. 使用 PasswordEncoder 验证用户密码 1. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifac…

docker部署NginxProxyManager

1.效果展示 有啥用&#xff1f;&#xff0c; 能把域名代理到 117.xx.xx.xx:3000 服务器上 而不用写一堆的location / { proxy… } 2.步骤 2.1往期docker安装 docker和docker-compose安装脚本-CSDN博客 2.2创建目录 mkdir ~/npm #创建一个目录用来安装此服务 cd ~/npm #…

兴业周报|“一套房子不留”的马斯克 在北京买房了?

稀有房源&#xff1a;标的物位于北京五环内&#xff0c;真正的城市别墅。中间建筑三区“全网无二手”&#xff0c;二手房市场无在售房源。 高性价比&#xff1a;标的物市场价2800万&#xff0c;起拍价1124万&#xff0c;四折上拍&#xff0c;四室两厅南北通透&#xff0c;建面…

基于SpringBoot的口腔管理平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 会员管理 病例就诊…

RuoYi-Vue若依框架-系统监控内定时任务的使用

定时任务 之前定时任务是在后端代码内使用cron表达式对对应的接口方法按照表达式执行&#xff0c;现在可以在框架内自行添加任务&#xff0c;包括自定义任务名&#xff0c;在调用方法内写对应实体类.接口方法名&#xff0c;cron表达式&#xff0c;添加好后即可执行 调用方法…

业余考什么证书比较实用?

在业余时间里&#xff0c;获得一些有用的证书不仅能提升你的专业素养&#xff0c;还能增强你在职场上的竞争力。 特别是职业技能证书和行业认证证书&#xff0c;这两者受到了广大职场人士的高度关注。 一、业余时间考取的实用证书 行业认证证书主要针对特定行业或职业&#…

16 训练自己语言模型

在很多场景下下&#xff0c;可能微调模型并不能带来一个较好的效果。因为特定领域场景下&#xff0c;通用话模型过于通用&#xff0c;出现多而不精。样样通样样松&#xff1b;本章主要介绍如何在特定的数据上对模型进行预训练&#xff1b; 训练自己的语言模型&#xff08;从头开…

AT3340-6T杭州中科微BDS定位授时板卡应用领域

AT3340-6T是一款高性能多系统卫星定位安全授时板卡&#xff0c;具有高灵敏度、高精度、抗干扰、低功耗等优势&#xff0c;可以满足电力授时、通信授时和金融授时等领域的应用。 电文完好性检测与告警 AT3340-6T 板卡支持电力授时标准要求的 UTC 信息异常告警&#xff0c;和卫…

基于Spring Boot的高校选课平台的设计与实现81917

目 录 1 绪论 1.1研究背景与意义 1.2研究内容 1.3论文结构与章节安排 2 高校选课平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 高校选课…

【OpenCV-图像梯度】Scharr算子和laplacian算子

1 图像梯度-Sobel算子 import cv2 # 导入 OpenCV 库# 读取灰度图像 img cv2.imread(./img/pie.png, cv2.IMREAD_GRAYSCALE) # 使用 imread 函数读取图像文件&#xff0c;路径为 ./img/pie.png # cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像# 显示图像 cv2.imshow("im…

Muduo库介绍及使用

文章目录 MuduoMuduo库是什么Moduo 库的原理Muduo 库常见接口TcpServer类EventLoop类TcpConnection类TcpClient类Buffer类 Muduo库实现一个简单英译汉服务器和客⼾端 Muduo Muduo库是什么 Muduo由陈硕⼤佬开发&#xff0c;是⼀个基于⾮阻塞IO和事件驱动的C⾼并发TCP⽹络编程库…

SpringSecurity原理解析(三):请求流转过程

1、当web系统启动的时候SpringSecurity做了哪些事情&#xff1f; 当web系统启动的时候会加载WEB-INF下的web.xml文件&#xff0c;在web.xml主要配置了下边几块的 内容&#xff0c;分别是&#xff1a; 1&#xff09;加载classpath路径下的配置文件&#xff08;包括SpringSecurit…

开关电源自动化测试有哪些流程和步骤?-天宇微纳

开关电源自动化测试的总体流程包括测试前的准备、测试过程中的具体步骤和测试后的数据处理三大部分。 以纳米软件ATECLOUD平台测试为例&#xff1a; ‌测试前的准备‌ ‌连接设备和仪器‌&#xff1a;通过LAN通讯总线、测试夹具以及其它线缆将需要测试的电源模块连接到纳米服…

【C语言】指针深入讲解(下)

目录 前言回调函数回调函数的概念回调函数的使用 qsort函数的使用和模拟实现qsort函数的介绍qsort函数的使用qsort函数模拟实现 前言 今天我们来学习指针最后一个知识点回调函数&#xff0c;这个知识点也很重要&#xff0c;希望大家能坚持学习下去。 没学习之前指针知识内容的…