Java版自动化测试之Selenium

news2024/11/15 14:08:19

1. 准备

编程语言:Java
JDK版本:17
Maven版本:3.6.1

2. 开始

声明:本次只测试Java的Selenium自动化功能
本次示例过程:打开谷歌游览器,进入目标网址,找到网页的输入框元素,输入指定内容,点击提交按钮,成功后关闭网页。

2.1. 目录结构和内容

在这里插入图片描述

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.fhh.selenium</groupId>
    <artifactId>demo</artifactId>
    <version>1.0.0</version>
    <name>SeleniumDemo</name>
    <description>Selenium demo</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>

    <properties>
        <java.version>17</java.version>
        <selenium.version>4.23.1</selenium.version>
        <webdrivermanager.version>5.9.2</webdrivermanager.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
        <!--            https://github.com/bonigarcia/webdrivermanager-->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>${webdrivermanager.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

SimpleSelenium.java

/**
 * Copyright (C) 2024-2024, FHH. All rights reserved.
 */
package com.fhh.selenium;

import lombok.AllArgsConstructor;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.function.Consumer;

/**
 * SimpleSelenium
 *
 * @apiNote <a href="https://www.selenium.dev/zh-cn/documentation/overview/">文档详情</a>
 * @since 1.0.0
 */
@AllArgsConstructor
public class SimpleSelenium {
    private final WebDriver driver;

    public SimpleSelenium openWeb() {
        driver.get("https://www.selenium.dev/selenium/web/web-form.html");
        return this;
    }

    public SimpleSelenium getWebTitle(Consumer<? super String> action) {
        action.accept(driver.getTitle());
        return this;
    }

    public SimpleSelenium fillForm() {
        WebElement textBox = driver.findElement(By.name("my-text"));
        // 设置textBox的值为“Test selenium”
        textBox.clear();
        textBox.sendKeys("Test selenium");
        return this;
    }

    public SimpleSelenium submit() {
        WebElement submitButton = driver.findElement(By.cssSelector("button"));
        submitButton.click();
        return this;
    }

    public SimpleSelenium getMessage(Consumer<? super String> action) {
        WebElement message = driver.findElement(By.id("message"));
        action.accept(message.getText());
        return this;
    }

    public void quit() {
        driver.quit();
    }
}

UserAction.java

封装用户操作的示例

/**
 * Copyright (C) 2024-2024, FHH. All rights reserved.
 */
package com.fhh.selenium;

import lombok.AllArgsConstructor;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

/**
 * 封装一些用户的必要动作
 *
 * @since 1.0.0
 */
@AllArgsConstructor
public class UserAction {
    private final WebDriver driver;

    /**
     * 登录用户
     *
     * @param username 用户名
     * @param password 密码
     * @return this
     */
    public UserAction login(String username, String password) {
        WebElement loginField = driver.findElement(By.id("username"));
        loginField.clear();
        loginField.sendKeys(username);

        // Fill out the password field. The locator we're using is "By.id", and we should
        // have it defined elsewhere in the class.
        WebElement passwordField = driver.findElement(By.id("password"));
        passwordField.clear();
        passwordField.sendKeys(password);

        // Click the login button, which happens to have the id "submit".
        driver.findElement(By.id("submit")).click();
        return this;
    }

    /**
     * 注销登录
     *
     * @return this
     */
    public UserAction logOut() {
        WebElement logOutButton = driver.findElement(By.id("log-out"));
        logOutButton.click();
        return this;
    }

}

SimpleSeleniumTest.java

/**
 * Copyright (C) 2024-2024, FHH. All rights reserved.
 */
package com.fhh.selenium;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.time.Duration;

import static org.junit.jupiter.api.Assertions.assertEquals;

class SimpleSeleniumTest {
    WebDriver driver;

    @BeforeEach
    public void setup() {
        driver = new ChromeDriver();
    }

    @Test
    public void simpleTest() {
        // 1. 打开网页
        driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
        driver.get("https://www.selenium.dev/selenium/web/web-form.html");

        // 2. 获取网页标题,并断言为Web form
        String title = driver.getTitle();
        assertEquals("Web form", title);

        // 3. 找到网页上name属性为“my-text”的元素textBox
        WebElement textBox = driver.findElement(By.name("my-text"));
        // 3.1 设置textBox的值为Selenium
        textBox.sendKeys("Test selenium");

//        sleep(2000);
        // 4. 点击提交元素
        WebElement submitButton = driver.findElement(By.cssSelector("button"));
        submitButton.click();

//        sleep(2000);
        // 5. 断言页面名称为“Web form - target page”
        assertEquals("Web form - target page", driver.getTitle());

//        sleep(2000);
        // 6. 找到id为“message”的消息,断言为“Received!”
        WebElement message = driver.findElement(By.id("message"));
        assertEquals("Received!", message.getText());
    }

    @Test
    public void simpleSeleniumTest() {
        new SimpleSelenium(driver)
                .openWeb()
                .getWebTitle(title -> assertEquals("Web form", title))
                .fillForm()
                .submit()
                .getWebTitle(title -> assertEquals("Web form - target page", title))
                .getMessage(message -> assertEquals("Received!", message))
                .quit();
    }

    @AfterEach
    public void teardown() {
        driver.quit();
    }

    public void sleep(long timeMillis) {
        try {
            Thread.sleep(timeMillis);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

3. 效果

运行测试后,会先等待1~5秒(具体看机器性能),打开一个谷歌游览器,在输入网址,进入网页,并找到网页中的元素,输入内容后,点击提交按钮,网页会自动跳转到新的页面。结束

部分代码和页面关系

测试用例结果
测试用例结果


如果对你有用,就点个赞吧~多谢

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

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

相关文章

基于Java+SpringBoot+Vue的网上租赁系统设计与实现

基于JavaSpringBootVue的网上租赁系统设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1…

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测 微软首席技术官凯文斯科特 在红杉资本&#xff08;Sequoia Capital&#xff09;发布的《Training Data》播客中&#xff0c;微软首席技术官凯文斯科特&#xff08;Kevin Scott&#xff09;坚定地重申了他对大语言模型&…

从文字到多媒体:GPT如何彻底革新内容创作

近年来&#xff0c;OpenAI开发的GPT&#xff08;生成预训练变换器&#xff09;模型在自然语言处理领域引起了广泛关注&#xff0c;尤其是GPT-3的推出&#xff0c;更是掀起了一场技术革新浪潮。然而&#xff0c;GPT模型不仅限于自然语言处理&#xff0c;其多模态应用前景同样令人…

AI大模型领域入门:AI产品经理必备知识指南

随着大模型技术的快速发展&#xff0c;市面上涌现出了大量的大模型产品岗位&#xff0c;那么想要进入AI行业的产品经理同学&#xff0c;需要提前做好哪些准备工作呢&#xff1f;这篇文章里&#xff0c;作者总结了入行AI的必备知识&#xff0c;包括市场调研、产品底层逻辑等内容…

打工人必备工具箱

下载地址&#xff1a;https://pan.quark.cn/s/356d7f201d7a 图片工具 图片格式转换图片转ICO图片压缩图片批量转换图片编辑图片分割 视频工具 视频格式转换视频翻转视频提取音频视频倒放视频静音视频分辨率转换视频旋转视频拼接视频调整音量视频取帧 文档工具 PDF合并PDF提…

Kubernetes--命令行工具 kubectl

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、在任意节点使用 kubectl 1、将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中 [rootk8s-master…

系列:水果甜度个人手持设备检测-前沿方案、论文和思路(一)

系列:水果甜度个人手持设备检测 -- 前沿方案、论文和思路&#xff08;一&#xff09; 背景 我们检索最新前沿领域的论文和思路&#xff0c;一般都不会去GitHub、专利官网这种地方&#xff0c;大家都是正常的人类&#xff0c;我们通常会想到中国知网CNKI、中国国家数字图书馆…

【刷题笔记】二叉树3

之前已经介绍过了二叉树的前中后序遍历及层序遍历&#xff0c;这是解决所有二叉树问题的手段。上一期也提到过&#xff0c;很多题既可以用前中后序遍历去做也可以用层序遍历去做。本期就介绍一下例题&#xff0c;分别展示两种做法。 1. 二叉树的右视图 199. 二叉树的右视图 给…

使用 preloadComponents 进行组件预加载

title: 使用 preloadComponents 进行组件预加载 date: 2024/8/18 updated: 2024/8/18 author: cmdragon excerpt: 摘要&#xff1a;本文介绍Nuxt 3中的preloadComponents功能&#xff0c;用于预加载全局注册的组件以减少首次渲染阻塞时间&#xff0c;通过实例演示如何设置并…

EmguCV学习笔记 C# 4.2 二值化

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

WebRTC音视频开发读书笔记(五)

WebRTC既可以收发音频和视频&#xff0c;还可以传输其它数据&#xff0c;如短消息、二进制数据、文本数据等。可以实现文本聊天、文件传输等场景。 八、数据通道 1、基本概念 WebRTC的数据通道好比高速公路、文本、文件、图像以及其它数据 好比货物&#xff0c;通道打通 &am…

SpringBoot Web请求、响应

一、文章概述 请求方面主要讲&#xff0c;当前端向后端发出请求时&#xff0c;对于不同类型的参数后端都如何接收&#xff1b;对于响应&#xff0c;文章会讲解后端如何向前端响应数据以及如何使返回的数据具有统一的格式。 二、请求 2.1接收简单参数 Controller方法&#xf…

sqlserver的openquery配置

1.命令Demo ---openquery--开启Ad Hoc Distributed Queries组件&#xff0c;在sql查询编辑器中执行如下语句exec sp_configure show advanced options,1reconfigureexec sp_configure Ad Hoc Distributed Queries,1reconfigure--关闭Ad Hoc Distributed Queries组件&#xff0…

10、stm32实现adc读取数据

一、配置 二、代码 /* USER CODE BEGIN 2 */OLED_Init();OLED_Clear();OLED_ShowString(0,0,"Hello adc",12,0);uint16_t adc_number 0;/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1…

2分钟搭建一个简单的WebSocket服务器

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 如何用2分钟在本地搭建一个简单的 WebSocket 服务器&#xff1f;其实使用 Node.js&#xff0c;加上一些流行的库&#xff0c;是很容易实现的。前端同学通过自己搭建 WebSocket 服务器&#xff0c;对于…

PyTorch深度学习快速入门教程--学习笔记

目录 P4 PyCharm和Jupyter的对比 P5 PyTorch加载数据 P6 Dataset类代码实现 P7 Tensorboard 写日志 读取日志文件 Tensorboard 读图片 P10 Transforms使用 Transforms用途 常见的Transforms工具 P14 torchvision数据集使用 P15 Dataloader使用 P16 nn.Module模块使…

政务大数据解决方案(三)

政务大数据解决方案致力于通过整合来自不同部门和领域的海量数据&#xff0c;采用先进的数据分析技术与人工智能算法&#xff0c;建立一个全面、高效的数据管理平台&#xff0c;从而优化政府决策过程&#xff0c;提高政策制定的科学性与精准性。该方案涵盖数据采集、存储、处理…

C语言学习笔记 Day14(文件管理)

Day14 内容梳理&#xff1a; 目录 Chapter 10 文件操作 10.0 概述 10.1 打开、关闭文件 &#xff08;1&#xff09;文件指针 &#xff08;2&#xff09;打开文件 fopen() &#xff08;3&#xff09;读取文件 fgetc() &#xff08;4&#xff09;写入文件 fputc() Ch…

Arthas:Java应用诊断利器

1、简介 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c…

【大数据算法】一文掌握大数据算法之:概述、特点、类型及难点等,值得收藏。

大数据算法概述 1、引言2、大数据算法概述2.1 什么是大数据算法2.2 大数据算法特点2.3 大数据算法类型2.4 大数据算法难点 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;大数据开篇反馈不错哦。 小鱼&#xff1a;嗯&#xff0c;是的呢&#xff0c; 咱这个专栏&#xff…