【自动化测试】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/bicheng/36823.shtml

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

相关文章

2024年6月京东睡眠呼吸暂停和低通气事件检测赛题-baseline

赛题地址&#xff1a;DC竞赛-大数据竞赛平台 (datacastle.cn) 一、数据集介绍 train_x训练数据集特征描述&#xff0c;其样本分布不均匀&#xff0c;0样本29808&#xff0c;1样本3221&#xff0c;2样本4520&#xff0c;共计37549条样本 第一维度&#xff1a;60 位受试样本数总…

一个多智能体AI搜索工具

brainstorm.cool 是最近刚留意到的一个小工具&#xff0c;因为好奇去体验了一把&#xff0c;简单写一下使用体验。 初体验 界面比较清爽&#xff0c;检索结果包括Status、多Agent回答、Relates和右侧的Sources。从Status可以大致了解检索过程&#xff1a;Web Search - Decisio…

pythons工具——裁剪labelme的json不规则多边形标签保存成矩形图像

原图labelme标注 使用以下程序&#xff0c;裁剪labelme的json不规则多边形标签保存成矩形图像 import os import cv2 import math import json import numpy as np from PIL import Image, ImageDrawdef calculate_bounding_box(points):"""计算多边形的最小外…

二次封装 el-dialog 实现 全屏和最小化 功能

效果 封装后的组件 <template><el-dialog v-model"dialogVisible" :show-close"false" :fullscreen"fullscreen" draggable overflow><template #header"{ close }"><div><span style"font-weight: b…

图像增强及运算篇之图像掩膜直方图和HS直方图

一.图像掩膜直方图 如果要统计图像的某一部分直方图&#xff0c;就需要使用掩码&#xff08;蒙板&#xff09;来进行计算。假设将要统计的部分设置为白色&#xff0c;其余部分设置为黑色&#xff0c;然后使用该掩膜进行直方图绘制&#xff0c;其完整代码如下所示。 # -*- codi…

OurBMC运营委员会2024年上半年度例会顺利召开

6 月 27 日&#xff0c;OurBMC 社区运营委员会 2024 年上半年度例会顺利召开。本次会议采用线上线下结合的方式&#xff0c;各委员在会上听取了 2024 年上半年社区运营委员会的工作总结汇报&#xff0c;并规划了下半年运营重点工作&#xff0c;同时针对社区活动改进、运营规划开…

【OpenSSH】关于操作系统中的自带的SSH你知道怎么用吗

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、如何开启SSH服务2.1 什么是OpenSSH2.2 对于Windows 10, Windows 11系统2.2.1 如…

车载测试工程师在行业中有哪些挑战需要面对?

车载测试工程师在行业中面临着多方面的挑战&#xff0c;这些挑战涵盖了技术、安全、法规以及市场环境等多个层面。 1. 技术挑战&#xff1a; 复杂性与集成性&#xff1a;现代汽车系统由众多模块和子系统组成&#xff0c;包括发动机控制、安全系统、娱乐系统、导航系统等。这些系…

【C++】————类和对象(上)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月21日 一、类与对象的初步认识 1、类其实就是对对象的抽象&#xff0c;而对象就是对类的具体实例 类不占用内存&#xff0c;而对象占用内存。 2、面向对象与面向过程 C语言是面…

【03】从0到1构建AI生成思维导图应用 -- Agent 搭建

【03】从0到1构建AI生成思维导图应用 – Agent 搭建 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;https…

备忘录标签怎么弄 备忘录标签设置方法

在繁忙的生活中&#xff0c;我们常常需要记录各种琐事、工作任务和灵感闪现。备忘录成了我们不可或缺的助手&#xff0c;但随着时间的推移&#xff0c;备忘录里的内容越来越多&#xff0c;如何高效地管理和查找这些信息成了一个大问题。这时&#xff0c;备忘录的标签功能就显得…

vxe-vxeTable使用vxe-colgroup分组合并表头,基础上合并

1.例 vxe-colgroup分组完成&#xff0c;需要实现两个合并合并成一行 基础合并完成 2.实现思路 由于表头字段固定&#xff0c;在进行vxe-colgroup分组合并&#xff0c;实现基础的表头合并&#xff1b;组件库官网对于表头合并并没有方法&#xff1b; 1.官网API知可以给对应的表…

新能源电燃灶:变革与优势

在当今社会&#xff0c;能源问题日益凸显&#xff0c;能源危机成为了全球关注的焦点。而在厨房领域&#xff0c;一种名为新能源电燃灶的产品正逐渐走进人们的视野&#xff0c;以华火电燃灶为例&#xff0c;它展现出了令人瞩目的特点和潜力。 随着传统能源的逐渐枯竭和环境压力的…

智芯开发板----环境配置

一、软件准备 Keil IDE/ IAR IdeSupport_Install_Package已经上传到资源中自行下载即可。 二、IAR环境配置 1.首先将IdeSupport_Install_Package内的IAR文件复制到你的IAR安装路径中如图所示&#xff1a; 2.按如图所示的路径进行复制即可 3.以记事本的方式打开这个xml文件…

零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算 四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式 五.CubeMX配置一个ADC采集例程六.CubeMX工程源…

大厂程序员上班猝死成常态?

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 近日&#xff0c;连续看到大厂程序员猝死、低血糖晕倒的新闻&#xff0c;同为程序员感到很难受。互联网加班成常态这是既定事实&#xff0c;尤其在这个内卷严重、经济不景气的环境中&#xff0c;加班…

【漏洞复现】电信网关配置管理系统——命令执行

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 电信网关配置管理系统是一个用于管理和配置电信网关设备的软件系…

高性能Web服务器-Nginx的常用模块

文章目录 Nginx安装Nginx平滑升级与回滚平滑升级流程第1步&#xff0c;下载新版本第2步&#xff0c;编译第3步&#xff0c;执行make第4步&#xff0c;对比新旧版本第5步&#xff0c;备份旧nginx二进制文件第6步&#xff0c;模拟用户正在访问nginx第7步&#xff0c;替换旧的ngin…

【资源】太绝了!整整16本Python必看书籍详细讲解,适合零基础小白,高清电子版PDF开放下载,带你从入门到入土~

小编为初学Python的朋友们汇总了16本零基础入门书籍&#xff0c;包括Python三剑客等&#xff0c;都是在编程届多年畅销的书籍&#xff0c;也是众多从业者的选择&#xff0c;全文详细介绍了书籍主要内容&#xff0c;有需要的宝子根据自身情况自取 【教程领取方式在文末&#xff…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;农场资讯管理&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;用户分享管理&#xff0c;分享类型管理&#xff0c;商品信息管理&#xff0c;商品类型管理 开发系统&#xff1a;Windows 架构模式…