selenium-java自动化教程

文章目录

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如果版本差别太大启动的时候会提示浏览器版本不支持。

模拟用户浏览访问

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

xml 复制代码
<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>
java 复制代码
@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语法和浏览器插件可以非常方便的选中要操作的元素,然后在代码中获取到这个元素并调用它的点击事件

java 复制代码
@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)页面的文字内容也非常的简单

java 复制代码
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网页数据,如果页面有分页的话也可以通过编写代码的方式获取到所有数据

相关推荐
Simp1e_a40 分钟前
最大转矩电流比(MTPA)
科技·自动化·硬件工程·能源·制造
F-2H1 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05671 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
_oP_i2 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx2 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康3 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘4 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意4 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
PieroPc4 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
FF在路上5 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言