自动化测试 selenium 篇

✏️作者:银河罐头
📋系列专栏: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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音seo源码--矩阵系统开发者日志

这是矩阵系统源码开发者的日志分享&#xff0c;我们致力于为开发者们提供优质的SEO源码。我们研究用户行为、数据分析和搜索引擎算法&#xff0c;以提高内容的搜索排名和曝光度。通过不断优化关键词、元数据和链接策略&#xff0c;我们帮助抖音用户更好地被发现和分享。这个日志…

flutter开发实战-指纹、面容ID验证插件实现

flutter开发实战-指纹、面容ID验证插件实现 在iOS开发中&#xff0c;经常出现需要指纹、面容ID验证的功能。 指纹、面容ID是一种基于用生物识别技术&#xff0c;通过扫描用户的面部特征来验证用户身份。 一、效果图 二、iOS指纹、面容ID验证 在iOS中实现指纹、面容ID验证功能…

如何用爬虫实现GPT功能

如何用爬虫实现GPT功能&#xff1f; GPT&#xff08;Generative Pre-trained Transformer&#xff09;和爬虫是两个完全不同的概念和技术。GPT是一种基于Transformer模型的自然语言处理模型&#xff0c;用于生成文本&#xff0c;而爬虫是一种用于从互联网上收集数据的技术。 …

【数据结构与算法】力扣:对称二叉树

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 来源&#xff1a;…

GlusterFs 分布式复制卷(Distributed-Replicate)性能测试

目录 fio工具参数解释 Glusterfs 和NFS 性能测试 顺序写&#xff1a; 随机写&#xff1a; 顺序读&#xff1a; 随机读&#xff1a; 随机读写&#xff1a; 参数说明&#xff1a; 测试结论&#xff1a; 与NFS对比 压测对比结果 NFS和GlusterFs的优缺点 NFS的优点 NFS…

看完这篇异地多活的改造,我决定和架构师battle一下

1. 简述 异地多活的概念以及为什么要做异地多活这里就不进行概述了。概念性的很多&#xff0c;像什么同城双活、两地三中心、三地五中心等等概念。如果有对这些容灾架构模式感兴趣的可以阅读下这篇文章进行了解&#xff1a;《浅谈业务级灾备的架构模式》。 阅读本篇文章之前&…

脚踏Java知识点

对上节Java的基础语法续讲 三元运算符和if语句格式的区别 语法格式&#xff1a; 三元运算符的语法格式是&#xff1a;(condition) ? expression1 : expression2&#xff1b; if语句的语法格式是&#xff1a; if (condition) { // 执行 expression1 } else { // 执行 express…

API全场景零码测试机器人——ATGen带来“超自动化”测试模式

HDC期间可参与新手入驻华为云Testplan抽奖活动&#xff0c;活动链接在文末 众所周知&#xff0c;软件服务及组件之间的交互主要依赖大量的API接口。以华为云300多个商用云服务为例&#xff0c;平均每个服务含500接口&#xff0c;接口总数高达10万&#xff0c;接口调用上下文业务…

多元回归预测 | Matlab基于鹈鹕算法(POA)优化径向基神经网络(POA-RBF)的数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于鹈鹕算法(POA)优化径向基神经网络(POA-RBF)的数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清…

IDE /skipping incompatible xxx_d.dll when searching for -lxxx_d

文章目录 概述场景复现用以测试的代码编译器位数不匹配导致?保持编译器类型一致再验证编译器位数的影响MingW下调用OS的库咋不告警?以mingW下使用winSocket为例MingW下网络编程的头文件分析该环境下链接的ws2_32库文件在哪里&#xff1f;mingW为啥可以兼容window下的动态库 概…

【Flutter】Audioplayers 4.1.0 简要使用说明

文章目录 一、前言二、安装和设置三、基本使用1.创建 AudioPlayer 实例2.设置音频源3.控制播放 四、示例代码五、总结 一、前言 Audioplayers 是一个非常实用的 Flutter 插件&#xff0c;它可以帮助我们在 Flutter 应用中播放音频。无论你是想在你的应用中添加背景音乐&#x…

Docker: 改变容器化世界的革命性技术

目录 1.1什么是虚拟化 1.2什么是Docker 1.3容器与虚拟机的比较 1.4Docker组建 2、Docker安装 2.2设置ustc的镜像 2.3Docker的启动与停止 3、docker常用命令 3.1镜像 3.2容器相关命令 1.1什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;Vitualization&#x…

如何从一个仪表盘管理多个WordPress网站?

您是否正在寻找一种管理多个WordPress网站的简单方法&#xff1f; 监控多个网站并使其保持更新可能非常耗时。 幸运的是&#xff0c;有几种 WordPress 管理工具可以让您从单个仪表板管理多个 WordPress 网站变得非常容易。这将帮助您节省大量时间&#xff0c;同时使所有 Word…

赋能智能智造-RK3568智能主板助力机器人产业高速发展

机器人作为现代制造业的重要一环&#xff0c;正在以惊人的速度推动着生产效率和智能化水平的提升&#xff0c;它们在生产线上的准确操作和高效工作&#xff0c;为企业带来了巨大的竞争优势。关于工业机器人的编程和控制技术&#xff0c;在过去几年中已经有了很多发展和新的应用…

Coggle 30 Days of ML(23年7月)任务九:学会Bert基础,transformer库基础使用

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务九&#xff1a;学会Bert基础&#xff0c;transformer库基础使用 任务九&#xff1a;学会Bert基础&#xff0c;transformer库基础使用 说明&#xff1a;在这个任务中&#xff0c;你将学习Bert模型的基础知识&#xff…

【安全】Xsslabs(1~13)基于白盒测试浅析

目录 环境 关卡 level 1 level 2 level 3 level 4 level 5 level 6 level 7 level 8 扩展 level 9 level 10 level 11 level 12 level 13 总结 环境 PHP&#xff1a;php7.3.4nts 中间件&#xff1a;Nginx1.15.11 工具&#xff1a;Hackbar 关卡 level …

计网简答题

答案不保证正确性&#xff0c;仅供参考。 1.有如图所示的以太网&#xff0c;每个交换机的名字及接口号、主机的名字及MAC地址都标明在图中。网络初启动时&#xff0c;两个交换机的转发表都为空&#xff0c;接着先后进行以下MAC帧传输&#xff1a;H1→H5&#xff0c;H3→H2&…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】

上一篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试_hkNaruto的博客-CSDN博客 虚拟机时间&#xff0c;一天后获得结果 由于ssh版本太低&#xff0c;采用nc把文件拷贝出来 结果 SPEC CFP2006 Result Copyright 2006-2023 Standard Performance Evaluation Corporatio…

vue3+cesium项目搭建

前言 最近需要在一个Vue3的项目中使用到cesium&#xff0c;对于一个cesium没有太多了解的人来说&#xff0c;还是比较麻烦的&#xff0c;本篇博文就将自己在这个过程踩的坑记录下来&#xff0c;有需要的可以看一下 1、vuecesium框架搭建 2、项目运行起来后&#xff0c;球体不…

IP协议【图解TCP/IP(笔记九)】

文章目录 IP即网际协议IP相当于OSI参考模型的第3层网络层与数据链路层的关系 IP基础知识IP地址属于网络层地址路由控制■ 发送数据至最终目标地址■ 路由控制表 数据链路的抽象化IP属于面向无连接型 IP即网际协议 TCP/IP的心脏是互联网层。这一层主要由IP&#xff08;Internet…