【软件测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录

  • 自动化测试
    • 一、selenium
        • 1.相关介绍
          • 1.Selenium IDE
          • 2.Webdriver
            • webdriver的工作原理:
          • 3.selenium Grid
        • 2.Selenium + Java环境搭建
        • 3.常用API的使用
            • 1.定位元素
            • 2.操作测试对象
            • 3.添加等待
            • 4.打印信息
            • 5.浏览器的操作
            • 6.键盘事件
            • 7.鼠标事件
            • 8.定位一组元素
            • 9.多层框架定位
            • 10.下拉框处理
            • 11.处理alert弹窗
            • 12.上传文件操作
            • 13.截图

自动化测试

  • 单元测试、接口测试、UI自动化测试…

在这里插入图片描述

一、selenium

  • 是自动化测试框架
1.相关介绍
  • Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。
  • 由Selenium IDE, Webdriver,Selenium Grid组成
1.Selenium IDE

​ Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且 能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。 录制的测试脚本可以以多种语言导出,比如java,C#,Python,Ruby等,方便掌握不同语言的测试人员操作。

2.Webdriver

​ Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳出 JavaScript的沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言(Java,C#,Python,Ruby,Perl,JavaScript等)绑定来驱动浏览器对Web元素进行操作和验证。

webdriver的工作原理:

​ 启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为 webdriver的remote server。 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格 式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。 Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操 作。

3.selenium Grid

​ selenium Grid是一个服务器,提供对浏览器实例访问的服务器列表,管理各个节点的注册和状态信息。可以实现在同一时刻不同服务器上执行不同的测试脚本。

2.Selenium + Java环境搭建

在这里插入图片描述

下载浏览器驱动

    <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>

引入依赖

    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");}

测试能否正确运行

3.常用API的使用
1.定位元素

findElement()

类选择器定位、xpath定位

    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"));//类选择器定位WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//XPath定位element.sendKeys("软件测试");}

CSS选择语法

id选择器

        WebElement element = webDriver.findElement(By.cssSelector("#kw"));//id选择器

类选择器

        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));//类选择器定位

xpath定位

1.绝对路径:以/html开头(/html/head/title)不常用

2.相对路径://开头

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

 //form[1]/span[1]/input//form[1]/span[2]/input

相对路径+属性值

 //input[@class="s_ipt"]//input[@value="百度一下"]//input[@id="su"]

相对路径+通配符

 //*[@*="su"]

相对路径+ 文本匹配

//a[text()="文库"]

进行校验

        WebElement element = webDriver.findElement(By.cssSelector("#kw"));//id选择器element.sendKeys("软件测试");//输入软件测试webDriver.findElement(By.cssSelector("#su")).click();//找到百度一下按钮,进行点击sleep(3000);//校验//1.找到搜索结果List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));for (int i = 0;i<elements.size();i++){System.out.println(elements.get(i).getText());if (elements.get(i).getText().contains("测试")){flag = 1;System.out.println("测试通过");break;}}if (flag == 0){System.out.println("测试不通过");}
  • CSS选择器定位元素效率更高
2.操作测试对象

click点击对象

send_keys在对象上模拟按键输入

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

submit 提交

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

getAttribute 获取元素对应属性的值

    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");sleep(3000);webDriver.findElement(By.cssSelector("#kw")).sendKeys("翁佳明java");//找到输入框进行搜索webDriver.findElement(By.cssSelector("#su")).click();//点击按钮sleep(3000);webDriver.findElement(By.cssSelector("#kw")).clear();//清空输入框中的数据}
  • 如果点击的元素放在form标签中,submit和click的效果是一样的。如果点击元素放在非form标签中,此时使用submit会报错。
//        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).click();webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();//会出现报错

getAttribute 获取元素对应属性的值

        String buttonValue = webDriver.findElement(By.cssSelector("#su")).getText();System.out.println(buttonValue);//获取不到属性值,所以用getAttribute获取属性的值System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));//百度一下
3.添加等待
  • sleep强制等待

  • 智能等待(隐式等待、显示等待)

    隐式等待:通常用于等待页面元素出现,而不是等待页面加载完成。在等待时间内不断查询是否定位到元素

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

    显示等待

            WebDriverWait wait = new WebDriverWait(webDriver,3000);wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div111 > p:nth-child(8) > span")));//没找到,报错wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));

    隐式等待和显示等待之间的区别:

    • 隐式等待:等待加载页面上所有的元素,所有元素加载完成后,再执行后续代码。如果超过时间仍没有加载出来,就会报错。等待的是所以的元素。

    • 显示等待:设置的是等待的最长时间,只要满足了设置的条件,就可以执行后续的代码,等待的是设定的条件

4.打印信息

打印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();if (url.equals("https://www.baidu.com/") && title.equals("百度一下,你就知道")){System.out.println("测试通过");}else {System.out.println("测试不提供");}}
5.浏览器的操作

1.浏览器前进

2.浏览器后退

    private static void test07() throws InterruptedException {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");webDriver.findElement(By.cssSelector("#su")).click();sleep(3000);//打开百度,搜索520webDriver.navigate().back();sleep(3000);//浏览器后退webDriver.navigate().refresh();sleep(3000);webDriver.navigate().forward();//浏览器前进}

3.浏览器滚动条操作

在console中输入

document.documentElement.scrollTop=1000;
        sleep(3000);((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");//滚动:把webDriver强转成JS脚本执行JS代码

4.设置页面大小

        webDriver.manage().window().maximize();//最大化sleep(3000);webDriver.manage().window().fullscreen();//全屏sleep(3000);webDriver.manage().window().setSize(new Dimension(600,1000));

5.关闭浏览器

  • quit:关闭整个浏览器、会清空缓存
  • close:关闭当前页面(get的)、不会清空缓存
    private static void test10() throws InterruptedException {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();sleep(3000);
//        webDriver.quit();退出整个浏览器webDriver.close();//关闭当前页面}

6.窗口切换

  • 元素默认是在get的页面当中查找元素的,如果跳转了页面,就需要进行切换
    private static void test10() throws InterruptedException {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();sleep(3000);
//        webDriver.quit();退出整个浏览器
//        webDriver.close();
//        webDriver.getWindowHandles();//获取所有的窗口句柄
//
//        webDriver.getWindowHandle();//获取get打开的窗口句柄Set<String> handles = webDriver.getWindowHandles();String target_handle = "";for (String handle:handles){target_handle = handle;}//拿到最后一个handlewebDriver.switchTo().window(target_handle);//进行窗口切换sleep(3000);webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
6.键盘事件
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");//ctrl+AwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");sleep(3000);//ctrl+XwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");sleep(3000);//ctrl+VwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");sleep(3000);
7.鼠标事件
        //找到图片按钮//进行鼠标右击WebElement element = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));Actions actions = new Actions(webDriver);sleep(3000);actions.moveToElement(element).contextClick().perform();//没有perform就没有效果
8.定位一组元素

定位一组元素

   全选复选框webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);     List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));for (int i = 0; i < webElements.size(); i++) {if (webElements.get(i).getAttribute("type").equals("checkbox")){webElements.get(i).click();}}
9.多层框架定位

​ 通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo().frame把当前定位的主体切换了frame里

<iframe>中,定位不到<a>,会报错。需要进行主体的转换webDriver.switchTo().frame("f1");webDriver.findElement(By.cssSelector("body>div>div>a")).click();
10.下拉框处理
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));Select select = new Select(webElement);select.selectByIndex(1);//根据从0开始的索引选择select.selectByValue("12.51");//根据标签的value值选择	
11.处理alert弹窗
        webDriver.findElement(By.cssSelector("button")).click();sleep(3000);//alert弹窗的取消->点击按钮->在弹窗中输入“520”->alert弹窗的确认webDriver.switchTo().alert().dismiss();//取消sleep(3000);webDriver.findElement(By.cssSelector("button")).click();webDriver.switchTo().alert().sendKeys("520");sleep(3000);webDriver.switchTo().alert().accept();//确定
12.上传文件操作
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\test");//文件上传
13.截图

需要先添加依赖

<!-- 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 screenshotAs = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);//进行强转,进行截图FileUtils.copyFile(screenshotAs,new File("D://20240606jietu.png"));//把文件保存到磁盘中。}

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

[笔记] 卷积03 - 运算的对称性 时域构建高通滤波器的失败尝试

1.卷积运算具备足够好的对称性 1.在计算卷积时&#xff0c;两个函数的位置是可以颠倒的&#xff0c;对吧&#xff1f; 在卷积运算中&#xff0c;确实可以对参与卷积的两个函数进行颠倒。这是因为卷积的定义是通过一个函数与另一个函数的翻转后的形式进行积分运算。具体来说&a…

DPDK概述

文章目录 1. DPDK概述1.1 DPDK 内存管理Mbuf单帧结构:1.2 DPDK内核驱动 igb_uio驱动1.3 DPDK源码下载方式1.4 pktgen源码下载方式1.5 DPDK相关名词解释 1. DPDK概述 Intel DPDK全称Intel Data Plane Development Kit&#xff0c;是Intel提供的数据平面开发工具集&#xff0c;为…

第十三章 Nest Middleware

在上一章我们了解到Nest 并不直接依赖Express 可以切换到别的http 请求处理库 创建项目&#xff1a; nest new middleware-test -p npm创建 middleware &#xff1a; nest g middleware test --no-spec --flat这时候可以看到 req 和 res 的类型都是为 any类型 所以并不知道使…

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void p…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库&#xff1a;CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句&#xff08;如给用户li创建一个学生管理模式“S-T”&#xff09;&#xff08;需要先添加一个用户li&#xff09; 3、在数据库ecommerce1中…

7月4号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT总线使用

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一&#xff0c;结合丰富的运动控制功能、实时数据采集、处理和本地计算等&#xff0c;具备高度灵活的可编程性和出色的运动控制性能&#xff0c;为运动控制协同工业互联网应用带来巨大市场潜力&#xff0c;同时也使其成为企…

ID3算法决策树

步骤&#xff1a; 先计算出信息量&#xff1b;信息熵&#xff1b;信息增量&#xff1b; 再比较信息增量的大小&#xff0c;确定分类依据。 信息量&#xff1a; 信息熵&#xff1a; 信息增益&#xff1a;

Postman使用教程

传统接口风格 RESTful风格 使用Postman完成测试用例目标&#xff1a; Postman教程 &#xff08;1&#xff09;准备工作&#xff0c;下载Postman新建 &#xff08;2&#xff09;登录接口调试-获取验证码 &#xff08;3&#xff09;登录接口调试-登录 &#xff08;4&#xff09;…

Mysql查询IFNULL和想象的不一样

select sum(ifnull(a,0)) aaa,ifnull(sum(a),0) bbb from (select g.goodsid a from goods g where g.goodsid 601 ) tmp #注意 goodsid 601 的不存在 ​​​ 返回的结果和想象中不同&#xff0c;解释如下 在您SQL查询中&#xff0c;创建了一个子查询&#xff08;别名为tmp&a…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

国内外大模型集合

为了满足日益增长的AI需求&#xff0c;我们精心打造了一站式大模型导航网站&#xff0c;旨在成为连接您与全球顶尖人工智能模型的桥梁。无论您是科研工作者、开发者还是对AI充满好奇的探索者&#xff0c;这里都有您所需。 国内大模型精选 通义千问 —— 阿里巴巴集团倾力打造…

某业帮六月校招后端笔试

题目一 解题思路 签到题&#xff0c;dp就行。 题目二 解题思路 这个比较烦人&#xff0c;需要处理额外的引号和括号。用DFS&#xff0c;对于每个间隙&#xff0c;插入与不插入都搜一遍。 题目三 解题思路&#xff1a; 双指针&#xff0c;左右各一个指针&#xff0c;对比长度&…

OpenLCA、GREET、R语言的生命周期评价方法、模型构建

原文链接&#xff1a;OpenLCA、GREET、R语言的生命周期评价方法、模型构建教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx6&sn1b5758206d500399fe7cc69e800f61fe&chksmfa826657cdf5ef413d31557941a1c5db5cc84bba8d0f408c469e05a4118c…

#LinuxC高级 笔记一

linux命令 什么是嵌入式&#xff1f; 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统 计算机系统组成&#xff1f; 硬件、软件 操作系统&#xff1f; ios windows harmo…

k8s_集群搭建_k8s管理前端_dashboard安装部署---分布式云原生部署架构搭建017

然后再去安装一下一个dashboard,有了这个以后,操作k8s集群就不用 一直敲命令了 可以看到上面的命令拿过来,然后 执行就可以了 然后如果执行慢,可以直接先去下载,使用wget,然后再去 也可以在浏览器访问,把内容拿到,然后 下面是内容: # Copyright 2017 The Kubernetes Author…

登 Cell 子刊!清华大学张强锋课题组开发 SPACE 算法,组织模块发现能力领先同类工具

多细胞生物中的细胞尽管共享相同的基因组&#xff0c;但因其内部基因调控网络的差异以及与周围微环境中相邻细胞的外部信号交流&#xff0c;使得它们在形态、基因表达和功能上展现出显著的多样性。为了将细胞类型信息与其在组织内的空间位置相关联&#xff0c;空间转录组学 (Sp…

Vue86-Vuex中的getters属性

一、getters的使用 1-1、index.js中getters的书写 计算属性computed靠return获得返回值&#xff01; 1-2、组件中getters的调用 state是数据源&#xff0c;getters是拿着数据源里的东西进行一番加工。像极了&#xff1a;data和computed 二、小结

vue 启动项目报错Syntax Error: Error: PostCSS received undefined instead of CSS string

启动vue项目然后报错如下图 这个是跟node版本有关系 因为要开发不同的项目使用不同的node版本&#xff0c;所以就用nvm切换&#xff0c;所以导致了node-sass编译问题 执行这个命令就可以 npm install node-sass or npm rebuild node-sass node-sass对于node高版本和低版本切…

智能胎教仪,科技与教育的融合-N9301胎教仪语音方案

随着科学技术的不断进步&#xff0c;人们对婴幼儿教育的认知也日趋成熟和全面。其中&#xff0c;胎教作为一种重要的早期教育方式&#xff0c;近年来备受瞩目。而胎教仪语音芯片的研发&#xff0c;正是为了满足这一需求&#xff0c;为胎儿的健康成长提供更加便捷的胎教方案。 一…

Tomcat服务部署安装

一、Tomcat基础 1.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;Tomcat虽然和Apache或者Nginx这些Web服务器一样&#xff0c;具有处理HTML页面的功能&#xff0c;然而由于其处理静态HTML的能力远不及Apache或者Nginx&#xff0c;所以Tomcat通常…