软件测试(五)自动化 selenium

文章目录

  • 自动化测试
      • 单元测试:
      • 单元测试:
      • UI自动化
  • selenium工具
    • 定义
    • 特点:
    • 原理:
    • selenium+java环境搭建
    • Selenium+API
    • 获取测试结果:
    • 添加等待
    • 浏览器操作
    • 键盘事件
    • 鼠标事件
    • 多层框架/窗口定位
    • 下拉框处理
    • 弹窗处理
    • 上传文件操作
    • 关闭浏览器
    • 窗口的切换
    • 截图

自动化测试

自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器(代码)执行的过程。(简单而言其实就是降低重复性的工作(大部分是Python))

自动化测试的具体实现,应该是包含下面七个过程的。

  1. 分析:总体把握系统逻辑,分析出系统的核心体系架构。
  2. 设计:设计测试用例,测试用例要足够明确和清晰,覆盖面广而精
  3. 实现:实现脚本,有两个要求一是断言,二是合理的运用参数化。
  4. 执行:执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。
  5. 总结:测试结果的分析,和测试过程的总结是自动化测试的关键。
  6. 维护:自动化测试脚本的维护是一个难以解决但又必须要解决的问题。
  7. 分析:在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本。

在这里插入图片描述
自动化的分类:单元测试,接口测试,UI自动化测试

单元测试:

最大的投入应该在单元测试上,单元测试运行的频率也更加高。

单元测试:

接口测试就是API测试,相对于UI自动化API自动化更加容易实现,执行起来也更稳定。
接口自动化的有以下特点:

  • 可在产品前期,接口完成后介入
  • 用例维护量小
  • 适合接口变动较小,界面变动频繁的项目

常见的接口自动化测试工具有,RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman等。

UI自动化

虽然测试金字塔告诉我们尽量多做API层的自动化测试,但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。并且有时候我们不得不进行UI层的测试。
UI自动化的特点:

  • 用例维护量大
  • 页面相关性强,必须后期项目页面开发完成后介入
  • UI测试适合与界面变动较小的项目

UI层的测试框架比较多,比如Windows客户端测试的AutoIT,web测试的selenium以及TestPlanteggPlant,Robot framework,QTP等

selenium工具

定义

selenium是用来做web自动化测试框架。

特点:

  • 兼容各种浏览器,支持各种平台,支持各种语言
  • 小巧,对于不同的语言它只是一个包而已,而QTP 需要下载安装1个多G 的程序
  • 有丰富的API
  • 支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器执行,相当于分 发机的功能。

原理:

在这里插入图片描述

自动化脚本:通过编写代码
webDriver:需要我们去下载
浏览器:edge浏览器,Chrome浏览器

selenium+java环境搭建

  1. 浏览器这里用Chrome浏览器:官网下载(注意自己浏览器的版本:在浏览器关于里查看)
  2. 下载与之对应的浏览器驱动:webDirver:官网下载
  3. 将压缩包解压后驱动放入java安装的jdk中;
    在这里插入图片描述
  4. 打开idea创建项目,导入依赖pom
		<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency>
  1. 创建测试化代码
public class Main {public static void main(String[] args) {ChromeOptions options=new ChromeOptions();//允许所有的请求options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);//打开一个网页webDriver.get("https://www.baidu.com");}
}
  1. 运行代码
    在这里插入图片描述
    在这里插入图片描述
  2. 此时环境就配好了

Selenium+API

webdriver 提供了一系列的对象定位方法,常用的有以下几种:

id,name,class name,link textpartial,link text,tag name,xpath,css selector

这里的重点是css,xpath

在这里插入图片描述

public class Main {public static void main(String[] args) {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");//找到百度搜索框// WebElement element= webDriver.findElement(By.cssSelector(".s_ipt"));WebElement element=webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//输入一个软件测试element.sendKeys("软件测试");}
}

定位元素findElement:css

css选择语法:

id选择器:#id
类选择:.class
标签选择器:标签名
后代选择器:父级选择器,子级选择器

xPath :
绝对路径:从根目录出发寻找
相对路径:(常用)

1. 相对路径+索引://from/span[2]/input
2. 相对路径+属性://input[@class="s_ipt"]
3. 相对路径+通配符://*[@*="s_ipt"]
4. 相对路径+文本匹配://a[text()="新闻"]

获取测试结果:

public class Main {public static void main(String[] args) throws InterruptedException {int flag=0;ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");//找到百度搜索框// WebElement element= webDriver.findElement(By.cssSelector(".s_ipt"));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"));for (int i=0;i<elements.size();i++){if (!elements.get(i).getText().equals("测试")){flag=1;System.out.println("测试通过");break;}}if (flag==0){System.out.println("测试不通过");}}
}

webdriver 中比较常用的操作对象的方法有下面几个:

  • click: 点击对象
  • sendKeys: 在对象上模拟按键输入
  • clear: 清除对象输入的文本内容
  • submit: 提交(必须from标签中,不然会报错)
  • text: 用于获取元素的文本信息
  • getAttribute 获取控件中的属性值
    private static void test02() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");if (button_value.equals("百度一下")){System.out.println("测试通过");}else {System.out.println(button_value);System.out.println("测试不通过");}}

添加等待

sleep休眠:添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠

隐式等待:通过添加implicitlyWait() 方法就可以方便的实现智能等待;implicitlyWait(30)的用法比time.sleep()更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待

private static void test02() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");//隐式等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);if (button_value.equals("百度一下")){System.out.println("测试通过");}else {System.out.println(button_value);System.out.println("测试不通过");}}

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长。

显示等待

    private static void test02() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
//        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);WebDriverWait wait= new WebDriverWait(webDriver,3000);wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#help > a:nth-child(1)")));}

隐式等待和显示等待区别:
显示等待:可以针对某一个地方进行等待
隐式等待:对全局进行等待

浏览器操作

  1. 浏览器前进,浏览器退后
  private static void test03() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");webDriver.findElement(By.cssSelector("#su")).click();//浏览器后退webDriver.navigate().back();//浏览器前进webDriver.navigate().forward();//浏览器刷新webDriver.navigate().refresh();}
  1. 浏览器滚动条

#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
#将浏览器滚动条滑到最底端, 示例
((JavascriptExecutor)webDriver).executeScript(“document.documentElement.scrollTop=10000”);
其中,executeScript(script, *args),在当前窗口/框架同步执行javaScript

private static void test03() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");webDriver.findElement(By.cssSelector("#su")).click();//浏览器后退webDriver.navigate().back();//浏览器前进webDriver.navigate().forward();//浏览器刷新webDriver.navigate().refresh();//滑动((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");}
  1. 设置浏览器宽、高
webDriver.manage().window().setSize(new Dimension(1000,1000));
  1. 浏览器最大化
 webDriver.manage().window().maximize();
  1. 浏览器全屏
webDriver.manage().window().fullscreen();

键盘事件

要使用键盘按键,必须引入keys 包:
通过send_keys()调用按键:
sendkeys(Keys.TAB) # TAB
sendkeys(Keys.ENTER) # 回车
sendkeys(Keys.SPACE) #空格键
sendkeys(Keys.ESCAPE) #回退键(Esc)

键盘组合键用法

sendkeys(Keys.CONTROL,‘a’) #全选(Ctrl+A)
sendkeys(Keys.CONTROL,‘c’) #复制(Ctrl+C)
sendkeys(Keys.CONTROL,‘x’) #剪贴(Ctrl+X)
sendkeys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)

webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");

鼠标事件

Actions(driver)
生成用户的行为。所有的行动都存储在actionchains 对象。通过perform()存储的行为。
move_to_element(element)
移动鼠标到一个元素中,menu 上面已经定义了他所指向的哪一个元素
perform()
执行所有存储的行为:
Actions类

  • contextClick() 右击
  • doubleClick() 双击
  • dragAndDrop() 拖动
  • moveToElement() 移动
   private static void test05() throws InterruptedException {ChromeOptions options=new ChromeOptions();options.addArguments("--remote--allow-origin=*");WebDriver webDriver=new ChromeDriver(options);webDriver.get("https://www.baidu.com");WebElement webElement=webDriver.findElement(By.cssSelector("#kw"));Actions actions=new Actions(webDriver);sleep(3000);actions.moveToElement(webElement).contextClick().perform();}

多层框架/窗口定位

获取框架
对于一个web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一定的困难。
通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo.frame()把当前定位的主体切换了frame里。

窗口定位
有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switchTo.window用法与switchTo.frame 相同。

下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。

    private static void test06() {WebDriver webDriver=new ChromeDriver();webDriver.get("https://www.baidu.com");WebElement webElement=webDriver.findElement(By.cssSelector("#ShippingMethod"));Select select=new Select(webElement);//通过下标选择select.selectByIndex(3);select.selectByValue("12.5");}

弹窗处理

alert、confirm、prompt 的处理

  • text 返回alert/confirm/prompt 中的文字信息
  • accept 点击确认按钮
  • dismiss 点击取消按钮,如果有的话
  • send_keys 输入值,如果alert 没有对话框就不能用了,不然会报错
    private static void test07() throws InterruptedException {WebDriver webDriver=new ChromeDriver();webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("button")).click();sleep(3000);//alert弹窗取消webDriver.switchTo().alert().dismiss();//点击按钮webDriver.findElement(By.cssSelector("button")).click();//在alert弹窗内输入值webDriver.switchTo().alert().sendKeys("123456");//alert弹窗确认webDriver.switchTo().alert().accept();}

上传文件操作

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。

在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过sendKeys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。

private static void test08() {WebDriver webDriver=new ChromeDriver();webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("input")).sendKeys("本地文件目录");}

关闭浏览器

浏览器的quit和close之间的区别:

  • quit关闭了整个浏览器,close关闭当前的页面。
  • quit清空了浏览器的缓存,close不会清空缓存。
    private static void test09() {WebDriver webDriver=new ChromeDriver();webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("#help > a:nth-child(1)"));//关闭webDriver.quit();webDriver.close();}

窗口的切换

getWindowHandle 方法获取当前
在这里插入图片描述

   private static void test11() throws InterruptedException {WebDriver webDriver=new ChromeDriver();webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("#help > a:nth-child(1)")).click();sleep(3000);//通过这个方法getWindowHandle,获取当前的窗口句柄//通过这个方法getWindowHandles,获取所有的窗口句柄Set<String> handles= webDriver.getWindowHandles();String target_handle="";for ( String handle:handles){target_handle=handle;}webDriver.switchTo().window(target_handle);sleep(3000);webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");webDriver.findElement(By.cssSelector("#s_btn_wr")).click();}

截图

导入依赖:进入Maven仓库

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>
 private static void test12() throws InterruptedException, IOException {WebDriver webDriver=new ChromeDriver();webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");webDriver.findElement(By.cssSelector("#su")).click();sleep(3000);File file=((TakesScreenshot)(webDriver)).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file,new File("D://20231022.png"));}

需要向上转型,TakesScreenshot,然后调用getScreenshotAs方法

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

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

相关文章

怎样才能去除视频中的背景音乐,保留人声?

做视频剪辑&#xff0c;二次创作的朋友&#xff0c;需要去除视频中的背景音乐&#xff0c;保留人声&#xff1b;或者去除人声&#xff0c;保留背景音乐。如果请身边做视频的朋友帮忙&#xff0c;可有时不能沟通到位&#xff0c;完成后的效果并不是很理想&#xff0c;就很尴尬了…

26. 通过 cilium pwru了解网络包的来龙去脉

pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…

低代码助力软件开发

低代码开发工具正在日益变得强大&#xff0c;它正不断弥合着前后端开发之间的差距。对于后端来说&#xff0c;基于低代码平台开发应用时&#xff0c;完全不用担心前端的打包、部署等问题&#xff0c;也不用学习各种框架&#xff08;Vue、React、Angular等等&#xff09;&#x…

Mysql中的RR 隔离级别,到底有没有解决幻读问题

Mysql 中的 RR 事务隔离级别&#xff0c;在特定的情况下会出现幻读的问题。所谓的幻读&#xff0c;表示在同一个事务中的两次相同条件的查询得到的数据条数不一样。 在 RR 级别下&#xff0c;什么情况下会出现幻读 这样一种情况&#xff0c;在事务 1 里面通过 update 语句触发当…

一款简单漂亮的WPF UI - AduSkin

前言 经常会有同学会问&#xff0c;有没有好看简单的WPF UI库推荐的。今天就给大家推荐一款简单漂亮的WPF UI&#xff0c;融合多个开源框架组件&#xff1a;AduSkin。 WPF是什么&#xff1f; WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windo…

大模型基础——大模型范式

大模型背后的范式 整个预训练语言模型的使用范式&#xff1a; 对于预训练模型&#xff0c;最核心的要素是从无标注的数据中去学习&#xff0c;通过自监督的一些任务去做预训练&#xff0c;得到丰富的知识。在具体的应用中&#xff0c;会引入一些任务相关的数据&#xff0c;去调…

C++学习之多态详解

目录 多态的实现 例题 重载 重写 重定义的区别 抽象类 多态实现原理 多态的实现 C中的多态是指&#xff0c;当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执…

万能DIY预约小程序源码系统 上门预约服务小程序搭建 适用于各种预约场景 自由DIY功能模块

在这个快节奏的时代&#xff0c;预约服务已经成为了我们日常生活的一部分。从看病挂号到餐厅预订&#xff0c;从美发美容到家政服务&#xff0c;预约已经深入到了各个领域。然而&#xff0c;传统的预约方式存在着许多不便&#xff0c;如电话预约、在线填写表格等&#xff0c;不…

MyBatis Generator - 快速生成 实体类 和 映射文件

目录 一、MyBatis Generator 的使用 1.1、生成类和映射文件 1.1.1、在 pom.xml 中引入依赖 1.1.2、根据 configurationFile 标签中配置的路径 创建 generatorConfig.xml 文件 1.1.3、自动生成类 和 映射文件 1.1.4、在 Insert 标签中添加获取主键值的选项 1.1.5、扫描配置…

Linux编译器-gcc/g++使用函数库

【Linux】系列文章目录 【Linux】基础常见指令&#xff1a;http://t.csdn.cn/hwLPb 【Linux】基本权限&#xff1a;http://t.csdn.cn/faFZg 【Linux】软件包管理器yum与环境开发工具vim&#xff1a;http://t.csdn.cn/LEqkm 目录 【Linux】系列文章目录 前言 一、gcc选项总…

[C++]类型转换

一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需要发生类型转化。 C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和显式…

python astra相机驱动问题

报错问题&#xff1a; openni.utils.OpenNIError: (OniStatus.ONI_STATUS_ERROR, bDeviceOpen using default: no devices found, None) 解决办法&#xff1a; 1、从sdk中拷贝文件 2、修改openni源码 3、执行测试程序 from openni import openni2 import numpy as np impor…

python中多行注释与取消注释

在小白学习python编程的过程中&#xff0c;我们经常会发现很多同学们喜欢问的一个问题&#xff1a; 怎么多行注释呢&#xff1f; 怎么取消多行注释呢&#xff1f; 以上种种问题我相信来到这里都会得到相应答案 那我们接下来开始吧&#xff01; 文章目录 单行注释多行注释取消多…

docker运行redis镜像

很多项目会用到redis作为缓存用到项目中&#xff0c;鉴于刚了解过docker&#xff0c;今天这里用docker运行redis镜像&#xff0c;这样下载&#xff0c;安装运行&#xff0c;或者是使用后的删除都会干净&#xff0c;简单。 好了&#xff0c;第一步是先拉取镜像&#xff0c;使用d…

adb 获取 Android 设备中已安装的 apk 文件

前言 今天发现手机上一个应用在应用商店已经搜索不到了&#xff0c;想把其推荐给朋友使用&#xff0c;发现不知道从哪里找原始的 apk 安装文件&#xff0c;记录一下。 如何提取 apk 两种方法 MT管理器导出 可以使用 MT管理器(Android 平台逆向神器)&#xff0c;它有个 安装…

centos 7.9 安装sshpass

1.作用 sshpass是一个用于非交互式SSH密码验证的实用程序。它可以用于自动输入密码以进行SSH登录&#xff0c;从而简化了自动化脚本和批处理作业中的SSH连接过程。 sshpass命令可以与ssh命令一起使用&#xff0c;通过在命令行中提供密码参数来执行远程命令。以下是一个示例命…

openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数

文章目录 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数102.1 背景信息102.2 操作步骤 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数 102.1 背景信息 当用户连接数达到上限后&#…

vmware安装 Rocky9(自定义分区安装)

一、下载镜像 访问官网&#xff0c;下载dvd的镜像 Download Rocky | Rocky Linuxhttps://rockylinux.org/download 二、新建vmware虚拟机 1、vmware尽量选择vmware17 2、下一步 3、稍后安装 4、选择系统类型&#xff1a;red hat9 5、自定义安装位置 6、根据电脑配置&#…

LeetCode:2316. 统计无向图中无法互相到达点对数(C++)

目录 2316. 统计无向图中无法互相到达点对数 题目描述&#xff1a; 实现代码与解析&#xff1a; 并查集 原理思路&#xff1a; 2316. 统计无向图中无法互相到达点对数 题目描述&#xff1a; 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为…

AWS Lambda – 函数版本,别名,API网关,CodeDeploy协同

Hello大家好&#xff0c;我们今天继续讨论AWS Lambda的内容。 Lambda函数的版本 Lambda函数的版本和别名是辅助资源&#xff0c;我们可以通过创建这些资源管理函数的部署和调用。 首先&#xff0c;让我们来看一下Lambda 函数版本的概念。您可以使用版本来管理函数的部署。例…