浅谈自动化测试2——selenium库中的常用函数

📅 发布时间:2026/8/29 16:59:07
浅谈自动化测试2——selenium库中的常用函数 1、元素查找1.1 什么是元素查找什么是元素查找查找前端页面的元素/标签。譬如找到一个输入框、找到一个按钮、找到一个导航栏、找到一个标签页…就叫做元素的定位。2、元素定位2.1 元素定位涉及的函数selenium库中查找元素的函数主要有2个函数分别是(1)、findElement()查找一个符合条件的元素。使用findElement()函数时需要注意页面符合条件的元素必须是唯一的如果不是唯一的代码不一定会报错但是我们要查找的元素一定是不符合预期的。例如(2)、findElements()查找所有符合条件的元素查找完元素可以通过多种方式去定位元素常用的主要有以下2函数分别是(3)、By.xpath(String a)路径语言通过路径语言选中页面中指定的标签元素。(4)、By.cssSelector(String b)选择器通过选择器选中页面中指定的标签元素。操作步骤1、任找一个网页以百度网页为例#su是通过选择器的方式对百度一下按钮复制下来的选择器元素。2.2 cssSelector的语法(重点)#hotsearch-content-wrapper li:nth-child(1) a span.title-content-title需要能做到不仅仅是会复制还需要做到能够看懂我们复制下来的选择器标签因为我们可能需要去手动修改该选择器标签因为前端代码标签的id属性值集有一些会发生改变比如上一次我们复制div标签的id值是a值页面刷新后该div标签的id值是b值这种叫做动态元素此时怎么复制所需的元素都定位不到会根据给出的复杂选择器标签层层找到最终要求的标签元素/前端代码2.3 xpath的语法(重点)//*[id“hotsearch-content-wrapper”]/li[1]/a/span[2]2.4 点击/提交对象click()例如该场景找到百度一下按钮后点击该按钮点击使用到的是 click() 函数页面上大多数元素/标签都可以点击但是也有一些特殊元素不能点击1、页面隐藏的不可见的标签的无法点击通过F12打开开发者工具点击选择按钮去选择页面中所有可以被蓝色蒙尘覆盖点击的元素都能找到其代码但点击某段代码不一定能在页面上找到对应的元素如下图所示1、可以从页面元素上定位到代码大部分情况下是可以的但部分情况下根据页面元素去找代码定位到的代码也不准确存在元素被遮挡的问题2、通过前端代码不一定能定位到页面元素代码虽存在但页面上没有对应的元素说明该代码对应的标签有可能是个隐藏标签2.5.1 元素定位时自动化测试常见的异常这些不确定性将会导致元素定位时自动化测试常出现如下常见异常2.5.1.1 ElementNotInteractableException元素不可交互异常即页面元素不可点击2.5.1.2 NoSuchElementException元素找不到异常通常出现该异常的原因有2.1、查找元素时元素复制错误元素复制时复制到其他元素的代码或元素复制正确地方但粘贴时元素粘贴出错2.2、方法使用错误1、元素定位时使用xpath()代码里却用了cssSelector()或者反之2.3、复制到的这个元素是个动态元素动态元素就会导致上一秒复制到的代码id为A页面刷新后id值变为了B2.5 模拟按键输入sendKeys()该函数可模拟人手工敲打键盘在输入框中输入对应内容2.6 清除文本内容clear()可用于清除已输入的内容2.7 获取对应的文本信息getText()可获取到元素的文本信息(需要区分文本和属性getTextz()无法获取属性值获取属性值需要使用getAttribute(String)函数)2.8 获取当前页面标题getTitle()获取当前页面标题2.9 获取当前页面URLgetCurrentURL()获取当前页面URL3、窗口场景进入百度一下页面点击“图片”选项页面打开了一个新标签页新弹窗此时想要通过getTitle()、getCurrentURL()获取新标签页的标题、URL时会发现获取到的还是旧标签页的实际结果与我们的预期结果不一致但是当我们通过sendKeys()函数去输入某关键字后点击百度一下按钮新页面没有另开新标签页而是在当前标签页此时通过getTitle()、getCurrentURL()函数去获取新标签页的标题、URL我们会发现获取到的是新的标题、URL出现上述问题的原因是每个标签页都有自己的窗口句柄。对当前页面操作若新打开了一个标签页面想去获取新标签页的标题和URL大概率只能够获取到旧标签页的标题和URL对当前页面操作未打开新标签页仍在原标签页的基础上显示搜索结果那么此时去获取新标签页的标题和URL能够获取到新的标题和URL。这是因为每个标签页都有自己的窗口句柄。当我们进行手工测试时可以简单的通过眼睛来判断当前标签页是哪个窗口当前窗口是什么但是对于程序来说程序不知道当前最新窗口是哪个。那么程序就可以通过每个浏览器窗口都有一个唯一的属性句柄handle来识别每一个窗口。3.1 获取当前页面句柄driver.getWindowHandle()3.2 获取所以页面句柄driver.getWindowHandles()3.3 切换窗口切换标签页switchTo.window(句柄)告诉程序当前需要切换窗口即若对当前页面进行操作打开了一个新标签页此时想去获取新标签页的标题、URL就可以通过该函数让程序知道当前应不再与旧标签页对话应与新标签页对话。但是可能常会有以下场景需求出现当我们打开多个10个以上标签页时该怎么去切换每个标签页的窗口句柄呢难道我们需要每打开一个新标签页就去获取所有的句柄然后通过与当前句柄比较取非当前句柄的方式去让程序切换标签页吗这样做也是可行的但在代码中将会做大量的重复性代码也很麻烦。此时我们可以通过较为简单的方式1、driver.geturl2、一般情况下自动化测试不会存在需要打开多个标签页的情况3.4 窗口的大小设置driver.manage.window.maximize窗口最大化driver.manage.window.minimize窗口最小化driver.manage.window.fullscreen全屏窗口driver.manage.window.setSizenew Dimension1024768自定义设置窗口大小3.5 屏幕截图很必要的功能一般来说自动化脚本将部署在机器上自动的定时去运行程序员不可能时时刻刻盯着这个自动化运行那么如果自动化脚本出现了报错可以通过抓拍来记录当时的错误场景1、即可能通过日志没办法定位到具体是什么报错那么此时就可以通过查看当时的抓拍即页面的运行表现是什么迅速定位到具体是什么报错。2、在测试过程中测试截图也是非常必要的有时候是甲方验收的材料组成之一有时候是测试留痕的必备材料。屏幕截图方法需要额外导入包即下述依赖dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version/dependencygetScreenShotAs()通过这个函数可以将抓拍到的页面转成文件的形式还需要借助FileUtils这个工具类将文件转成图片文件由于FileUtils这个工具类屏幕截图需要去导入依赖。上述图片中确实截图了driver作用在当前标签页的图片但是如果切换了标签页截图下来的新图片将会覆盖掉旧图片这是因为我们在生成图片文件时写死了图片文件名称。因此由于我们在测试过程中需要对很多页面很多场景进行截图我们上百条测试用例可能每条所以可以通过更改图片文件的名称保证每一次保存的图片名称都是唯一的就可以确保旧截图不会被新截图覆盖掉。使用时间戳来命名图片文件图片文件名称就不会重复。现在自动化测试每执行一次都能够获取到新截图同时旧截图仍然保存着不会被覆盖那么我们能不能把这些抓拍到的截图分类成文件夹存储起来以便想要查看的时候更好的翻找到比如说今天是12月1号那么12月1号自动化测试运行抓拍到的所有图片文件都存储在A文件夹里12月2号自动化测试运行抓拍到的所有图片文件都存储在B文件夹里依次类推…3.6 关闭窗口driver.close()关闭窗口。就像资源用完后需要关闭否则一直开启却不关闭造成资源浪费内存不足。注意1、 driver 默认作用于第一个标签页2、窗口关闭后driver 需要重新定义即driver需要切换注意close()存在这个坑如果没有切换driver继续用当前这个已经被closed的driver操作自动化测试脚本报错。driver.quit和 driver.close的区别1、当浏览器打开多标签页时driver.close()是仅关闭当前作用的窗口driver.quit()是关闭整个浏览器释放driver对象。2、当浏览器打开的是单页面时driver.close()和driver.quit()都是直接关闭整个浏览器。4、等待等待代码执行的速度比页面渲染的速度要快有时候往往代码已经执行了但是页面元素还没加载好这就导致出现了自动化测试报错。在进行自动化测试时常出现一个问题页面上有这个元素代码中也有这个元素对应的前端代码但是程序在执行的时候出现报错NoSuchElementException程序提示找不到这个元素4.1 自动化测试时产生NoSuchElementException异常的原因1)、元素复制错误复制元素时复制成别的元素了 、 复制元素时复制正确但粘贴时出现漏粘多粘等问题2)、复制时方法使用错误使用xpath()方法复制却选择用选择器去粘贴使用cssSelector()方法复制却选择用xpath去粘贴3)、代码未设置登录态导致自动化打开的页面与手工测试打开页面不一致得到的测试结果也会不一致4)、动态元素5)、代码执行的速度比页面加载的速度要快4.2 等待—由于代码执行速度与页面渲染速度不匹配导致自动化报错引入的解决方案4.2.1 强制等待通过 Thread.sleep() 强制等待来解决叫做强制等待是因为当程序执行到这一行代码的时候线程强制阻塞在当前直到等待时间结束优点使用简单调试的时候较为有效缺点影响运行效率浪费大量时间如果自动化时需要执行的用例方法有300个每个方法都需要等待6s用时共计3分8秒再加上其他代码执行需要等待的时间估计为2分那么这次自动化执行时300个用例其他代码执行所需的时间 5分8秒一次自动化测试执行所需的时间有点长了所以说使用强制等待将会较影响运行效率浪费大量时间4.2.2 智能等待智能等待分为2种一种是隐式等待一种是明式等待。4.2.2.1 隐式等待implycitlyWaitimplycitlyWait参数是Duration类中提供的毫秒、秒、分钟等方法2.1.1隐式等待是一种智能等待它可以规定在查找元素时在指定时间内不断查找元素如果找到则代码继续执行超时没找到元素程序才会报错退出2.1.2隐式等待的作用域是整个脚本的所有元素。即隐式等待作用在整个页面的所有元素上它会等待页面上的所有元素加载成功。即只要driver对象没有被释放driver.quit掉隐式等待就一直生效局限性隐式等待无法等待非页面元素像页面的标题、URL、前进、后退、刷新等操作并不在页面上还有弹窗所以隐式等待对他们不起作用4.2.2.2 显示等待new WebDriverWaitnew WebDriverWait参数有WebDriver driverDuration类里的函数秒、毫秒、分钟…until$express注意until函数里的表达式是用了ExpectedConditions类里的方法ExpectedConditions预定义方法的一些示例elementToBeClickableBy locator— 用于检查元素期望是可见的的并已启用的以便可以单击它textToBeBylocatorString str — 用于检查元素presenceOfElementLocatedBylocator用于检查页面的 DOM 上是否存在元素urlToBejava.lang.String url 检查当前页面的 URL 是一个特定的 URL显示等待也是一种智能等待在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。优点2.2.1、显示等待可以弥补隐式等待的缺陷它可以等待非页面元素作用全局如页面标题、页面URL、弹窗、前进、后退、刷新等2.2.2、显示等待的运行效率优于隐式等待。隐式等待不管页面上这个元素是加载得快还是加载得慢都是等待页面上所有得元素都加载成功。而显示等待它想作用在哪个元素上面他就作用在哪个元素上面。比如说页面其他元素都加载得很快1~2s加载完毕但有个加载得很慢的A元素这时显示等待就可以只作用在这个加载得很慢的元素上。4.3 隐式等待和显示等待混合使用隐式等待和显示等待的用法略有差异因此在程序方法执行过程中衍生出了一种场景是否隐式等待和显示等待可以在代码中混合使用呢下述为在testDemo4方法中将隐式等待和显示等待混合使用隐式等待等待时间设置为1min显示等待等待时间同样设置为1min期望程序执行后总等待时间为2min但实际程序执行结果如图可知总等待时间为1min与预期结果不符。因此我们自动化脚本里不要混合使用隐式等待和显示等待去查找页面元素将会出现不符合预期的执行结果。可以将它们配合进行使用如可使用隐式等待查找页面元素显示等待查找弹窗、非页面元素。5、浏览器导航浏览器的这部分称为导航栏在导航栏我们可以进行输入URL、前进、后退、刷新…等操作这些操作都是页面上无法定位到的。5.1 打开浏览器1、driver.navigate.toString s2、driver.getString s5.2 浏览器的前进、后退、刷新功能1、driver.navigate.back2、driver.navigate.forward3、driver.navigate.refresh6、弹窗弹窗在页面是找不到任何元素的打开开发者工具页面点击没有蒙尘覆盖找不到任何元素这种情况怎么定位到页面元素可使用 Selenium 提供的 Alert 接口。弹窗的主要操作有确认alert.accept、取消alert.dismiss、输入文本信息alert.sendKeys获取文本信息alert.getText。6.1 警告弹窗如下图所示警告弹窗会显示一个按钮这个按钮有可能是确认按钮有可能是取消按钮。6.2 确认弹窗如下图所示确认弹窗会显示2个按钮一个是可操作的确认/确定按钮、另一个是可操作的取消按钮6.3 提示弹窗如下图所示确认弹窗会显示2个按钮1个输入框一个是可操作的确认/确定按钮、另一个是可操作的取消按钮还有一个可操作的输入框6.4 弹窗出现后必须处理不处理无法执行下一步如下图所示弹窗被调起后未进行·任何处理直接去操作页面其他元素程序执行报错unexpected alert open不被期待的弹窗被打开了 / UnhandledAlertException未操作弹窗异常7、文件上传点击文件上传的场景下会弹窗系统窗口让用户进行文件选择。Selenium 无法识别非 Web 的控件上传文件窗口为系统自带因此无法识别上传文件窗口元素。但可以使用sendKeys来上传指定路径的文件可达到一样的效果。8、浏览器参数设置8.1 设置无头模式无头模式(options.addArguments“-headless”)的意思前端看不到一系列操作动作但是后端已经在执行了。默认情况下默认为有头模式就像我们在执行自动化脚本的时候在电脑上可以看到代码里的每一步在屏幕前执行如此时正在输入账密此时正在点击登录按钮此时正在上传文件…等操作。实际工作中自动化在编写完成交付之后每次执行的时候不会真的安排人工一直肉眼盯着自动化的执行效果一般自动化测试在实际运行中设置的浏览器参数都是无头模式如果真的想要查看自动化测试脚本的执行效果可以通过日志、程序执行结果、调试、屏幕抓拍…8.2 设置浏览器的加载策略options.setPageLoadStrategyPageLoadStrategy.NONE可通过该函数来设置浏览器的加载策略PageLoadStrategy 类的返回类型是一个枚举主要有3个值NONE、EAGER、NORMALNONE完全不阻塞WebDriverEAGERDOM访问准备就绪即可其他资源还在加载如图像、样式…NORMAL浏览器加载策略的默认值等待浏览器所有资源加载完成若页面资源比较多通过 driver.get 方法去请求页面需要请求很长时间这时候就会存在这样的要求期望页面主要框架加载完毕就继续往下执行而不是等待所有的资源加载完成。这时候就可以通过 设置页面的加载策略 来完成上述需求的落地。