自动化测试 selenium 篇

news2024/11/13 2:02:28

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • 什么是自动化测试?
  • Selenium 介绍
    • Selenium 是什么
    • Selenium 特点
    • 工作原理
  • selenium+Java环境搭建
    • Chrome+Java
      • 1.下载chrome浏览器
      • 2.查看chrome浏览器版本
      • 3.下载chrome浏览器驱动
    • 配置环境变量
    • 验证环境是否搭建成功
      • 1.创建java项目,添加pom文件中添加依赖
      • 2.编写代码运行
  • selenium 常用 API
    • 元素的定位
      • css 定位
      • xpath 定位
  • 操作测试对象
  • 添加等待
    • 强制等待
    • 隐式等待
  • 打印信息

什么是自动化测试?

自动化测试就是将人工测试手段进行转换,让代码去执行。

自动化测试分类:

单元测试,接口自动化,UI自动化。

Selenium 介绍

Selenium 是什么

Selenium 是 web 应用中基于 UI 的自动化测试框架。

Selenium 特点

支持多平台、多浏览器、多语言(如java,C#,Python,Ruby), 有丰富的 API。

工作原理

image-20230530170408859

selenium+Java环境搭建

Chrome+Java

windows电脑环境搭建-chrome浏览器

1.下载chrome浏览器

2.查看chrome浏览器版本

image-20230530171215541

3.下载chrome浏览器驱动

https://chromedriver.chromium.org/downloads

image-20230530171321924

image-20230530171403826

配置环境变量

解压下载好的驱动压缩包,将下载好的chromedriver.exe放到java系统环境变量下.

image-20230530171944575

验证环境是否搭建成功

1.创建java项目,添加pom文件中添加依赖

image-20230530172543800

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>
</dependencies>

image-20230530172828587

2.编写代码运行

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
    }
}

image-20230530173310940

image-20230530173402220

如果打开了浏览器,此时说明安装成功。

image-20230530190554290

selenium 常用 API

元素的定位

css 定位

image-20230530192759946

public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //输入软件测试
        element.sendKeys("软件测试");
    }
}

运行:

image-20230530193257445

xpath 定位

image-20230530193601898

public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        //xpath 定位元素
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //输入软件测试
        element.sendKeys("软件测试");
    }
}

image-20230530194022506

  • 绝对路径:/html/head/title (不常用)

  • 相对路径:

相对路径 + 索引://form/span[1]/input

image-20230530200722930

相对路径 + 属性值://input[@class=“s_ipt”]

image-20230530200959284

相对路径 + 通配符:// * [@ * =“su”]

image-20230530201203485

相对路径 + 文本匹配://a[text()=“新闻”]

image-20230530201403929

public class Main {
    public static void main(String[] args) throws InterruptedException {
        test01();
    }

    private static void test01() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        //css定位元素
//        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //xpath 定位元素
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //输入软件测试
        element.sendKeys("软件测试");
        //找"百度一下"按钮
        //点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //校验
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        int flag = 0;
        for(int i = 0;i < elements.size();i++){
            if(elements.get(i).getText().contains("测试")){
                flag = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if(flag == 0){
            System.out.println("测试不通过");
        }
    }
}

image-20230530203738769

css 选择器定位元素效率更高。

操作测试对象

  • click 点击对象

  • send_keys 在对象上模拟按键输入

  • clear 清除对象输入的文本内容

private static void test02() throws InterruptedException {
    ChromeOptions options = new ChromeOptions();
    //允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    //找到百度搜索输入框,输入"软件测试"
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
    //点击"百度一下"按钮
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);
    //清空百度搜索输入框中的数据
    webDriver.findElement(By.cssSelector("#kw")).clear();
}
  • submit 提交

如果点击的元素放在 form 标签中,使用 submit 和 click 效果一样。

如果点击的元素不在 form 标签中,此时使用 submit 会报错。

//会报错,因为点击的是"新闻"超链接,它没有放在 form 标签中
private static void test03() {
    ChromeOptions options = new ChromeOptions();
    //允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
}

image-20230530211417064

  • text 用于获取元素的文本信息

  • getAttribute: 获取元素属性的值。

image-20230530212002471

像"软件测试"这样的可以通过.getText()来获取文字内容。

image-20230530212119641

而"百度一下"这个按钮不能通过 .getText() 来获取文字内容。

private static void test04() {
    ChromeOptions options = new ChromeOptions();
    //允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    String button_value = webDriver.findElement(By.cssSelector("#su")).getText();
    System.out.println(button_value);
}

image-20230530212220681

没有打印 “百度一下” 这个按钮的文本内容。

如果要想打印"百度一下" 这个按钮的文本内容,可以通过 getAttribute()

private static void test04() {
    ChromeOptions options = new ChromeOptions();
    //允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
    System.out.println(button_value);
}

image-20230530212434999

添加等待

强制等待

sleep();

隐式等待

隐式等待和显式等待都是智能等待。

如果等待时间 3 天时间,强制等待会一直等待,等待的时间 3 天。

隐式等待,最多等 3 天,如果在 这 3 天之内获取到了页面上的元素,就会往下执行代码;如果等待 3 天还没有找到这个元素就会报错。

private static void test02() throws InterruptedException {
    ChromeOptions options = new ChromeOptions();
    //允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    //找到百度搜索输入框,输入"软件测试"
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
    //点击"百度一下"按钮
    webDriver.findElement(By.cssSelector("#su")).submit();
    //        sleep(30000000);
    webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
    //清空百度搜索输入框中的数据
    webDriver.findElement(By.cssSelector("#kw")).clear();
}

sleep(30000000); 效果是 输入框输入 软件测试后 一直死等 30000000 ms.

webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);

效果是只要输入框一输入完软件测试,就执行下面的代码,clear(). 没有等待。

显式等待可以让他指定去等待某一个元素。

打印信息

打印 title

打印 url

private static void test05() {
    ChromeOptions options = new ChromeOptions();
    //允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    String url = webDriver.getCurrentUrl();
    String title = webDriver.getTitle();
    System.out.println("title: " + title + " url: " + url);
}

image-20230530215417488

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

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

相关文章

uni-app:删除默认title

去除前&#xff1a; 可以看到有两个title 去除后&#xff1a; 可以看出就只有手机顶部的title了 "navigationStyle": "custom",//删除默认title

堆的向上与向下调整

目录 一、堆 1、概念 2、性质 二、向上调整 三、向下调整 四、建堆的比较 1.向上调整建堆 2.向下调整建堆 3.比较 五、总结 一、堆 1、概念 如果有一个关键码的集合K {k0k1&#xff0c;k2&#xff0c;…kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存…

怎么学习PHP错误处理和调试? - 易智编译EaseEditing

学习PHP错误处理和调试技术可以通过以下步骤&#xff1a; 理解错误类型&#xff1a; 了解PHP中常见的错误类型&#xff0c;如语法错误、运行时错误和逻辑错误等。学习它们的特点和常见原因&#xff0c;以便更好地定位和解决问题。 错误报告设置&#xff1a; 在开发环境中&am…

【Java基础学习打卡14】Java注释

目录 前言一、什么是注释二、注释的重要性三、单行、多行注释1.单行注释2.多行注释 四、文档注释1.文档注释2.JDK官网文档3.javadoc生成文档 五、注释建议总结 前言 本文介绍Java注释&#xff0c;它是我们在Java编程中必不可少的。Java注释有单行注释、多行注释和文档注释。对…

BUUCTF Web CyberPunk WriteUp

想直接查看payload的点这里 前言 二次注入&#xff08;Second-Order Injection&#xff09;是指攻击者在应用程序中注入恶意数据&#xff0c;然后在稍后的操作或不同的上下文中再次使用该恶意数据&#xff0c;导致安全漏洞。它通常发生在数据库查询、数据导出、报告生成等过程…

基于springboot博客论坛系统设计与实现(源码+文档LW+数据库+报告)

HBLOG 是一个博客论坛网站&#xff0c;分为游客端和管理员端。游客端主要有注册登录&#xff0c;查看文章&#xff0c;发表撰写文章&#xff0c;管理自己的文章&#xff0c;评论文章等功能&#xff1b;而管理员端主要有登录&#xff0c;查看近期数据&#xff0c;查看日志&#…

如何做好迭代回顾 2/4

事故根因分析&#xff1a;上集 北京某软件开发公司&#xff0c;专门为电信供应商做定制软件开发&#xff0c;比如发短信做些推广活动等。公司希望做过程改进&#xff0c;我首次与公司老板访谈&#xff1a; 我&#xff1a;过程改进主要帮助管理层更好达到公司业务目标。你们自己…

365天深度学习训练营-第T5周:运动鞋品牌识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow2 一、前期工作&#xff1a; 1、导入…

【活动】如何在工作中管理情绪

写在前面 近期发生的新闻热点再度引发公众对稳定情绪和心理健康的关注。有时候我们遇到的最大的敌人&#xff0c;不是运气也不是能力&#xff0c;而是失控的情绪和口无遮拦的自己。如何在工作中保持稳定的情绪&#xff1f;谈谈我的看法。 愤怒的危害 说到愤怒这种情绪&#xf…

基于深度学习的高精度鸟类目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度鸟类目标&#xff08;鹦鹉&#xff08;Crested Myna&#xff09;、麻雀&#xff08;Eurasian Tree Sparrow&#xff09;、黑头文鸟&#xff08;Chestnut Munia&#xff09;、白领翡翠&#xff08;Collared Kingfisher&#xff09;、太阳鸟…

【C语言】进阶指针(二)—>函数指针与回调函数

目录 前言&#xff1a; 一、函数指针 代码1分析&#xff1a; 代码2分析&#xff1a; 二、函数指针数组 三、指向函数指针数组的指针 四、回调函数&#xff08;模拟实现库函数qsort&#xff09; &#xff08;一&#xff09;void*类型指针的作用 &#xff08;二&#xf…

Spark—Shell命令对WordCount案例的基本操作(统计、去重、排序、求平均值及join)

一、统计、去重 1、案例数据介绍 WordCount统计&#xff1a;某电商网站记录了大量的用户对商品的收藏数据&#xff0c;并将数据存储在名为buyer_favorite的文本文件中。文本数据格式如下&#xff1a; 2、启动spark-shell 配置好spark环境&#xff0c;若还没有环境可以参考…

windows下环境问题总结

nacos 启动后在spring 项目中无法加载yml配置文件 spring.datasource.platform mysql 注意一定要放开这行&#xff0c;不放的话&#xff0c;可能会导致服务可以成功注册&#xff0c;但是&#xff0c;我们无法使用局部的 nacos里yml配置文件的属性

Linux:项目自动化构建工具——make/Makefile

文章目录 一.make与Makefile的关系1.Makefile2.make 二.项目清理1.clean2. .PHONY 前言&#xff1a; 本章主要内容有认识与学习Linux环境下如何使用项目自动化构建工具——make/makefile。 一.make与Makefile的关系 当我们编写一个较大的软件项目时&#xff0c;通常需要将多个…

js实现图片压缩

创建一个type"file"的input标签&#xff0c;用于文件上传。 <input type"file" name"" id"upload" value"" />通过js实现图片压缩 window.onload function () {const upload document.getElementById("upload…

9.10UEC++生成、销毁actor

BeginPlay&#xff1a; 1.SpawnActor&#xff1a;<模板类>&#xff08;模板::staticclass&#xff08;&#xff09;&#xff0c;FVector const class&#xff0c;FRotation const class&#xff09; 生成一个actor 2.Destory&#xff08;&#xff09;从世界中销毁一个a…

SSM学习笔记-------Spring(一)

SSM学习笔记-------Spring&#xff08;一&#xff09; Spring_day011、课程介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 2、Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概念…

【zabbix 代理服务器】

目录 一、部署 zabbix 代理服务器1、设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy2、初始化数据库1、创建数据库并指定字符集2、创建 zabbix 数据库用户并授权 3、导入数据库信息4、修改 zabbix-proxy 配置文件5、启动 zabbix-proxy6、在所有主机上配置 hosts 解析7、在…

Maven高级(四)--私服

一.作用 我们所拆分的模块是可以在同一个公司各个项目组之间的项目组之间进行资源共享的&#xff0c;这就需要Maven的私服来实现。 二.场景 两个项目组之间如何基于私服进行资源的共享的呢&#xff1f; 例如A开发了一个模块tlias-utils,B团队进行项目开发&#xff0c;要想使用…

CentOS7 主机万兆网卡配置端口聚合后如何与华为交换机连接并上网

环境: 组装机测试服务器 CentOS 7 CentOS Linux release 7.7.1908 (Core) 网卡1:瑞昱普通千兆板载网卡 网卡2:EB-LINK intel 82599芯片PCI-E X8 10G 光模块千兆单模1310 交换机 HW-S1730S-S48T4S-A Version 5.170 (S1730 V200R021C01SPC200) 光模块千兆单模1310 …