当前位置: 首页 > news >正文

Selenium自动化测试

自动化主要是进行回归测试,就是检测对程序代码进行修改后是否带来了新的问题 ,以前通过的用例现在是否还能通过。软件版本更迭的速度挺快,自动化测试可以一定程度的减少测试人员的工作量,自动进行这些重复的测试工作,但是不能取代人工测试,因为自动化测试代码由人工编写维护,也不是一定能比人工测试更可靠。

分类

接口自动化测试:编写脚本或使用工具对API进行测试,比web测试更早发现底层的问题;

UI自动化测试(界面测试):包含web自动化测试(浏览器界面),移动端测试(部署在手机上的程序),后端底层代码的缺陷可以通过界面显示;

后面主要介绍web自动化测试;

web自动化测试

驱动

web测试首先要打开浏览器页面,要想程序自动打开,需要安装浏览器的驱动。驱动是一类特殊的软件,是操作体系和硬件设备的桥梁。计算机有了驱动就可以与设备(耳机,摄像头,键盘,麦克风)进行通信。

驱动管理

不同类型不同版本的浏览器的驱动都不同,同一浏览器版本更迭也快,如果手动管理版本的话人会很崩溃,所以就需要版本管理器。

添加依赖

<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope>
</dependency>

WebDriverManager是一个开源java库,以完全自动化的方式对Selenium  WebDriver所需的驱动程序(如chromedriver,geckodriver, msedgedriver等)进行管理(下载,设置,维护),版本5开始,WebDriverManager还提供了其他功能,如发现本地系统中安装浏览器的能力,构键WebDriver对象。

创建驱动对象

WebDriverManager.chromedriver().setup(); //启动谷歌浏览器驱动的版本管理器
ChromeOptions options = new ChromeOptions();  //创建谷歌浏览器配置对象  
options.addArguments("--remote-allow-origins=*", "-headless");//配置参数
WebDriver driver = new ChromeDriver(options);//创建驱动对象

下面用driver表示驱动对象;

Selenium

Selenium 是 编写web自动化测试脚本的工具,提供了许多方法供开发者使用。

添加依赖
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.6.0</version>
</dependency>
元素定位

web自动化测试的核心操作是能找到页面对应的元素,然后才能对元素进行具体的操作,常见元素定位的方式很多,但常用的是cssSelector和xpath;

cssSelector
选择器:选择页面中的指定标签元素,常见元素定位方式可通过id选择器和子类选择器来进行定位;
定位百度首页的“百度热搜”:
打开开发者工具:F12  或者 右键 点击 检查;
百度热搜的位置:#s-hotsearch-wrapper > div > a.hot-title > div > i.c-icon.hot-title-icon
找百度热搜列表的元素:
li:nth-child(2)就表示这个列表的第二行;搜索框是用路径来锁定元素代码位置的;
用选择器还可以得到:
“搜索输输框元素”:#kw;
“百度一下按钮”:#su;
xpath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点,xpath使用路径表达式来选择xml文件中的节点;生成xpath的方式:同selector一样,只是右键选择复制"Copy xpath";

//*:获取HTML页面中的所有节点;

//ul :获取HTML页面所有ul节点;

//input:获取HTML页面所有input节点;

//input/..:获取input 节点上一级;

//*[@id='kw'] 匹配HTML页面中id属性为kw的节点;
 [@...]:实现节点属性的匹配
xpath的索引是从1开始的,百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签;
常用函数
操作测试对象
click();  点击按钮,但不能点击隐藏的元素,只能点击页面可见元素;
sendKeys(" ");  输入框输入,一个输入框连续调用函数输入,会拼接在原有信息后面;
clear();清空当前输入框的信息
//输⼊⽂本后⼜想换⼀个新的关键词,这⾥就需要⽤到 clear()
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
获取信息
getText();获取文本信息
getAttribute();获取页面标签属性名称
getTitle();获取当前页面标题
getCurrentUrl();获取当前页面URL 
//如何判断获取到的元素对应的⽂本是否符合预期呢?获取元素对应的⽂本并打印⼀下~~String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);
窗口

driver.quit();关闭所有页面窗口,关闭浏览器驱动程序进程;

driver.close(); 关闭窗口,(要确保当前窗口没有被关闭,一般很少用colse(),因为用quit()关闭页面,释放驱动更方便);

driver.manage().window().maximize(); 窗口最大化

句柄用来标识页面,一个页面一个句柄; 

driver.getWindowHandle(); 获取当前页面句柄

driver.getWindowHandles(); 获取所有页面句柄

driver.switchTo().window(w); 驱动控制句柄为w的页面

//驱动控制最新的页面,切换驱动的句柄
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for( String w : allWindow){if(w!=curWindow){driver.switchTo().window(w);}
}
屏幕截图
我们的自动化脚本⼀般部署在机器上自动的去运行,如果出现了报错也不知道,可以通过抓拍来记
录当时的错误场景;
屏幕截图方法需要额外导入包:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);//文件形式保存截图FileUtils.copyFile(file, new File(filename));//file放在指定位置
类型方法特点
视口截图getScreenshotAs()只捕获当前可见区域
全屏截图getFullPageScreenshotAs()捕获整个页面(需要浏览器支持)
等待

一般程序代码执行很快,但是页面还没有渲染出来,所以需要等待一下页面渲染;

强制等待
Thread.sleep(ms);  //线程休眠指定时间
优点:使用简单;
确点:程序死等,要是元素可见了还是会等,低效;
隐式等待

implicitlyWait()

隐式等待是⼀种智能等待,他可以规定在指定时间内不断查找元素,如果找到则代码 继续执行,直到超时没找到元素才会报错;隐式等待不会判断元素是否为可点击状态,只判断是否出现;
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));//隐式等待两秒
参数:Duration类中提供毫秒、秒、分钟等方法;
优点:只需要设置一次,作用于全局,即只要driver对象没有被释放掉(driver.quit()),后面查找元素(findElement())都会生效;
缺点:不能判断复杂的情况,如元素是否可点击,是否是自己想要的元素;
 只能作用在查找元素的操作上,其他操作不能生效如点击,输入
显示等待
显示等待也是⼀种智能等待,在指定等待时间范围内,只要满足指定的条件就会放弃等待,继续执行后续代码;不是全局生效;
WebDriverWait wait= new WebDriverWait(driver,Duration.ofSeconds(3))  //参数为驱动对象和等待时间
.until(ExceptedConditions.elementToBeClickable(By.cssSelector("#id")));  //指定停止等待的条件

驱动driver在3秒内,如果“#id”这个元素可以被点击的条件满足则停止等待,继续执行;

优点:不会浪费太多时间,灵活,不同操作设置不同等待条件;

缺点:配置条件有点麻烦;

注意:

隐式等待和显示等待混用可能导致等待时间不可预测;

ExpectedConditions类提供了多种预定义的等待条件,以下是常用的条件: 
方法返回值:boolean;
presenceOfElementLocated(By locator);  等待元素出现在DOM中,locator表示定位元素的方法,如cssSelector,xpath;
visibilityOfElementLocated(By locator);等待元素出现在DOM中并可见;
elementToBeClickable();  等待元素可点击
textToBePresentInElement(); 等待元素的文本包含指定文本
textToBe(By locator,String str); 指定元素的文本内容是否与预期字符串完全匹配
urlToBe(String url);  当前页面的url是否是指定的url

DOM的定义:

DOM是HTML/XML文档的编程接口,它将文档表示为节点树结构,允许程序和脚本动态访问和更新文档内容、结构和样式。

条件检查内容适用场景
presence_of_element_located仅DOM存在快速检查元素注入
visibility_of_element_locatedDOM+可见性需要交互的元素
element_to_be_clickableDOM+可见性+可点击状态按钮/链接等
节点类型数值代码示例
Element1<div><p> 页面标签元素
Attr2class="example",属性 
Text3文本信息
Comment8<!-- 注释 -->
Document9整个文档对象
浏览器导航

driver.navigate( ).to();  打开网站

简易写法:driver.get(" ");  打开网站,

dirver.navigate().back(); 后退页面

diver.navigate().forward();  前进一个页面

diver.navigate().refresh();   刷新页面

弹窗

弹窗在页面,driver找不到任何元素,只能先处理弹窗。

使用selenium提供的Alert接口
driver.switchTo.alert();  让驱动控制弹窗
alert.accept()   选择弹窗的同意选项
alert.dismiss()   选择取消
文件上传
点击文件上传的场景下会弹出系统窗口进行文件 选择,Selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素,但可以用sendkeys来上传指定路径的文件。
点击文件上传的场景下会弹出系统窗口,进行文件的选择。上传文件窗口为系统自带,
selenium无法识别非web的控件,无法识别窗口元素
但是可以使用sendkeys来指定要上传文件的路径,达到的效果是⼀样的
WebElement ele = driver.findElement(By.cssSelector("body > div > div > 
input[type=file]"));
//输入地址
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
浏览器参数设置

我们在编写自动化测试脚本的时候需要通过运行的界面来调试我们的脚本,但脚本编写完在测试程序的过程中是不需要浏览器展示测试过程的.这时需要给脚本配置无头模式.

无头模式(Headless Mode) 是指让浏览器在没有图形用户界面(GUI) 的情况下运行.

设置无头模式
ChromeOptions option=new ChromeOptions();
option.addArguments("--remote-allow-origins=*");//运行驱动打开任何界面
option.addArguments("-headless"); //设置无头模式


文章转载自:

http://tu7fqos2.tdxpf.cn
http://yADDS9Zl.tdxpf.cn
http://VNUUSty8.tdxpf.cn
http://zma32CVt.tdxpf.cn
http://YTSo11EE.tdxpf.cn
http://PQw1SNgT.tdxpf.cn
http://lRf4m5S8.tdxpf.cn
http://8Jm6UgWK.tdxpf.cn
http://U8rwAcGU.tdxpf.cn
http://4K7sVxpE.tdxpf.cn
http://JebFU4zf.tdxpf.cn
http://t8VrKe2h.tdxpf.cn
http://s4xASJdA.tdxpf.cn
http://qF2JqYPo.tdxpf.cn
http://FBxRlouj.tdxpf.cn
http://uV8PkCQT.tdxpf.cn
http://RF7xWl3B.tdxpf.cn
http://Mm7rL58D.tdxpf.cn
http://XLbt05xJ.tdxpf.cn
http://TjLuyP8W.tdxpf.cn
http://G680FF7R.tdxpf.cn
http://McJrLb4H.tdxpf.cn
http://M6Lb6bCO.tdxpf.cn
http://OKqgSDwo.tdxpf.cn
http://oQCDeO4v.tdxpf.cn
http://sLssOnsJ.tdxpf.cn
http://gBVsrS69.tdxpf.cn
http://sLSQSppA.tdxpf.cn
http://HdvfiZva.tdxpf.cn
http://YTXltfT0.tdxpf.cn
http://www.dtcms.com/a/371278.html

相关文章:

  • B.50.10.11-Spring框架核心与电商应用
  • 芯片ATE测试PAT(Part Average Testing)学习总结-20250916
  • Visual acoustic Field,360+X论文解读
  • Android系统更新系统webview. 2025-09-06
  • Simulink子系统、变体子系统及封装知识
  • 详解 Java 中的 CopyOnWriteArrayList
  • FTL(Flash Translation Layer)
  • C++输出字符串的统一码(Unicode Code)和 ASCII 码
  • 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  • nginx安装部署(备忘)
  • 6.虚拟化历史
  • 疯狂星期四文案网第62天运营日记
  • AI工程师对于AI的突发奇想
  • 模电仿真软件:MultSim14.3下载与安装
  • 心路历程-passwdusermod命令补充
  • 自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68
  • 【尚跑】2025逐日者15KM社区赛西安湖站,74分安全完赛
  • 页面间的导航:`<Link>` 组件和 `useRouter`
  • 视频动作识别-VideoSwin
  • AI 自然语音对话接入客服系统的场景分析及实现
  • 【基础-判断】架构设计时需要考虑“一次开发,多端部署”,这样可以节省跨设备UI开发工作量,同时提升应用部署的伸缩性。
  • [光学原理与应用-428]:非线性光学 - 为什么要改变光的波长/频率,获得特点波长/频率的光?
  • 运筹学——求解线性规划的单纯形法
  • HTML标签之超链接
  • MySQL问题5
  • MyBatis Example模式SQL注入风险
  • C语言数据结构——详细讲解《二叉树与堆的基本概念》
  • 【杂类】I/O
  • import type在模块引入中的作用
  • MySQL入门指南:从安装到工作原理