Selenium 自动化测试工具(1) (Selenium 工作原理,常用API的使用)

文章目录

  • 什么是自动化测试
  • 什么是测试工具:
  • Selenium 工作原理(重要)
  • Selenium API
    • 定位元素
      • CSS 选择器
      • xpath 定位元素
    • 通过Java代码实现自动化
      • 1. 定位元素
      • 2. 关闭浏览器
      • 3. 获取元素文本
      • 4. 鼠标点击与键盘输入
      • 5. 清空内容
      • 6.打印信息

什么是自动化测试

关于自动化,很好理解,比如,像菜鸟,京东,顺丰等这样的快的公司,在早期时,进行快递的筛选,快递的配送,都是人工进行,而现在随着科技的进步,这些工作就可以使用机器进行代替,效率也能得到了大大的提高,所以自动化测试就是:

将人工要做的测试工作转换成让代码去执行测试,以提高测试效率和测试的质量。

什么是测试工具:

测试工具可以是一个jar包,用的时候,导入这个包,调用方法使用,或者是一个web网站,输入测试数据进行测试,或者是一个exe程序,就例如fiddler工具这样,测试工具是各种各样的,

Selenium 工作原理(重要)

Selenium 是一个主要用于对 Web 程序进行自动化测试的工具, 主要应用于页面当中,模拟用户操作浏览器,实现 UI 自动化测试。它有三大组件,分别是:

在这里插入图片描述

Selenium WebDrive:Selenium WebDrive 提供了很多的API,测试人员通过调用这些接口,来访问浏览器驱动,浏览器驱动再操作浏览器。

Selenium 工作原理:

通过以下例子讲解 Selenium 的工作原理:

比如,我们坐出租车到指定的地方这样的一个例子,这里面就涉及到三个角色:我自己,司机,出租车,如下图:

在这里插入图片描述

Selenium 的工作原理也就是这样的,Selenium 里面也有三个角色:

自动化代码:自动化测试代码发送请求给浏览器驱动(比如Chrome驱动,火狐驱动)

浏览器驱动:它来解析解析自动化测试代码,然后发送给浏览器。

浏览器:执行浏览器驱动发来的指令,最终完成工程师想要的操作。

下面通画图讲解一下 Selenium WebDriver 和 浏览器之间如何通信:

  • 自动化脚本 和 浏览器驱动之间是 C/S 架构(客户端-服务器),两者之间使用的是 HTTP 协议,对于每一条 Selenium 脚本,都会创建一个HTTP请求发送给浏览器驱动。
  • 在浏览器驱动中,包含了一个服务器,用来接收这些http请求
  • 服务器收到请求后,进行解析,发送给浏览器
  • 浏览器执行具体的测试步骤
  • 浏览器执行完之后,将执行结果返回给服务器
  • 服务器又将结果返回给自动化测试代码,如果是错误的http代码,我们就会在控制台看到对应的报错信息

在这里插入图片描述

问题:驱动是同一个,假如是 Chrome 驱动,在客户端使用 Java 或 python 代码,但是为什么可以同时接收 Java 请求和 python请求呢?

这个驱动里面并不是说可以同时接收两种代码,而是支持一种通用的协议,WebDriver 里遵循的一个协议叫作 Json Wire protocol,它们传输的数据格式是 Json 的,可以理解成在HTTP协议之上,再封装了一层这样的公共协议,通过这层协议,就可以解决多种语言。

Selenium API

使用 Selenium API 需要引入依赖:

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

定位元素

定位元素常用的主要有以下两种:

CSS 选择器

下面介绍几种常见的选择器

  1. 类选择器:. class值(例如:. s_ipt)

  2. id选择器:# id值 (例如:#s_ipt)

  3. 标签选择器:标签名

  4. 父类选择器 子类选择器:父类选择器表达式 子类选择器表达式(例如:#s_ipt #kw)

xpath 定位元素

xpath 是根据指定路径选择一组元素,指定路径时可以通过 “绝对路径”和“相对路径”两种方式。

绝对路径:以 ‘/’ 开头为绝对路径

通过绝对路径查找比较麻烦,如下图:

场景:寻找 html 标签下的 head 标签下的 meta 标签。

在这里插入图片描述

通过绝对路径的方式就是:html/head/meta,就会比较麻烦,如下图:

在这里插入图片描述

相对路径:以 ’//‘ 开头为相对路路径 (推荐)

场景:通过相对路径查寻找 html 标签下的 head 标签下的 meta 标签。

相对路径://meta,这种方式就比较简单,如下图:

在这里插入图片描述

通过相对路径查找时,又可以分为以下几种方式:

场景:通过相对路径查找 form 标签下面的 input 标签,发现 input 标签有多个,所以,可以通过以下几种方式定位。(注意:这里的索引是以1开始的)

  • 相对路径+索引

    路径://form/input[1]

    在这里插入图片描述

  • 相对路径 + 属性的值

    场景:找到 form 标签下 name 属性等于 ”ie“的 input 标签

    路径://form /input[@name=“ie”]

在这里插入图片描述

  • 相对路径 + 通配符

    找到当前路径下面所有等于 hidden 的标签

    路径:// [@*=“hidden”]*

在这里插入图片描述

  • 相对路径 + 文本匹配

    场景:寻找加载某个标签中的文本,例如下图的 a 标签。

    路径://a[text()=“新闻”]

    在这里插入图片描述

在这里插入图片描述

CSS 选择器和 xpath的区别

CSS 选择器的效率比xpath高,因为,xpath 是通过路径来确定某个元素的,所以有一个路径扫描的开销。

通过Java代码实现自动化

1. 定位元素

场景:通过 Java 代码打开浏览器,定位“百度一下”按钮,如下图:

在这里插入图片描述

代码实现:

 public static void main(String[] args) {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 指定页面
        webDriver.get("https://www.baidu.com");
        //通过 CSS 选择器定位元素
//        WebElement element = webDriver.findElement(By.cssSelector("#su"));
        //通过xpath方式定位元素
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"su\"]"));
        if(element == null) {
            // 表示当前页面中没有指定的元素
            System.out.println("当前页面没有指定的元素");
        }else {
            System.out.println("测试成功");
        }
    }

在这里插入图片描述

小技巧:

在这里插入图片描述

在这里指定定位元素时,需要按照前端的语法进行写代码,所以,有的同学可能会觉得麻烦,下面交给同学们一个小技巧:

在这里插入图片描述

2. 关闭浏览器

关闭浏览器有两种方式:

  • close()
  • quit()

在这里插入图片描述

在打开浏览器时,也会保存一些 Cookie,使用 quit() 关闭浏览器时,会将浏览器中的 Cooike 也清除掉,而 close() 不会。

3. 获取元素文本

第一种情况:

场景:获取下图中地图按钮上的文本,也就是“地图”文本

在这里插入图片描述

   private static void test6() {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 指定浏览器页面
        webDriver.get("https://www.baidu.com");
        // 定位按钮
        WebElement element = webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(3)"));
        // 获取文本
        System.out.println(element.getText());
    }

执行结果:

在这里插入图片描述

第二种情况:

场景:获取”百度一下“按钮中的文本

在这里插入图片描述

如果再使用 getText() 方法就不会获取到,如下图:

在这里插入图片描述

原因:

”地图“ 文本是在两个 a 标签中间夹着,所以通过 getText() 可以获取到,这也就说明了 getText() 用于获取到标签中的文本,但是,”百度一下“ 文本是一个属性的值,所以会报错。

在这里插入图片描述

在这里插入图片描述

解决方法:获取属性的值使用 getAttribute()

  private static void test6() {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 指定浏览器页面
        webDriver.get("https://www.baidu.com");
        // 定位按钮
        WebElement element = webDriver.findElement(By.cssSelector("#su"));
        // 获取文本
        System.out.println(element.getAttribute("value"));
    }

在这里插入图片描述

4. 鼠标点击与键盘输入

场景:通过代码在百度的输入框中输入“软件测试”,然后点击百度一下按钮进入新的页面,在新的页面中查找文本为”软件测试“的元素。

在这里插入图片描述

需要使用到的API:

sendkeys(要输入的文本):自动输入文本

click():自动点击选择的按钮

代码实现:

private static void test2() throws InterruptedException {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 指定浏览器页面
        webDriver.get("https://www.baidu.com");
        // 定位输入框
        WebElement importInput = webDriver.findElement(By.cssSelector("#kw"));
        // 输入文本
        importInput.sendKeys("软件测试");
        // 定位按钮
        WebElement clickButton = webDriver.findElement(By.cssSelector("#su"));
        // 进行点击
        clickButton.click();
        // 获取搜索到的页面中指定的所有元素
        // 因为元素不止一个,所以使用findElements
        // 进行一个睡眠,等待页面加载出来在寻找元素
        sleep(3000);
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        sleep(3000);
        //遍历list
        for(int i = 0; i < elements.size(); i++) {
            if(elements.get(i).getText().equals("软件测试")) {
                //如果元素是“软件测试”则表示测试成功,否则测试失败
                System.out.println("测试成功");
            }else{
                System.out.println("测试失败");
            }
        }
    }

submit() 与 click() 的区别

click() 是点击,submit() 都是提交,而submit() 是提交form标签,submit 操作的元素需要放在 form 标签中,如果不是 form 标签,使用 submit() 进行提交后,在返回时就会报错。而 click() 就没有任何限制。

5. 清空内容

场景:清空输入框中的元素

    private static void test3() {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 指定浏览器页面
        webDriver.get("https://www.baidu.com");
        // 定位输入框
        WebElement importInput = webDriver.findElement(By.cssSelector("#kw"));
        // 输入文本
        importInput.sendKeys("软件测试");
        //清空输入框中内容
        importInput.clear();
    }

6.打印信息

  1. 打印 title

    在这里插入图片描述

    代码实现:

    private static void test7() {
            // 创建浏览器驱动
            WebDriver webDriver = new ChromeDriver();
            // 指定浏览器页面
            webDriver.get("https://www.baidu.com/");
            // 获取页面的title
            String title = webDriver.getTitle();
            System.out.println("当前页面的title:" + title);
            // 关闭浏览器
            webDriver.quit();
        }
    

    执行结果:

    在这里插入图片描述

  2. 获取当前页面的 URL

    getCurrentUrl()

在这里插入图片描述

代码实现:

private static void test8() {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 指定浏览器页面
        webDriver.get("https://www.baidu.com/");
        //获取当前页面的url
        String currentUrl = webDriver.getCurrentUrl();
        //判断当前页面的url与指定跳转的页面的url是否相同
        if(currentUrl.equals("https://www.baidu.com/")) {
            System.out.println("测试通过,当前页面url:" + currentUrl);
        }else {
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

在这里插入图片描述

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

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

相关文章

一个人应该怎么操作抖音小店呢?店铺操作流程给你讲解清楚!

大家好&#xff0c;我是电商小V 现在入驻抖音小店的有很多新手&#xff0c;新手最关心的就是一个人应该如何操作抖音小店&#xff0c;操作抖音小店需要做好哪几步呢&#xff1f;关于这个问题咱们就来详细的讲解一下&#xff0c; 第一点&#xff1a;开店 开店是做店的第一步&…

【Codesys】-执行第三方程序,或Windows脚本

该记录旨在解决RTE作为第一个Windows的一个exe程序不能调用其他程序的问题。 可以实现:在PLC界面打开第三方程序、在PLC界面关闭本机Windows操作系统 首先添加依赖库-SysProcess,3.5.17.0 然后在程序里执行相应的指令&#xff0c;该指令可以被Windows识别为类似于执行Bat文件…

搭建企业级AI应用的流程

搭建企业级AI应用的流程是一个复杂且系统化的工程&#xff0c;它需要从多个维度出发&#xff0c;确保最终的应用既符合企业的业务需求&#xff0c;也具备高效、稳定和可扩展的特性。以下是详细的步骤&#xff1a; 初步接触与需求分析是整个项目的基础。在这一阶段&#xff0c;我…

群晖安装青龙脚本

青龙定时任务管理面板&#xff0c;支持 Python3、JavaScript、Shell、Typescript 这几种环境&#xff0c;通过它可以方便的管理和运行定时任务&#xff08;在某个时间执行一段代码&#xff09;&#xff0c;并且只需简单的配置&#xff0c;就可以在各个平台收到任务执行的结果通…

通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求

目录 一、通过el-tree自定义渲染网页版工作目录 1.1、需求介绍 1.2、使用el-tree生成文档目录 1.2.1、官方基础用法 ①效果 ②代码&#xff1a; 1.2.2、自定义文档目录&#xff08;实现鼠标悬浮显示完整名称、用icon区分文件和文件夹&#xff09; ①效果&#xff08;直接效…

Elasticsearch 分析器的高级用法一(同义词,高亮搜索)

Elasticsearch 分析器的高级用法一&#xff08;同义词&#xff0c;高亮搜索&#xff09; 同义词简介分析使用同义词案例 高亮搜索高亮搜索策略unifiedplainvh 同义词 简介 在搜索场景中&#xff0c;同义词用来处理不同的查询词&#xff0c;有可能是想表达相同的搜索目标。 例…

WIFI国家码设置的影响

记录下工作中关于国家码设置对WIFI的影响&#xff0c;以SKYLAB的SKW99和SDZ202模组为例进行说明。对应到日常&#xff0c;就是我们经常提及手机是“美版”“港版”等&#xff0c;它们的wifi国家码是不同的&#xff0c;各版本在wifi使用中遇到的各种情况与下面所述是吻合的。 现…

桶排序和基数排序

前言&#xff1a; 这篇文章&#xff0c;我们就来了解一些鲜为人知的排序&#xff0c;桶排序和基数排序。 桶排序&#xff1a; 桶排序的思想&#xff1a; 桶排序的思想就是把待排序的数尽量均匀地放到各个桶中&#xff0c;再对各个桶进行局部的排序&#xff0c;最后再按序将各…

数据结构~~链式二叉树

目录 一、基本概念 链式存储概念 二、链式二叉树的结构 链式二叉树结构 构建链式二叉树 二叉树的遍历 二叉树节点和高度等 二叉树销毁 三、链式二叉树的练习 相同的树 对称二叉树 另外一颗子树 二叉树前序遍历 二叉树遍历 四、完整代码 Tree.h Tree.c 五、总结 一…

如何恢复未保存/误删除的Excel文档?

想象一下&#xff0c;您已经在一个非常重要的 Excel 上工作了几个小时&#xff0c;而您的计算机卡住了&#xff0c;您必须重新启动计算机。Excel 文件未保存/误删除&#xff0c;您只是因为忘记点击保存按钮而损失了数小时的工作时间。但是&#xff0c;当您意识到一小时前在 Exc…

U盘引导盘制作Rufus v4.5.2180

软件介绍 Rufus小巧实用开源免费的U盘系统启动盘制作工具和格式化U盘的小工具&#xff0c;它可以快速将ISO镜像文件制作成可引导的USB启动安装盘&#xff0c;支持Windows或Linux启动&#xff0c;堪称写入镜像速度最快的U盘系统制作工具。 软件截图 更新日志 github.com/pbat…

LeetCode:74.搜索二维矩阵

class Solution(object):def searchMatrix(self, matrix, target):M, N len(matrix), len(matrix[0])for i in range(M):for j in range(N):if matrix[i][j] target:return Truereturn False代码解释 这段代码定义了一个名为 Solution 的类&#xff0c;其中包含一个方法 sea…

HoneyTrap蜜罐系统实践操作@FreeBSD

HoneyTrap介绍 HoneyTrap是一个可扩展的开源系统&#xff0c;用于运行、监控和管理蜜罐。 HoneyTrap蜜罐系统通过在网络中部署感应节点&#xff0c;实时感知周边网络环境&#xff0c;并将感应节点的日志进行实时存储和可视化分析&#xff0c;从而实现对网络环境中威胁情况的感…

线程池,日志

所要用到的知识点&#xff1a; 多线程的创建 生产消费模型&#xff0c; 线程锁 条件变量 代码&#xff1a; 线程池日志

linux系统——top资源管理器

在linux系统中&#xff0c;有类似于windows系统中的资源管理器&#xff0c;top用于实时的监控系统的任务执行状态以及硬件配置信息 在linux中&#xff0c;输入top命令&#xff0c;可以进入相应界面&#xff0c;在此界面可以使用一些指令进行操作 如&#xff0c;输入z 可以改变…

齿轮常见故障学习笔记

大家好&#xff0c;这期咱们聊一聊齿轮常见的失效形式&#xff0c;查阅了相关的资料&#xff0c;做个笔记分享给大家&#xff0c;共同学习。 介绍 齿轮故障可能以多种方式发生。如果在设计阶段本身就尽量防止这些故障的产生&#xff0c;则可以产生改更为优化的齿轮设计。齿轮…

区块链会议投稿资讯CCF A--USENIX Security 2025 截止9.4、1.22 附录用率

会议名称&#xff1a;34th USENIX Security Symposium CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2023年接收率29%&#xff0c;2024录用的区块链相关文章请查看 Symposium Topics System security Operating systems security …

springboot结合baomidou dynamic-datasource组件实现多数据源

dynamic-datasource组件实现多数据源 一、背景介绍二、 思路方案三、过程四、总结五、升华 一、背景介绍 博主最近研发的项目中由于业务需要&#xff0c;在项目中使用到多个数据源。使用到了baomidou的dynamic-datasource组件来实现访问不同的数据源。觉得挺有意思的也是进行了…

[JAVASE] 类和对象综合应用 -- 图书管理系统

目录 零. 概览 一. 抽象出图书管理系统所涉及的对象 1.1 Book 1.2 User 1.3 Operation 二. 实现 User 包中的对象 2.1 User父类 2.2 NormalUser 对象 2.3 AdminUser 对象 2.4 小总结(1) 三. 实现Book包中的对象 3.1 Book 对象 3.2 BookList 对象 四. 实现 Operation…

为什么单片机不能直接驱动继电器和电磁阀

文章是瑞生网转载&#xff0c;PDF格式文章下载&#xff1a; 为什么单片机不能直接驱动继电器和电磁阀.pdf: https://url83.ctfile.com/f/45573183-1247189072-10b6d1?p7526 (访问密码: 7526)