尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

测试:自动化测试

测试:自动化测试 介绍本篇旨在学习自动化测试使用的语言为Java。因为需要使用到自动化测试相关的非内置包体所以创建的类型均为Maven项目用pom.xml来下载所需自动化相关包体。概念自动化的主要目的就是用来进行回归测试。什么是回归测试我们常见的大多数软件都是有多个版本的。软件生产厂商对于版本的更新迭代的过程是在原有的功能基础上添加新的功能或者优化旧的模块。而测试工程师对于软件的测试工作是伴随着软件的整个生命周期的。例如我们常见的微信QQ就有着多个版本不同版本对设备的硬件配置和系统配置的适应性兼容性不同它们在版本的小迭代的软件优化上是不会出现因为小更新而导致之前版本都无法使用的这种情况。因此测试工程师在每一次版本的迭代上都需要对软件进行测试。但是软件的版本不断迭代优化在保证新增的功能没有问题的情况下还要同时保证旧的功能可以正常使用的而对于历史功能的测试就是回归测试。一、自动化介绍自动化在我们的生活中处处可见如设定温度后会自动保持恒定温度的空调超市里根据感应自动打开关闭的闸门农田内自主灌溉的喷水器小米自动化工厂的生产车间。软件中的自动化也是如此通过提前的设定配置让程序通过自动化测试来有效减少测试人员的人力消耗同时也可以提高工作效率和工作质量。自动化分类层级测试对象单元测试底层单个函数、类、方法接口/服务测试中层API、微服务间的交互UI端到端测试顶层模拟用户在浏览器/App的操作上述表格中的层级是以软件与人的距离来划分的最顶层的就是用户可以看见的就是前端的界面越往下走对于用户来说越远。而对于UI的测试又分为多种移动端测试Web测试。①.移动端测试移动端测试通常不是将程序部署在移动端上进行测试而是需要安装模拟器在电脑上编写自动化测试脚本代码对模拟器上的软件进行操作。移动端测试难度相对较大移动端测试的稳定性要比接口自动化测试和web自动化测试的稳定性要差很多原因主要是移动端测试受到的环境影响比较多。②.Web测试Web测试则是像我们自己动手打开网页进行测试一样而让程序操控网页模拟人来操作的行为就是Web自动化测试。二、Web自动化准备前提知识与排错1Xpath和selector:Xpath和selector是比较常用的用于定位网页标签的元素。如何查看Web页面选项的表达式①.打开网页启动开发者工具快捷键F12开启功能按钮通过鼠标定位到页面元素②.右击对应元素选择copy,复制相应表达式2准备过程可能出现的问题①.dependency标签标红显示Maven 规定dependency标签必须放在dependencies这个父标签内部而不能直接放在project下面也不能放在build、properties等其他标签下面。②.标签里的内容标红显示没有刷新 Maven1右击鼠标打开属性面板刷新2看 IDEA 右侧边栏的Maven选项卡点击左上角的刷新图标③.依赖正确安装代码正确运行错误可能是浏览器下载错误比如下载了盗版的浏览器。1.Web驱动管理驱动管理 WebDriverManager是一个开源Java库以完全自动化的方式对Selenium WebDriver所需的驱动程序如chromedriver、geckodriver、msedgedriver等进行管理即下载、设置和维护自版本5起WebDriverManager还提供了其他相关功能如发现本地系统中安装的浏览器的能力构建WebDriver对象如ChromeDriver、FirefoxDriver、EdgeDriver等1安装Web驱动管理①.自动化安装推荐添加依赖在的pom.xmlMaven或build.gradleGradle文件中添加依赖dependency groupIdio.github.bonigarcia/groupId artifactIdwebdrivermanager/artifactId version5.8.0/version scopetest/scope /dependency备注scopetest/scope会将依赖的作用域限制在项目的Test文件夹下在其他文件夹下不识别不到是无法补全引用该依赖的可以将其去掉它只是一种规范不会影响到日常的使用。注意其中对于version标签内的版本可根据需求自行调整。②.手动安装下载链接Unable to Locate Driver Error | Selenium根据不同的浏览器下载不同的驱动即可。缺点浏览器默认会自动更新每隔一段时间需重新下载否则会出现驱动版本不匹配而无法正常运行自动化所以不推荐使用手动下载。2代码示例//1.成功下载Web驱动管理包体到本地后可以直接通过 WebDriverManager 方法来下载常用浏览器对应的驱动 //2.自动处理 ChromeDriver并不是只能下载谷歌的 的下载和配置 //3.再通过 setup() 方法载入 WebDriverManager.chromedriver().setup();笔记当setup()被调用时WebDriverManager会在后台执行一系列操作检查系统、发现浏览器版本、解析正确的驱动版本、下载并缓存驱动、最后设置好系统属性。2.Selenium介绍selenium是⼀个web自动化测试工具selenium中提供了丰富的方法供给使用者进行web自动化测试。1安装Selenium库添加依赖在的pom.xmlMaven或build.gradleGradle文件中添加依赖dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.0.0/version /dependency2Seleunim官方文档文档链接Overview3代码示例// 创建 WebDriver 实例 WebDriver driver new ChromeDriver(); //通过实例的 get(网址链接) 方法来指定打开资源链接 driver.get(https://www.example.com); // ... //释放资源相当于关闭网页保持良好的习惯 driver.quit();3.综合测试示例通过Java代码模拟人的行为操作步骤打开浏览器输入百度网址并打开找到输入框并输入“淘宝”找到百度一下按钮并点击退出浏览器。package autoTest; import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class TestChrome { public void chrome_example_test(){ //驱动程序管理的自动化 WebDriverManager.chromedriver().setup(); ChromeOptions optionsnew ChromeOptions(); //允许访问所有链接 options.addArguments(--remote-allow-origins*); //1.打开浏览器 WebDriver drivernew ChromeDriver(options); //2.输入百度网址https://www.baidu.com driver.get(https://www.baidu.com); //3.找到输入框并输入“淘宝” driver.findElement(By.xpath(//*[id\kw\])).sendKeys(淘宝); //4.找到”百度一下“的按钮并点击 driver.findElement(By.xpath(//*[id\kw\])).click(); //5.关闭浏览器 driver.quit(); } }注意options.addArguments(--remote-allow-origins*); 是启动选项配置。拆解options指的是 Chrome 浏览器的启动配置对象ChromeOptions。addArguments添加 Chrome 浏览器的启动命令行参数。--remote-allow-origins*告诉 Chrome允许来自任何域*的远程调试/控制请求连接到这个浏览器实例。三、Web自动化方法1.元素的定位介绍web自动化测试的操作核心是能够找到页面对应的元素然后才能对元素进行具体的操作。常见元素定位方式非常多如idclassnametagnamexpathcssSelector。常用的主要是cssSelector和xpath。1cssSelector选择器的功能选中页面中指定的标签元素。选择器的种类分为基础选择器和复合选择器常见的元素定位方式可以通过id选择器和子类选择器来进行定位。定位百度首页的“百度热搜”元素可以使用通过id选择器和子类选择器进行定位#s-hotsearch-wrapper div2xpathXML路径语言不仅可以在XML文件中查找信息还可以在HTML中选取节点。xpath使用路径表达式来选择xml文档中的节点。xpath语法中①.获取HTML页面所有的节点//*②.获取HTML页面指定的节点//[指定节点] eg//ul获取HTML页面所有的ul节点③.获取一个节点中的直接子节点/ eg//span/input获取span标签下的子节点input④.获取一个节点的父节点.. eg//input/..获取input节点的父节点⑤.实现节点属性的匹配[...] eg//*[idkw]匹配HTML页面中id属性为kw的节点⑥.使用指定索引的方式获取对应的节点内容eg百度首页通过//div/ul/li[3]定位到第三个百度热搜标签注意xpath的索引是从1开始的。笔记虽然我们可以通过鼠标右键直接复制对应元素的表达式但是并非手动复制的selector/xpath表达式并不⼀定满足我们的需要有时候是需要我们自己进行编写表达式的。3查找符合条件的元素注意对于复制的元素表达式可以做一次检查在开发者工具的源代码页面中使用快捷键CtrlF(快速查找)将复制的表达式进行搜索确认一下是否是复制正确的且为唯一。获取元素的方法findElement(); 查找一个符合条件的元素findElements(); 查找所有符合条件的元素关键示例//对象.findElement(By.[根据什么查找]).行为; driver.findElement(By.xpath(//*[id\chat-textarea\])).sendKeys(淘宝);2.操作测试对象介绍获取到了页面的元素之后接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。1点击/提交对象click()//找到百度⼀下按钮并点击 driver.findElement(By.cssSelector(#su)).click();2模拟按键输入sendKeys()driver.findElement(By.cssSelector(#kw)).sendKeys(输⼊⽂字);3清除文本内容输入文本后又想换一个新的关键词清空输入框clear()driver.findElement(By.cssSelector(#kw)).sendKeys(hello); driver.findElement(By.cssSelector(#kw)).clear(); driver.findElement(By.cssSelector(#kw)).sendKeys(world!);4获取文本信息获取到对应的元素文本校验打印获取文本信息getText()String bdtext driver.findElement(By.xpath(//*[idtitle-content]/span[1])).getText(); System.out.println(打印的内容是bdtext);注意文本和属性值是不同的例如输入框里的内容是文本而我们所看到的百度按钮上面的文字“百度一下”是按钮的属性值获取属性值需要使用方法 getAttribute(属性名称) ;5获取当前页面标题getTitle()6获取当前页面URLgetCurrentUrl()3.窗口介绍当我们手工测试的时候页面上有多个窗口时可以通过观察来判断当前要操作的窗口是哪一个。但是对于程序来说它是无法自主切换窗口的如果不去修改指定它只会操作默认的窗口。想要让程序能够切换到别的窗口需要用到属性句柄handle,浏览器的每一个窗口都有唯一的属性句柄知道属性句柄之后就可以通过句柄来使程序切换窗口。获取当前页面句柄getWindowHandle();获取所有页面句柄getWindowHandles()1切换窗口切换当前窗口为最新页面String curWindow driver.getWindowHandle(); SetString allWindow driver.getWindowHandles(); for( String w : allWindow){ if(w!curWindow){ driver.switchTo().window(w); } }注意执行了driver.close()之前需要切换到未被关闭的窗口。2设置窗口大小//窗⼝最⼤化 driver.manage().window().maximize(); //窗⼝最⼩化 driver.manage().window().minimize(); //全屏窗⼝ driver.manage().window().fullscreen(); //⼿动设置窗⼝⼤⼩ driver.manage().window().setSize(new Dimension(1024, 768));3屏幕截图重要自动化脚本编写完成后当我们运行自动化脚本在机器上自主运行如果出现了报错我们是不知道的。但是可以通过别的方式来获取错误信息和内容比如添加日志记录错误信息。通过截图记录遇见的错误场景。屏幕截图方法需要额外导入新的依赖dependency groupIdcommons-io/groupId artifactIdcommons-io/artifactId version2.6/version /dependency方法File file ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(file,new File(filename));代码示例demo1//简单案例 File srcfile driver.getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcfile,new File(my.png)); //完整案例 ListString times getTime(); //⽣成的⽂件夹路径./src/test/autotest-年-月-日/方法名-时分秒.png String filename ./src/test/autotest-times.get(0)/str- times.get(1).png; File srcfile driver.getScreenshotAs(OutputType.FILE); //把屏幕截图放到指定的路径下 FileUtils.copyFile(srcfile,new File(filename));demo2public static void TakeScreenShotTo(WebDriver driver) throws IOException { //创建File文件并调用截图方法 File srcfile ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); //⽣成的⽂件夹路径./src/test/autotest-年-月-日/调用的方法名-时分秒毫秒.png备注生成量大时以秒为单位可能重复所以用毫秒 //创建时间格式化对象 simdir文件目录的时间格式 simfile文件名的时间格式 SimpleDateFormat simdir new SimpleDateFormat(yyyy-MM-dd); SimpleDateFormat simfile new SimpleDateFormat(HHmmssSSS); //创建字符串对象获取生成的结果 dirtime文件目录的时间 filetime文件名的时间 String dirtime simdir.format(System.currentTimeMillis()); String filetime simfile.format(System.currentTimeMillis()); //获取当前方法的名称 StackTraceElement[] stackTraceElements new Throwable().getStackTrace(); StackTraceElement element stackTraceElements[0]; String methodName element.getMethodName(); //文件目标路径 // 示例模板./src/test/autotest-2026-09-04/TakeScreenShot-1219315.png String fileName ./src/test/autotest- dirtime / methodName - filetime .png; //将文件保存到指定位置 FileUtils.copyFile(srcfile, new File(fileName)); }4.等待1强制等待Thread.sleep优点使用简单调用的时候简单有效适合自己测试的时候使用缺点影响运行效率浪费大量时间真正自动化测试时如果每次都强制等待将会使效率大大降低2隐式等待介绍隐式等待是一种智能等待他可以规定在查找元素时在指定时间内不断查找元素。如果找到则代码继续执行直到超时没找到元素才会报错。implicitlyWait 参数Duration类中提供的毫秒、秒、分钟等方法。//隐式等待1000毫秒 driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); //隐式等待5秒 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉driver.quit隐式等待就一直生效。优点智能等待作用于全局缺点隐式等待仅可以对页面内的元素生效而对于页面内容之外的则无效如网页的名称地址栏弹窗等。笔记隐式等待 是 WebDriver 全局的设置一旦设置作用于整个driver生命周期对所有findElement和findElements调用都生效。3显示等待介绍显式等待也是一种智能等待在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。new WebDriverWaitdriver Duration.ofSeconds3.until$express$press涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类返回值boolea//创建显示等待对象并绑定等待3秒 WebDriverWait wait new WebDriverWait(driver, Duration.ofSeconds(3)) //等待直到#id元素可以点击为止 wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(#id)));ExpectedConditions预定义方法的一些示例elementToBeClickableBy locator——用于检查元素的期望是可见的并已启用以便您可以单击它。textToBeBy locator String str——检查元素。presenceOfElementLocatedBy locator——检查页面的DOM上是否存在元素。urlToBejava.lang.String url——检查当前页面的URL是一个特定的URL。visibilityOfElementLocatedBy——元素可见要输入内容或读取文本前alertIsPresent——弹窗出现处理alert/confirminvisibilityOfElementLocatedBy——元素消失等待 loading 动画结束优点显式等待是智能等待可以自定义显式等待的条件操作灵活缺点写法复杂隐式等待Vs显示等待对比项隐式等待Implicit Wait显式等待Explicit Wait作用范围全局作用于所有 findElement局部只作用于指定的元素等待条件固定元素存在DOM 中出现自定义可见、可点、可选、有值等生效时间整个 driver 生命周期每次单独设置代码写法一行搞定需要创建 WebDriverWait 对象推荐度每次都加上复杂的测试交互需要加上注意推荐将显示等待和隐式等待搭配使用将隐式等待作用在元素上显示等待作用在非元素上。显示等待和隐式等待可以混用但不推荐两者相结合所产生的时间不可预测比如当两者都用作页面元素上注该元素并不存在做测试隐式等待10s显示等待5s结果为10s左右会浮动并不精确。5.浏览器导航1打开网站// 更⻓的⽅法 driver.navigate().to(https://selenium.dev); // 简洁的⽅法 推荐最常用 driver.get(https://selenium.dev);2浏览器的后退、前进、刷新//后退 driver.navigate().back(); //前进 driver.navigate().forward(); //刷新 driver.navigate().refresh();6.弹窗介绍在网页中是找不到任何元素的需要使用selenium提供的Alert接口来触发弹窗。弹窗分为三种警告弹窗、确认弹窗、提示弹窗。Alert弹窗里包含四种操作①.void dismiss(); //取消②.void accept(); //确认③.String getText(); //获取内容④.void sendKeys(String keysToSend); //输入值1警告弹窗//创建一个警告弹窗 JavascriptExecutor js (JavascriptExecutor) driver; js.executeScript(alert(这是一个警告弹窗)); //将页面的控制切换到弹窗上获取弹窗的控制 Alert alert driver.switchTo().alert(); alert.accept(); //确认备注警告弹窗比较特别它只有一个选项所以accept和dismiss都可以使用功能都是关闭弹窗。2确认弹窗//创建一个确认弹窗 JavascriptExecutor js (JavascriptExecutor) driver; js.executeScript(confirm(这是一个确认弹窗要删除吗)); //将页面的控制切换到弹窗上获取弹窗的控制 Alert alert driver.switchTo().alert(); alert.accept(); //确认 alert.dismiss(); //取消3提示弹窗//创建一个提示弹窗 JavascriptExecutor js (JavascriptExecutor) driver; js.executeScript(prompt(这是一个提示弹窗请输入你的名字)); //将页面的控制切换到弹窗上获取弹窗的控制 Alert alert driver.switchTo().alert(); alert.sendKeys(张三); //输入值 alert.accept(); //确认 alert.dismiss(); //取消注意如果出现弹窗必须对弹窗进行处理关闭弹窗之后才能对页面其他元素进行操作。7.文件上传点击文件上传的场景下会弹窗系统窗口进行文件的选择。selenium无法识别非web的控件上传文件窗口为系统自带无法识别窗口元素但是可以使用sendkeys来上传指定路径的文件达到的效果是一样的。WebElement ele driver.findElement(By.cssSelector(body div div input[typefile])); ele.sendKeys(D:\\selenium2html\\selenium2html\\upload.html);8.浏览器参数设置1设置无头模式介绍无头模式就是不展示测试过程默认为有头模式。正常在自动化测试的过程中测试人员不会一直盯着自动化执行的效果而是让自动化脚本自动执行通过执行出的结果去分析。options.addArguments(--headless);2设置浏览器加载策略介绍当访问资源量过大的网站时资源并不能很快的加载处理比如b站、抖音等网站涵盖大量资源不能一下子加载完所有资源的我们也并不能总是去等待它所有的资源加载完再执行测试所以我们可以通过设置浏览器加载策略来解决这个问题。浏览器加载设置options.setPageLoadStrategy(PageLoadStrategy.选项);options.setPageLoadStrategy(PageLoadStrategy.EAGER);其中PageLoadStrategy有三个选择值①.NONE(none) //完全不阻塞WebDriver进入直接开始测试②.EAGER(eager) //DOM访问准备就绪页面元素格式等基本内容加载完成但是存在其他资源还在加载比如图片视频等③.NORMAL(normal); //默认值等待所有资源都加载完成9.Actions接口介绍网页的元素有时候是多层嵌套的我们无法轻易获取它的焦点就可以通过seleunim来模拟人的键鼠操作。详情见seleunim参考手册Selenium 浏览器自动化项目 | Selenium键鼠操作10.开启断言介绍对于网页文本信息的校验我们就可以通过断言来实现。在Java中启用断言1.打开运行配置在 IDEA 右上角点击当前运行类旁边的下拉菜单选择Edit Configurations...2.添加 VM 参数在对应的运行配置中找到VM options输入框填入-ea -Dfile.encodingUTF-8开启断言 UTF-8编码四、总结面试考点NoSuchElementException找不到元素可能的原因1页面元素表达式复制错误 eg#kw错打成了kw2复制的表达式与代码中By的搜索方式不匹配 eg复制Xpath//*[idchat-submit-button]却用的By.clsSelector3自动化所加载的页面与手工打开的不一致 eg手动打开的页面是登录了账号的自动的没有登录4搜索的是动态元素其表达式是会变化的5代码执行的速度比页面加载的速度更快常见报错速查表报错信息一句话原因最快解决方案NoSuchElementException定位器写错 / 元素没加载 / 在 iframe 里① Console 验证 Xpath ② 加显式等待 ③ 检查 iframeElementNotInteractableException元素找到了但点不了被挡/不可见/未启用WebDriverWait elementToBeClickable 滚动TimeoutException等待超时元素没在规定时间内出现增加超时时间 / 换更合适的等待条件StaleElementReferenceException元素引用过期页面刷新/跳转后老元素失效不要缓存元素每次操作前重新 findElementNoAlertPresentException调了 switchTo().alert() 但页面上没弹窗先用 isAlertPresent() 判断或用 alertIsPresent() 等待InvalidArgumentException方法参数传错了URL 缺协议 / Xpath 引号不匹配检查参数格式URL 加 http://Xpath 用英文引号JavascriptException注入的 JS 代码语法错误或被浏览器拦截Console 预验证 JS检查引号是否为英文SessionNotCreatedExceptionChromeDriver 版本与浏览器不匹配更新 WebDriverManager 或手动下载匹配驱动NoSuchWindowException切换窗口时句柄失效窗口已关或未打开先 getWindowHandles() 获取所有句柄再切换InvalidSelectorExceptionXpath 或 CSS 语法错误如 //*[idkw 缺括号检查定位器括号是否成对引号是否闭合
返回列表