【自动化测试】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.rhkb.cn/news/365350.html

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

相关文章

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息&#xff0c;在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…

HTTP协议和Nginx

一、HTTP协议和Nginx 1.套接字Socket 套接字Socket是进程间通信IPC的一种实现&#xff0c;允许位于不同主机&#xff08;或同一主机&#xff09;上不同进程之间进行通信和数据交换&#xff0c;SocketAPI出现于1983年BSD4.2实现在建立通信连接的每一端&#xff0c;进程间的传输…

【单元测试】Controller、Service、Repository 层的单元测试

Controller、Service、Repository 层的单元测试 1.Controller 层的单元测试1.1 创建一个用于测试的控制器1.2 编写测试 2.Service 层的单元测试2.1 创建一个实体类2.2 创建服务类2.3 编写测试 3.Repository 1.Controller 层的单元测试 下面通过实例演示如何在控制器中使用 Moc…

Uniapp 默认demo安装到手机里启动只能看得到底tab无法看到加载内容解决方案

Uniapp 默认demo安装到手机里以后&#xff0c;启动APP只能看到底tab栏&#xff0c;无法看到每个tab页对应的内容&#xff0c;HBuilder会有一些这样的报错信息&#xff1a; Waiting to navigate to: /pages/tabBar/API/API, do not operate continuously: 解决方案&#xff1a;…

OpenCV 调用自定义训练的 YOLO-V8 Onnx 模型

一、YOLO-V8 转 Onnx 在本专栏的前面几篇文章中&#xff0c;我们使用 ultralytics 公司开源发布的 YOLO-V8 模型&#xff0c;分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务&#xff0c;实验后发现效果都非常的不错&#xff0c;但是前面的演示都是基于 ultralytics…

SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问

本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。 我测试的版本是,其他版本不确定是否也正常,测试过没问题的小伙伴,可以在评论区将测试过的版本号留下,方便他人参考: <spring-boot.version>2.3.12.RELEASE</spring-boot.vers…

快速将网页封装成APP:小猪APP分发助您一臂之力

你是否曾经有一个绝妙的网页&#xff0c;但苦于无法将其变成手机APP&#xff1f;其实&#xff0c;你并不孤单。越来越多的企业和开发者希望将自己的网站封装成APP&#xff0c;以便更好地接触到移动端用户。我们就来聊聊如何快速将网页封装成APP&#xff0c;并探讨小猪APP分发在…

「C++系列」C++ 数据类型

文章目录 一、C 数据类型二、C 数据类型占位与范围三、类型转换1. 隐式类型转换&#xff08;Automatic Type Conversion&#xff09;2. 显式类型转换&#xff08;Explicit Type Conversion&#xff09;3. 示例代码 四、数据类型案例1. 整型2. 浮点型3. 字符型4. 布尔型5. 枚举类…

《Programming from the Ground Up》阅读笔记:p1-p18

《Programming from the Ground Up》学习第1天&#xff0c;p1-18总结&#xff0c;总计18页。 一、技术总结 1.fetch-execute cycle p9, The CPU reads in instructions from memory one at a time and executes them. This is known as the fetch-execute cycle。 2.genera…

九浅一深Jemalloc5.3.0 -- ①浅*编译调试

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。5.3.0的特性请见Releases jemalloc/jemalloc GitHub 另…

fastapi+vue3前后端分离开发第一个案例整理

开发思路 1、使用fastapi开发第一个后端接口 2、使用fastapi解决cors跨域的问题。cors跨域是浏览器的问题&#xff0c;只要使用浏览器&#xff0c;不同IP或者不同端口之间通信&#xff0c;就会存在这个问题。前后端分离是两个服务&#xff0c;端口不一样&#xff0c;所以必须要…

Java单体架构项目_云霄外卖-特殊点

项目介绍&#xff1a; 定位&#xff1a; 专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件商品 分为&#xff1a; 管理端&#xff1a;外卖商家使用 用户端&#xff08;微信小程序&#xff09;&#xff1a;点餐用户使用。 功能架构&#xff1a; &#xff08…

ESP32实现UDP连接——micropython版本

代码&#xff1a; import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…

【想起就补】整理了一些SSH中常用的命令

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、常用命令类型2.1 远程登录相关2.2 文件操作命令2.3 权限和所有权操作命令2.4 文…

MT6989(天玑9300)芯片性能参数_MTK联发科5G处理器

MT6989是联发科Dimensity旗舰系列的成员&#xff0c;旨在为旗舰5G智能手机供应商提供最先进的技术和性能。MT6989也是联发科目前最具创新和强大的5G智能手机芯片&#xff0c;具有领先的功耗效率&#xff0c;无与伦比的计算架构&#xff0c;有史以来最快和最稳定的5G调制解调器&…

【操作系统期末速成】 EP04 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点七&#xff1a;进程通信2.2 考点八&#xff1a;线程的概念2.3 考点九&#xff1a;处理机调度的概念及原则2.4 考点十&#xff1a;调度方式与调度算法 一、前言&#x1f680;…

邀请函 | 极限科技全新搜索引擎 INFINI Pizza 亮相 2024 可信数据库发展大会!

过去一年&#xff0c;在全球 AI 浪潮和国家数据局成立的推动下&#xff0c;数据库产业变革不断、热闹非凡。2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;“2024 可信数据库发展大会” 将于 2024 年 7 月 16-17 日在北京悠唐皇冠…

docker仓库--centos7.9部署harbor详细过程与使用以及常见问题

文章目录 前言1.docker-compose是什么2.harbor是什么 centos7部署harbor详细过程与使用环境一、部署docker二、部署harbor1.下载docker-compose工具2.harbor安装3.拷贝样本文件&#xff0c;并修改文件4.安装harbor&#xff0c;安装完成自行启动5.查看 三、harbor的使用1.创建项…

2024第17届中国西部体育博览会

2024第17届中国西部体育博览会 主办单位&#xff1a; 中国西部教体医融合博览会组委会 承办单位&#xff1a;重庆中博展览有限公司 展会背景&#xff1a; 四川和重庆是教育大省&#xff0c;体育大省。成渝双城经济圈的出台&#xff0c;构建以国内大循环为主体、国内国际双循环…

探索人工智能和LLM对未来就业的影响

近年来&#xff0c;人工智能&#xff08;AI&#xff09;迅猛发展&#xff0c;引发了人们的兴奋&#xff0c;同时也引发了人们对就业未来的担忧。大型语言模型&#xff08;LLM&#xff09;就是最新的例子。这些强大的人工智能子集经过大量文本数据的训练&#xff0c;以理解和生成…