Java使用Selenium进行Web项目的UI自动化测试

news2024/9/23 11:21:38

 

目录

配置Selenium

1.使用Maven管理依赖    将三个依赖放到java的pom文件中

2.这里使用Edge进行简单的UI操作

3.提醒 

FireFox和Chrome启动失败

Firefoxdriver启动失败 

Chromedriver启动失败

java如何使用Selenium进行web的UI自动化测试 

对一个项目进行测试目录详情如下

测试的通用方法,驱动的创建和截图方法

等待方式分三种

这里写一个我项目的拦截器的UI测试

1.设计测试用例

 2.编写对应测试代码

3.查看测试结果,退出代码是0,运行正确

注意 

 这里将截图方法使用上代码如下


Selenium进行UI自动化的意义在于提高测试效率,‌增强测试准确性,‌并支持跨浏览器和平台的测试,‌从而确保Web应用的功能和界面符合预期要求。‌

配置Selenium

1.使用Maven管理依赖    将三个依赖放到java的pom文件中

以下是三个依赖项的作用总结:‌

‌Selenium Java依赖‌:‌提供自动化测试Web应用程序的核心API和工具,‌支持跨浏览器和平台的测试。‌它允许开发者编写测试脚本来控制和操作浏览器,‌执行自动化测试。‌‌

‌WebDriver Manager依赖‌:‌一个用于管理Web驱动程序的工具,‌可以自动检测所需浏览器的版本,‌并下载相应的Web驱动程序。‌它减轻了手动下载和配置浏览器驱动程序的负担,‌提高了自动化测试的效率和稳定性。‌‌
 

‌Commons IO依赖‌:‌主要用于处理IO流,‌提供了一些实用的IO操作工具类,‌如文件读写、‌文件监控等。‌在这里用于截图功能,‌帮助在自动化测试过程中保存或处理截图。‌‌

<!--下面用的是selenium的依赖项-->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.14.1</version>
        </dependency>
<!--下面用的是驱动管理的依赖项-->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.5.3</version>
        </dependency>
<!--        下面是截图用的依赖-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

2.这里使用Edge进行简单的UI操作

        //‌设置Edge驱动
        WebDriverManager.edgedriver().setup();
        //创建Edge选项,添加启动参数
        EdgeOptions options = new EdgeOptions();
        options.addArguments("--allow-remote-origins=*");
        //创建驱动实例
        WebDriver driver = new EdgeDriver(options);
        //打开网页
        driver.get("https://cn.bing.com/");
        //延时
        Thread.sleep(2000);
        //关闭
        driver.quit();

 启动成功会发现新打开一个Edge窗口,跳转到bing搜索页,再关闭

3.提醒 

FireFox和Chrome启动失败

理论上是可以创建不同的浏览器驱动常见的还有Firefoxdriver,Chromedriver,对应可以进行不同浏览器上进行UI自动化测试,但是实际的情况是小编在这边只能用Edge进行测试,具体的解决方式还没有,确实有尝试解决,如果后面解决了会回来补充,现在将问题还原一下

Firefoxdriver启动失败 

        WebDriverManager.chromedriver().setup();
        ChromeOptions options2 = new ChromeOptions();
        options2.addArguments("--allow-remote-origins=*");
        WebDriver driver2 = new ChromeDriver(options2);
        driver2.get("https://cn.bing.com/");

报错信息:java.net.UnknownHostException: raw.githubusercontent.com。‌此错误通常指示Firefox驱动尝试连接到一个无法解析的主机名。‌可能是网络问题或相关依赖未正确配置。‌

Chromedriver启动失败

        WebDriverManager.firefoxdriver().setup();
        FirefoxOptions options3 = new FirefoxOptions();
        options3.addArguments("--allow-remote-origins=*");
        WebDriver driver3 = new FirefoxDriver(options3);
        driver3.get("https://cn.bing.com/");

 报错信息:Could not start a new session. Response code 500. Message: session not created: This version of ChromeDriver only supports Chrome version 114,‌这表明ChromeDriver版本与安装的Chrome浏览器版本不兼容,‌需要确保ChromeDriver与Chrome浏览器的版本相匹配。‌

回到主题上面只是介绍Selenium如何启动,下面介绍小编如何使用Selenium

java如何使用Selenium进行web的UI自动化测试 

对一个项目进行测试目录详情如下

测试的通用方法,驱动的创建和截图方法

ublic class Utils {

    //通用配置,创建driver
    public static WebDriver driver;

    public static WebDriver createDriver(){
        if(driver!=null){
            return driver;
        }

        WebDriverManager.edgedriver().setup();
        EdgeOptions options = new EdgeOptions();
        options.addArguments("--allow-remote-origins=*");
        driver=new EdgeDriver(options);

        //创建隐式等待
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        return driver;
    }
    //构造方法
    public Utils(String url) {
        driver=createDriver();
        System.out.println(url);
        driver.get(url);
    }
    //截图方法
    public static void getScreenShot(String str) throws IOException {
        //创建时间格式化对象,获取时间并格式化
        SimpleDateFormat simple1=new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat simple2=new SimpleDateFormat("hhmmssSS");
        String format = simple1.format(System.currentTimeMillis());
        String format2 = simple2.format(System.currentTimeMillis());
        //拼接文件路径‌
        String fileName="./src/test/image/"+format+"/"+str+"-"+format2+".png";
        //获取并保存截图‌到路径
        File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(screenshotAs,new File(fileName));

    }
}

等待方式分三种

‌Selenium等待作用‌:‌解决元素定位问题,‌提升脚本稳定性。‌

1.‌强制等待(‌Sleep)‌‌:‌(调试常用)

Thread.sleep(5000); // 休眠5秒


2.‌隐式等待(‌Implicit Wait)‌‌:‌(常用的等待)设置全局等待时间,‌针对所有元素。‌

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));


3.‌显式等待(‌Explicit Wait)‌‌:‌针对特定元素,‌设置等待条件

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));

 常用显示等待去等待警告框

WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(3)); 
wait.until(ExpectedConditions.alertIsPresent());

这里写一个我项目的拦截器的UI测试

1.设计测试用例

 2.编写对应测试代码

//主流程   
 public static void main(String[] args) {
        NoLogin noLog=new NoLogin(ListUrl);
        noLog.noLogin();
        driver.quit();
    }
//拦截器测试代码    
public void noLogin() {
        //显示等待
        WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(3));
        //强行进入登录界面,会弹出警告框,点击确认会跳转到登录界面,断言一下是否跳转成功
        // 有警告框就要用显示等待,不然人员报错,因为警告框还没弹出,就判断NoSuchAlert
        wait.until(ExpectedConditions.alertIsPresent());
        driver.switchTo().alert().accept();
        String title = driver.getTitle();
        assert title.equals("博客登陆页");

        driver.get(DetailUrl);//判断强行进入登录页是否会跳转成功
        String title1 = driver.getTitle();
        assert title1.equals("博客登陆页");

        driver.get(EditUrl);//进入编辑页,进行编辑,查看是否会提交成功
        driver.findElement(By.cssSelector("#title")).sendKeys(System.currentTimeMillis()+"测试发送");
        driver.findElement(By.cssSelector("#submit")).click();
        
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert();
        String text = alert.getText();
        alert.accept();
        assert text.equals("用户未登录,请登录再操作");
        assert driver.getTitle().equals("博客登陆页");
    }

3.查看测试结果,退出代码是0,运行正确

注意 

上面测试代码中没有调用截图方法这里也需要提醒一下,在警告框弹出的时候selenium的截图工具截不了图,会报一个有警告框未处理的错误UnhandledAlertException

Exception in thread "main" org.openqa.selenium.UnhandledAlertException: unexpected alert open: {Alert text : 用户未登录,请登录再操作}
  (Session info: MicrosoftEdge=128.0.2739.63): 用户未登录,请登录再操作

结合之前警告框的显示等待这里总结就是 

如果需要自动化截图记录测试过程,截图的调用方法,放在警告框之前或者之后,酌情而论 

 这里将截图方法使用上代码如下

 public void noLogin() throws IOException {
        //显示等待
        WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(3));
    
        wait.until(ExpectedConditions.alertIsPresent());
        driver.switchTo().alert().accept();
        String title = driver.getTitle();
        assert title.equals("博客登陆页");
        getScreenShot(getClass().getName());

        driver.get(DetailUrl);//判断强行进入登录页是否会跳转成功
        String title1 = driver.getTitle();
        assert title1.equals("博客登陆页");
        getScreenShot(getClass().getName());


        driver.get(EditUrl);//进入编辑页,进行编辑,查看是否会提交成功
     driver.findElement(By.cssSelector("#title")).sendKeys(System.currentTimeMillis()+"测试发送");
        driver.findElement(By.cssSelector("#submit")).click();

        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert();
        String text = alert.getText();
        alert.accept();
        assert text.equals("用户未登录,请登录再操作");
        assert driver.getTitle().equals("博客登陆页");
        getScreenShot(getClass().getName());

如果想要测试我的项目,自便hahaha,123456

随心笔记icon-default.png?t=N7T8http://47.113.216.119:8080/blog_login.html如果想要我的全部测试代码:直接点击文章的下载链接,拜拜

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

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

相关文章

Python作为客户端连接websocket

缘起 因为需要将MQTT中的数据推送给前端,但是前端不会直接连接MQTT,所以服务端做了一个中间层,通过websocket推送,但是在开发的过程中前端总是认为推送的数据不及时,所以这里又实用Python单独做了一个客户端做时间记录验证。开始吧 安装三方包 Python的生态很方便,这里…

oracle数据块内部结构详解

文章目录 Oracle数据块详解概述Oracle块具有以下特点&#xff1a;① 最小的I/O单元&#xff1b;② 包含一个或多个OS块&#xff1b;③ 大小由参数DB_BLOCK_SIZE决定&#xff1b;④ 数据库创建时设置&#xff0c;数据库创建后不能更改 Oracle数据块详解 概述 操作系统块是…

2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp

EncirclingGame 题目描述&#xff1a;A simple game, enjoy it and get the flag when you complete it. 开题&#xff0c;前端小游戏&#xff0c;红点出不去就行 直接玩通关了 看看如何不玩也能拿到flag&#xff0c;flag存储在后端php文件内&#xff0c;前端找不到。 看一下…

前端工程化之【模块化规范】

目录 模块化概述&#xff1a;什么是模块化为什么需要模块化 有哪些模块化规范导入与导出的概念CommonJS 规范ES6 官方模块化规范导出数据导入数据Node 中运行 ES6 模块 模块化概述&#xff1a; 什么是模块化 ● 将程序文件依据一定规则拆分成多个文件&#xff0c;这种编码方式…

区块链的含义是什么

目录 区块链的基本定义 区块链的构成与特性 区块链的类型 区块链的应用 区块链的基本定义 区块链是一种分布式数据存储、点对点传输、共识机制和加密算法等计算机技术的新型应用模式。它通过将数据区块按照时间顺序相连形成链式结构&#xff0c;确保数据的真实性和不可篡改…

代码随想录训练营 Day50打卡 图论part01 理论基础 98. 所有可达路径

代码随想录训练营 Day50打卡 图论part01 一、理论基础 DFS&#xff08;深度优先搜索&#xff09;和 BFS&#xff08;广度优先搜索&#xff09;在图搜索中的核心区别主要体现在搜索策略上&#xff1a; 1、搜索方向&#xff1a; DFS&#xff1a;深度优先&#xff0c;一条路走到…

突破教材,简单聊聊《文件系统》

文章目录 前言&#xff1a;文件系统的引入&#xff1a;认识物理磁盘&#xff1a; 对磁盘的存储进行逻辑抽象&#xff1a;LBA逻辑区块地址&#xff1a; &#x1f680;文件系统的理解&#xff1a;理解各个区段&#xff1a;&#x1f6f9;深入理解 inode&#xff1a;inode和文件名&…

9.4日常记录

一、索英笔试 1.实现strcpy 1.char src[] "Hello, World!";&#xff1a; 这里定义了一个字符数组。这个字符串 "Hello, World!" 的内容被直接存储在这个数组中&#xff0c;数组的大小由字符串的长度加上一个额外的位置用于存储字符串结束符\0自动确定。 …

CSS英文换行

在CSS中&#xff0c;如果你想让英文单词换行&#xff0c;可以使用word-break: break-all;属性。这个属性会强制浏览器在任何字符之间进行换行&#xff0c;即使没有空格或其他分隔符。 没有加样式前的运行结果 CSS样式 p {word-break: break-all; } 运行结果 这将确保段落内的…

【弱监督时间动作定位】Probabilistic Vision-Language Representation for WSTAL 论文阅读

Probabilistic Vision-Language Representation for Weakly Supervised Temporal Action Localization 论文阅读 Abstract1 Introduction2 RELATEDWORK2.1 Weakly Supervised Temporal Action Localization2.2 Vision Language Pre-training2.3 Probabilistic Representation 3…

VS2022卸载记录

Releases microsoft/VisualStudioUninstaller (github.com) 在上面的网址中下载压缩包 下载之后解压&#xff0c;之后选择红框文件&#xff0c;右键选择以管理员身份运行 输入Y&#xff0c;回车 &#xff0c;之后等待程序执行结束 该操作之后&#xff0c;我发现我的安装目录中…

CentOS7 MySQL 数据库基本使用

3.查看当前库中存在哪些表 mysql> show tables 4.查看表的结构 mysql> describe user mysql> describe mysql.user 5.查询数据库服务的基本信息 mysql> status 二、创建及删除库和表 1.创建新的库 CREATE DATABASE 语句&#xff1a;用于创建一个新的库&…

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码&#xff08;压缩&#xff09;视频数据&#xff1f;✨如何编码&#xff08;压缩&#xff09;数据&#x1f384;简单的例子&#x1f384;音视频编码方式&#x1f384;视频编码格式H264编码是什么&#xff1f;发展历程&#xff1f;H.264基…

使用python+opencv解析图像和文本数据

1. 创建虚拟环境 新建文件夹, 并在文件夹中创建虚拟环境,可以使用Vscode打开文件夹, 然后在终端中输入以下命令: python -m venv venv2. 激活虚拟环境 在终端中输入以下命令: venv\Scripts\activate3. 安装依赖 在终端中输入以下命令: pip install opencv-pythonpip inst…

docker pull命令拉取镜像失败的解决方案

docker pull命令拉取镜像失败的解决方案 一、执行docker pull命令&#xff0c;拉取镜像失败 报错信息&#xff1a;error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/51/5107333e08a87b836d48f…

第86集《大佛顶首楞严经》

《大佛顶如来密因修正了义诸菩萨万行首楞严经》。监院法师慈悲&#xff0c;诸位法师&#xff0c;诸位同学&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义188面 我们这一科讲到&#xff0c;辛三、盗戒。透过大乘的理观跟事修&#xff0c;所谓大乘的戒法来对治偷盗的行为跟偷…

EasyExcel单行或多行表头的简单Excel导出

一般Excel不需要复杂的数据格式导出&#xff0c;只是在表头上略有区别&#xff0c;下面展示单行和多行表头Excel导出 1、单行表头 例如&#xff1a;Excel表头只有单行&#xff0c;那就只需要使用注解ExcelProperty即可实现 ① 添加依赖 首先&#xff0c;在 pom.xml 中添加 E…

zhidianyun01/基于 ThinkPHP+Mysql 的智慧园区+智慧园区管理系统+园区物业管理系统+园区物业管理系统源码

园区物业管理系统园区管理系统园区管理园区物业物业管理系统园区物业管理系统源码 软件架构 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示

imap发送邮件:如何配置IMAP服务器发邮件?

imap发送邮件的设置教程&#xff1f;如何使用IMAP服务发送邮件&#xff1f; IMAP发送邮件作为一种高效的邮件管理方式&#xff0c;允许用户在多个设备上同步邮件&#xff0c;极大地提升了工作效率。AokSend将详细介绍如何配置IMAP服务器以实现邮件的发送。 imap发送邮件&…

Linux入门攻坚——31、rpc概念及nfs和samba

NFS&#xff1a;Network File System 传统意义上&#xff0c;文件系统在内核中实现 RPC&#xff1a;函数调用&#xff08;远程主机上的函数&#xff09;&#xff0c;Remote Procedure Call protocol 一部分功能由本地程序完成 另一部分功能由远程主机上的 NFS本质…