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);//遍历listfor(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/");// 获取页面的titleString 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/");//获取当前页面的urlString currentUrl = webDriver.getCurrentUrl();//判断当前页面的url与指定跳转的页面的url是否相同if(currentUrl.equals("https://www.baidu.com/")) {System.out.println("测试通过,当前页面url:" + currentUrl);}else {System.out.println("测试不通过");}webDriver.quit();}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用C语言实现学生信息管理系统

前言 在我们实现学生信息管理系统的过程中&#xff0c;我们几乎会使用到C语言最常用最重要的知识&#xff0c;对于刚学习完C语言的同学来说是一次很好的巩固机会&#xff0c;其中还牵扯到数据结果中链表的插入和删除内容。 实现学生信息管理系统 文件的创建与使用 对于要实现…

设计模式13——桥接模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式&#xff08;Bridge&a…

存储器和CPU的连接与TCP的流量控制

存储器与CPU的连接 存储容量的拓展 &#xff08;1)位拓展&#xff1a;增加存储字长 &#xff08;2&#xff09;字拓展 增加存储器字的数量 例题&#xff1a;设CPU有16根地址线&#xff0c;8根数据线&#xff0c;并用MREQ作为访问存储控制信号(低电平有效)&#xff0c;WR作为…

建议大家少用点儿网站测速工具

春节休息期间明月有接了几个服务器代运维的业务&#xff0c;期间就发现不少新手站长们还在用 17ce、站长工具等等这些网站测速工具来评判站点访问速度的&#xff0c;感觉很有必要给大家聊聊这个事儿&#xff0c;因为这毕竟也是一个涉及服务器安全的一个重要环节了。 其实&#…

C++ list类

目录 0.前言 1.list介绍 1.1优势 1.2劣势 1.3容器属性 2.list使用 2.1构造函数 2.1.1默认构造函数 2.1.2填充构造函数 2.1.3范围构造函数 2.1.4拷贝构造函数 2.1.5初始化列表构造函数 2.2迭代器 2.2.1 begin() 2.2.2 end() 2.2.3 cbegin() 2.2.4 cend() 2.2.…

100个 Unity小游戏系列四 -Unity 抽奖游戏专题二 水果机游戏

一、演示效果 二、知识点 2.1 布局 private void CreateItems(){for (int i 0; i < rewardDatas.Length; i){var reward_data rewardDatas[i];GameObject fruitOjb;if (i < itemRoot.childCount){fruitOjb itemRoot.GetChild(i).gameObject;}else{fruitOjb Instant…

MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序【含Matlab源码 MX_005期】

算法思路介绍&#xff1a; 1. 数据准备阶段&#xff1a; 生成一个合成数据集 X&#xff0c;其中包含三个簇&#xff0c;每个簇分布在不同的区域。 定义聚类层数 L 和每个层次的子集数量 l。 2. 聚类阶段&#xff1a; 使用K均值聚类算法将初始数据集 X 分成 l 个簇。…

mac m1安装homebrew管理工具(brew命令)完整流程

背景 因为mac上的brew很久没用了&#xff0c;版本非常旧&#xff0c;随着mac os的更新&#xff0c;本机的homebrew大部分的功能都无法使用&#xff0c;幸好过去通过brew安装的工具比较少&#xff0c;于是决定重新安装一遍brew。 卸载旧版brew 法一&#xff1a;通过使用线上…

【PB案例学习笔记】-13 徒手做个电子时钟

写在前面 这是PB案例学习笔记系列文章的第11篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

渗透测试工具Cobalt strike-2.CS基础使用

三、结合metasploit,反弹shell 在kali中开启使用命令开启metasploit msfconsole ┌──(root㉿oldboy)-[~] └─# msfconsole --- msf6 > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp --- msf6 exploit(multi/handler) > show …

【5.基础知识和程序编译及调试】

一、GCC概述&#xff1a;是GUN推出的多平台编译器&#xff0c;可将C/C源程序编译成可执行文件。编译流程分为以下四个步骤&#xff1a; 1、预处理 2、编译 3、汇编 4、链接 注&#xff1a;编译器根据程序的扩展名来分辨编写源程序所用的语言。根据不同的后缀名对他们进行相…

058.最后一个单词的长度

题意 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 难度 简单 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输…

excel表格里怎样不删除0,又不显示0呢?

在单元格里不显示0&#xff0c;大体上有这么几种方法&#xff1a; 1.设置单元格自定义格式 选中数据区域&#xff0c;鼠标右键&#xff0c;点一下设置单元格格式&#xff0c;选中数字&#xff0c;自定义&#xff0c;在右侧的类型栏&#xff0c;设置格式&#xff1a; [0]&quo…

android11禁止进入屏保和自动休眠

应某些客户要求&#xff0c;关闭了开机进入屏保&#xff0c;一段时间会休眠的问题。以下diff可供参考&#xff1a; diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/value…

《微服务王国的守护者:Spring Cloud Dubbo的奇幻冒险》

5. 经典问题与解决方案 5.3 服务追踪与链路监控 在微服务架构的广袤宇宙中&#xff0c;服务间的调用关系错综复杂&#xff0c;如同一张庞大的星系网络。当一个请求穿越这个星系&#xff0c;经过多个服务节点时&#xff0c;如何追踪它的路径&#xff0c;如何监控整个链路的健康…

ssm校园疫情防控管理系统-计算机毕业设计源码30796

目 录 摘要 1 绪论 1.1目的及意义 1.2开发现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 校园疫情防控管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…

[ C++ ] 深入理解模板( 初 阶 )

函数模板 函数模板格式 template <typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){} 注意&#xff1a; typename是用来定义模板参数关键字&#xff0c;也可以使用class(切记&#xff1a;不能使用struct代替class) 函数模板的实例化 模板参数…

Simulink从0搭建模型07-P8for循环的使用

Simulink从0搭建模型07-P8for循环的使用 今日学习内容1. For Iterator Subsystem模块介绍1.1. 累加器1.2. For Iterator1.3.小结 2. states介绍3. Set next i&#xff08;相当break)学习心得 今日学习内容 b站视频 【Simulink 0基础入门教程 P8 for循环的使用 For Itrator Sub…

前端中 dayjs 时间的插件使用(在vue 项目中)

Day.js中文网 这是dayjs的中文文档 里面包括了使用方法 下面我来详细介绍一下这个插件的使用 Day.js 可以运行在浏览器和 Node.js 中。 一般咱直接是 npm 安装 npm install dayjs 目前应该使用的是Es6 的语法 import dayjs from dayjs 当前时间 直接调用 dayjs() 将返回…