selenium-java自动化教程

news2024/11/28 8:29:29

文章目录

    • Selenium
      • 支持语言
      • WebDriver
    • 开始使用
      • chromedriver
      • 模拟用户浏览访问
      • 模拟点击事件
        • 关闭弹窗,选中元素并点击
      • 获取页面文本
      • 结语

Selenium

 Selenium是一个自动化测试工具,可以模拟用户操作web端浏览器的行为,包括点击、输入、选择等。也可以获取交互界面上的指定元素的内的数据,也就是爬虫。

支持语言

  Selenium支持Java、Python、CSharp、Ruby、JavaScript、Kotlin,对于会java语言的,可以直接使用selenium-java

WebDriver

 Selenium 的核心是 WebDriver,这是一个编写指令集的接口,可以在许多浏览器运行。我们要在浏览器中模拟用户点击就需要一个对应的驱动组件来实现这个功能,WebDriver就是以原生的方式驱动浏览器,就像用户在本地操作浏览器一样。
在这里插入图片描述

开始使用

chromedriver

 上边说了我们要驱动浏览器做一些行为动作就需要一个对应的驱动,目前支持的浏览器有:Firefox、Chrome、Edge、IE、Apple Safari,下面我们使用Chrome浏览器
chromedriver
chromedriver125.0.6422.141稳定版
我使用的浏览器版本是125.0.6422.142,小版本差别影响不大 可以直接使用,下载的WebDriver如果版本差别太大启动的时候会提示浏览器版本不支持。

在这里插入图片描述

模拟用户浏览访问

 以模拟用户浏览页面,不断的滚动页面直到最底部这样一个需求,下面开始编码

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>
</dependencies>
@Component
public class BlogService {

    private final List<String> UA_LIST = Arrays.asList(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.0.0 Safari/537.36"
            , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36");

    // 要访问的页面地址
    private final List<String> URL_LIST = Arrays.asList("https://wiki.mbalib.com/wiki/%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91");
    private final AtomicInteger count = new AtomicInteger();

    public static void main(String[] args) {
        // websiteTask();
    }

    private void websiteTask() {
        System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, "/dev/null");

        // driver驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/
        System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\125\\chromedriver.exe");   //设置chrome驱动程序的路径

        System.out.println(System.getProperty("webdriver.chrome.driver"));

        ChromeOptions opt = new ChromeOptions();
        //opt.addArguments("-headless");     // 开启无界面模式
        opt.addArguments("--disable-gpu");  // 禁用gpu
        opt.addArguments("--user-agent=" + getRandom(UA_LIST));

        WebDriver driver = new ChromeDriver(opt);   //初始化一个chrome驱动实例,保存到driver中

        try {
            // driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); //隐式等待10秒
            //最大化窗口
            driver.manage().window().maximize();  //最大化窗口

            driver.get(getRandom(URL_LIST));

            Thread.sleep(1000);  // 等待页面加载xs

            // 强制转换WebDriver为JavascriptExecutor
            JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
            // 执行JavaScript代码来获取页面的滚动条高度
            int scrollHeight = Integer.parseInt(jsExecutor.executeScript("return document.documentElement.scrollHeight;").toString());
            // 可以根据滚动条高度,每次滚动多少px,计算出总共需要滚动多少次,这样就可以滚动到最底部
            int num = scrollHeight / 400;

            for (int i = 0; i < num; i++) {
                int height = (i + 1) * 400;
                ((JavascriptExecutor) driver).executeScript("window.scrollTo({" + "top: " + height + ",behavior: \"smooth\"" + "})");

                Thread.sleep(1000);  // 每次滚动等待一定时间
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.manage().deleteAllCookies();
            System.out.println("当前第几次:" + count.incrementAndGet() + " , 打开页面的标题是: " + driver.getTitle());
            //关闭并退出浏览器
            driver.quit();
        }
    }

    /**
     * 随机获取一个地址
     */
    private String getRandom(List<String> list) {
        // shuffle 打乱顺序
        Collections.shuffle(list);
        return list.get(0);
    }

    // initialDelay:第一次延迟多长时间后再执行, fixedRate:之后按fixedRate的规则每x秒执行一次
    @Scheduled(initialDelay = 0, fixedRate = 13000)
    public void timingTask() {
        System.out.println("start task........");
        websiteTask();
    }
}

运行效果:

selenium-java模拟浏览页面

模拟点击事件

使用这个网站作为示例:测试页面

在这里插入图片描述

由于打开页面有一个提示框,需要先把提示框关闭后才可以对页面元素进行操作,否则会提示元素是不可点击的。
所以我们的步骤是:先打开页面 选中弹窗右上角的关闭图标点击它,然后才能选择页面上要操作的元素。

关闭弹窗,选中元素并点击

 使用xpath语法和浏览器插件可以非常方便的选中要操作的元素,然后在代码中获取到这个元素并调用它的点击事件

@Component
public class BlogService {

    private final List<String> UA_LIST = Arrays.asList(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.0.0 Safari/537.36"
            , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36");

    // 要访问的页面地址
    private final List<String> URL_LIST = Arrays.asList("https://wiki.mbalib.com/wiki/%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91");
    private final AtomicInteger count = new AtomicInteger();

    public static void main(String[] args) {
        // websiteTask();
    }

    private void websiteTask() {
        System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, "/dev/null");

        // driver驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/
        System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\125\\chromedriver.exe");   //设置chrome驱动程序的路径

        System.out.println(System.getProperty("webdriver.chrome.driver"));

        ChromeOptions opt = new ChromeOptions();
        //opt.addArguments("-headless");     // 开启无界面模式
        opt.addArguments("--disable-gpu");  // 禁用gpu
        opt.addArguments("--user-agent=" + getRandom(UA_LIST));

        WebDriver driver = new ChromeDriver(opt);   //初始化一个chrome驱动实例,保存到driver中

        try {
            // driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); //隐式等待10秒
            //最大化窗口
            driver.manage().window().maximize();  //最大化窗口

            driver.get(getRandom(URL_LIST));

            Thread.sleep(1000);  // 等待页面加载xs

            // 先关闭弹窗
            String headExpression = "//div[@class=\"bg hid\" and @id=\"vip_popup_img\"]//*[local-name() = \"svg\" and @class=\"head-icon\"]";
            WebElement headElement = driver.findElement(By.xpath(headExpression));
            headElement.click();
            
            //再操作页面元素
            String xpathExpression = "//div[@id=\"globalWrapper\"]/div[@id=\"column-content\"]/div[3]/div[@id=\"bodyContent\"]/dl[1]//a[3]";
            WebElement element = driver.findElement(By.xpath(xpathExpression));

            // 模拟点击事件
            element.click();

            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.manage().deleteAllCookies();
            System.out.println("当前第几次:" + count.incrementAndGet() + " , 打开页面的标题是: " + driver.getTitle());
            //关闭并退出浏览器
            driver.quit();
        }
    }

    /**
     * 随机获取一个地址
     */
    private String getRandom(List<String> list) {
        // shuffle 打乱顺序
        Collections.shuffle(list);
        return list.get(0);
    }

    // initialDelay:第一次延迟多长时间后再执行, fixedRate:之后按fixedRate的规则每x秒执行一次
    @Scheduled(initialDelay = 0, fixedRate = 13000)
    public void timingTask() {
        System.out.println("start task........");
        websiteTask();
    }
}

运行效果:

selenium-java模拟点击按钮事件

获取页面文本

 如果页面有很多文本文字,要获取(paqu)页面的文字内容也非常的简单
在这里插入图片描述

String xpathExpression = "//div[@id=\"content\"]/div[@id=\"bodyContent\"]//p[1]";
WebElement element = driver.findElement(By.xpath(xpathExpression));
System.out.println(element.getText());

结语

 xpath语法网络上很多资料这里就不做具体介绍了,主要说一下paqu数据的主要步骤,通过xpath可以获取到指定元素的文本内容、模拟元素的点击事件,这样我们就可以实现paqu网页数据,如果页面有分页的话也可以通过编写代码的方式获取到所有数据

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

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

相关文章

第十一届蓝桥杯C++青少年组中/高级组省赛2020年真题解析

一、单选题 第1题 表达式 ‘6’ - ‘1’ 的值是( ) A:整数 5 B:字符 5 C:表达式不合法 D:字符 6 答案&#xff1a;A 在 C 中&#xff0c;字符字面量用单引号括起来&#xff0c;例如 ‘6’ 和 ‘1’。这些字符字面量实际上是表示字符的 ASCII 值。在 ASCII 编码中&#xff0…

【机器学习】消息传递神经网络(MPNN)在分子预测领域的医学应用

1. 引言 1.1. 分子性质预测概述 分子性质预测是计算机辅助药物发现流程中至关重要的任务之一&#xff0c;它在许多下游应用如药物筛选和药物设计中发挥着核心作用&#xff1a; 1.1.1. 目的与重要性&#xff1a; 分子性质预测旨在通过分子内部信息&#xff08;如原子坐标、原…

2.数人数

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/431 题目描述 在一个班级里,男生比女生多…

MySQL—多表查询—子查询(介绍)

一、引言 上一篇博客学习完联合查询。 这篇开始&#xff0c;就来到多表查询的最后一种形式语法块——子查询。 &#xff08;1&#xff09;概念 SQL 语句中嵌套 SELECT 语句&#xff0c;那么内部的 select 称为嵌套查询&#xff0c;又称子查询。 表现形式 注意&#xff1a; …

达梦8 开启物理逻辑日志对系统的影响

物理逻辑日志&#xff0c;是按照特定的格式存储的服务器的逻辑操作&#xff0c;专门用于 DBMS_LOGMNR 包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时&#xff0c;这部分日志内 容会被存储在重做日志文件中。 要开启物理逻辑日志的功能&#xff0c;需要…

11.Spring AOP

文章目录 1.什么是 Spring AOP&#xff1f;2.为什要用 AOP&#xff1f;3.Spring AOP 应该怎么学习呢&#xff1f;3.1 AOP 组成3.1.1 切⾯&#xff08;Aspect&#xff09; 切点 通知3.1.2 连接点&#xff08;Join Point&#xff09;3.1.3 切点&#xff08;Pointcut&#xff09;…

《Brave New Words 》1.1 抛弃瓶子

Part I: Rise of the AI Tutor 第一部分&#xff1a;AI 导师的崛起 A great teacher can teach calculus with a paper clip and literature in an empty field. Technology is just another tool, not a destination. —Unknown 一位伟大的教师可以用回形针教微积分&#xff0…

Coze入门指南:创建Bot时,如何写好人设与回复逻辑(Persona Prompt)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Coze Bot 📒📝 Persona & Prompt🌟 # Character🌟 ## Skills🌟 # Overall Rules to follow🌟 ## Workflow🌟 ## Constraints📝 通用写法与模板📝 示例🌟技巧和注意事项⚓️ 相关链接 ⚓️📖 介绍 📖…

11.闰年的判定

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/615 题目描述 给定一个正整数 𝑦y 表示…

二进制中1的个数-java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、二进制中1的个数 二、算法思路 1.将一个整数转化成二进制形式 2.查询一个数的二进制数中的第k位是多少 3.lowbit(x)操作 三、代码如下 1.代码如下&…

Jmeter 压力测测试的简单入门

下载安装 官方网站&#xff1a;Apache JMeter - Download Apache JMeter 下载完成解压即可。 配置 1. 找到 bin 目录下的 ApacheJMeter.jar 包&#xff0c;直接打开 如果向图片这样不能直接打开&#xff0c;就在此路径运行 CMD&#xff0c;然后输入下面的命令即可启动。 ja…

React实现在线预览word报告/本地选择报告预览

标题使用的核心技术点是docx-preview&#xff0c;读取到文件的File对象&#xff0c;用File去做文件展示&#xff0c;这里是才用将文件转base64字符串存储到localStorage中 在线预览word报告且包含word样式 下载需要使用的min.js文件进项目的public目录中&#xff08;上zip已包…

彼长技以助己(4)边界思维

彼长技以助己&#xff08;4&#xff09;边界思维 边界思维 接下来是工程思维中的第二个思维&#xff1a;边界思维。它是适用于所有工程领域&#xff0c;事半功倍的方法&#xff0c;很值得大家去学习掌握。 我们做任何事情都是有边界的&#xff0c;技术有边界、人工智能有边界…

ctfshow-web入门-命令执行(web42知识铺垫与四种常见截断方法)

目录 1、知识铺垫 &#xff08;1&#xff09;文件描述符 &#xff08;2&#xff09;/dev/null 2、代码审计 3、命令分隔 &#xff08;1&#xff09;使用分号 ; &#xff08;2&#xff09;使用逻辑或 || &#xff08;3&#xff09;使用 && 或者 & 4、%0a …

【中国开源生态再添一员】天工AI开源自家的Skywork

刚刚看到《AI高考作文出圈&#xff0c;网友票选天工AI居首》&#xff0c;没想到在Huggingface中发现了Skywork大模型。天工大模型由昆仑万维自研&#xff0c;是国内首个对标ChatGPT的双千亿级大语言模型&#xff0c;天工大模型通过自然语言与用户进行问答式交互&#xff0c;AI生…

【Linux】进程5——进程优先级

1.进程优先级 1.1.什么是进程优先级 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。还可以把进程运行到指定的CPU上&#x…

SpringBoot与MyBatis的快速整合(基于注解)

文章目录 创建Spring Boot项目配置数据库连接信息编写MyBatis Mapper接口使用XML文件编写SQL映射配置数据源切换引入Druid依赖配置Druid数据源 配置MyBatis支持事务管理 在使用Spring Boot创建新项目或新模块时&#xff0c;如果需要使用MyBatis来进行数据库操作&#xff0c;可以…

基于springboot的教学管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教师管理&#xff0c;学生管理&#xff0c;课程管理 教师账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;课程管理&#xff0c;课程表…

8.数砖数

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/879 题目描述 给定一种 2222 规格的瓷砖,…

樱花动漫2024最新网页地址链接

大家好&#xff01;今天我要为大家种草一个非常棒的动漫资源在线平台——樱花动漫网页。作为一个网络文化研究者&#xff0c;我一直在关注当代动漫文化的发展和传播方式。而樱花动漫网页正是我近期发现的一颗璀璨明珠&#xff0c;它不仅为动漫爱好者提供了一个交流、分享的平台…