Java版自动化测试之Selenium

1. 准备

编程语言:Java

JDK版本:17

Maven版本:3.6.1

2. 开始

声明:本次只测试Java的Selenium自动化功能

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

2.1. 目录结构和内容

pom.xml

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

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

封装用户操作的示例

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

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秒(具体看机器性能),打开一个谷歌游览器,在输入网址,进入网页,并找到网页中的元素,输入内容后,点击提交按钮,网页会自动跳转到新的页面。结束

测试用例结果


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

相关推荐
试行7 分钟前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe12 分钟前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把17 分钟前
Java基础之IO流
java·开发语言
小菜yh19 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.25 分钟前
Java键盘输入语句
java·开发语言
浅念同学25 分钟前
算法.图论-并查集上
java·算法·图论
立志成为coding大牛的菜鸟.38 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞39 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
爱上语文2 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people2 小时前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端