为什么要做自动化测试自动化测试就是将手工执行测试转变为使用代码来执行测试自动化测试能够代替一部分手工测试提高测试效率并且随着项目版本的更新回归测试 压力越来越大可以借助自动化来进行回归测试为什么选用SeleniumSelenium是用来做Web自动化的框架selenium的特点支持多浏览器ChromeFirefoxEdge…支持多系统LinuxWindowsMac…支持多语言PythonJavaC#…拥有丰富的APISelenium的工作原理总结我们的脚本代码会发送一个http请求到驱动驱动解析请求后操作浏览器执行相对应的操作待浏览器执行完相应的操作后会将执行结果返回给驱动驱动收到结果后又将结果返回给脚本代码SeleniumJava环境搭建这里推荐使用Chrome浏览器先查看Chrome浏览器的版本链接: Chrome驱动下载地址点击上述链接下载对应的驱动版本并将驱动放在jdk的bin目录里创建一个Maven项目并添加selenium依赖dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.0.0/version /dependency验证环境是否搭建成功public class Test { public static void main(String[] args) { ChromeOptions options new ChromeOptions(); //允许所有请求 options.addArguments(--remote-allow-origins*); WebDriver driver new ChromeDriver(options); driver.get(https://www.baidu.com); //访问百度网址 driver.quit(); //退出浏览器 } }启动运行发现代码会操作浏览器访问百度网址说明环境搭建成功Selenium常用API浏览器参数配置ChromeOptions options new ChromeOptions(); //创建浏览器参数配置对象 options.addArguments(-headless); //无头模式 options.addArguments(--remote-allow-origins*); ChromeDriver driver new ChromeDriver(options);无头模式不会在桌面打开浏览器定位元素定位元素的方式有以下方式idnametag nameclass namecss 选择器#id.classinput…XPathlinkText链接内容partialLinkText部分链接内容//获取到页面元素对应的类型为WebElement WebElement element driver.findElement(By.cssSelector(#kw)); driver.findElement(By.id(kw)); //通过id driver.findElement(By.name(wd)); //通过name driver.findElement(By.tagName(input)); //通过tag name也就是标签名 driver.findElement(By.className(s_ipt)); //通过类名 driver.findElement(By.cssSelector(#kw)); //通过css选择器 driver.findElement(By.xpath(//*[id\kw\])); //通过XPath driver.findElement(By.linkText(新闻)); //通过超链接内容 driver.findElement(By.partialLinkText(123)); //通过超链接部分内容操作测试对象sendKeys(“str”)向输入框输入内容click()模拟鼠标点击getText()获取元素的文本内容首标签与尾标签之间的文本clear()清除输入框输入内容submit()提交只能用于form标签内的元素getAttribute(“str”)获取标签属性值element.sendKeys(庆余年); //输入 element.click(); //点击 element.getText(); //获取元素的文本信息 element.clear(); //清除输入框内容 element.submit(); //提交 element.getAttribute(type); //获取标签属性时间等待强制等待Thread.sleep()隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3))显示等待显示指定等待某一个元素的加载时间只作用于一条查询元素上sleep(3000); //强制等待 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); //隐式等待3秒,作用于driver的整个生命周期 //显示等待 new WebDriverWait(driver,Duration.ofSeconds(3)).until(driver1-driver.findElement(By.cssSelector(#id)));区别强制等待会一直等待设置的时间程序阻塞执行直到时间结束隐式等待等待页面的所有元素都加载好在等待的时间内如果页面元素加载好了就会提前结束等待上述代码最多只等待3秒信息打印打印titlegetTitle()打印urlgetCurrentUrl()String url driver.getCurrentUrl(); //获取url System.out.println(url); String title driver.getTitle(); //获取title System.out.println(title);对浏览器操作关闭浏览器driver.quit(); driver.close();区别quit关闭整个浏览器close关闭当前页面quit会清除浏览器缓存close不会清除缓存浏览器窗口大小设置maximize()浏览器最大化minimize()浏览器最小化fullscreen()浏览器全屏setSize(new Dimension(int width,int height))手动设置浏览器窗口大小driver.manage().window().maximize(); //窗口最大化 driver.manage().window().minimize(); //窗口最小化 driver.manage().window().fullscreen(); //全屏 driver.manage().window().setSize(new Dimension(1024,600)); //手动设置大小第一个参数为宽第二个参数为高浏览器窗口切换操作浏览器打开新的标签页的时候浏览器此时操作元素的时候还是操作的是跳转之前的页面如果想操作新打开的标签页面的元素可进行如下操作浏览器每次打开一个标签页的时候会自动的给每个标签页进行标识句柄SetString handles driver.getWindowHandles(); //获取所有标签的句柄 String curHandle driver.getWindowHandle(); //获取当前页面get打开的句柄 for(String handle : handles){ if(!curHandle.equals(handle)){ //如果当前句柄与遍历的不相等 driver.switchTo().window(handle); //跳转过去 } }浏览器的前进后退back浏览器后退forward浏览器前进refresh浏览器刷新//浏览器的前进后退及刷新 driver.navigate().back(); //后退 driver.navigate().forward(); //前进 driver.navigate().refresh(); //刷新 //访问url除get外的别种写法 driver.navigate().to(https://www.baidu.com);借助js代码操作浏览器滚动条String js document.documentElement.scrollTop10000; //scrollTop为距浏览器顶部的距离 ((JavascriptExecutor)driver).executeScript(js); //将driver强转为JavascriptExecutor键盘与鼠标操作键盘操作driver.findElement(By.cssSelector(#kw)).sendKeys(Keys.CONTROL,A); //ctrla driver.findElement(By.cssSelector(#kw)).sendKeys(Keys.CONTROL,C); //ctrlc driver.findElement(By.cssSelector(#kw)).sendKeys(Keys.CONTROL,V); //ctrlv driver.findElement(By.cssSelector(#kw)).sendKeys(Keys.ENTER); //回车鼠标操作WebElement element driver.findElement(By.cssSelector(#kw)); //定位元素 Actions actions new Actions(driver); //需要借助Actions参数据传递浏览器驱动 actions.moveToElement(element).contextClick().perform(); //鼠标移动到元素上右击 actions.moveToElement(element).doubleClick().perform(); //鼠标移动到元素上双击屏幕截图先在pom.xml中添加依赖!-- https://mvnrepository.com/artifact/commons-io/commons-io -- dependency groupIdcommons-io/groupId artifactIdcommons-io/artifactId version2.6/version /dependency截图保存File file ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); //截图赋值给file FileUtils.copyFile(file,new File(./0522.png)); //保存在硬盘弹窗处理弹窗的类型警告弹窗确认弹窗提示弹窗弹窗不能使用定位元素的方式定位操作弹窗的步骤将driver对象切换到弹窗上driver.switchTo().alert()进行确定取消输入获取弹窗文本内容操作acceptdismisssendKeys(xxx)getText//弹窗的处理 Alert alert driver.switchTo().alert(); //定位到弹窗 alert.accept(); //确定 alert.dismiss(); //取消 alert.sendKeys(zs); //输入 alert.accept(); //输入内容后需要确认 String alertText alert.getText(); //获取弹窗文本内容说明虽然警告弹窗只有确定按钮但是accept和dismiss操作都可关闭弹窗虽然警告和确认弹窗没有输入框但是执行alert.sendkeys操作也不会报错选择框的处理根据文本选择selectByVisibleText根据属性值选择selectByValue根据序号选择selectByIndexWebElement element driver.findElement(By.cssSelector(body select)); Select select new Select(element); //创建选择框对象 select.selectByVisibleText(深圳); //根据文本选择 select.selectByValue(02); //根据属性值选择 select.selectByIndex(1); //下标从0开始1代表第二个上传文件//上传文件 WebElement element1 driver.findElement(By.cssSelector(body input[typefile]:nth-child(5))); element1.sendKeys(文件路径);JUnit单元测试JUnit是Java的单元测试框架此处的版本是JUnit5在pom.xml中添加JUnit的依赖dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.8.2/version scopetest/scope /dependency dependency groupIdorg.junit.platform/groupId artifactIdjunit-platform-suite/artifactId version1.8.2/version scopetest/scope /dependency注解Test加在方法上表示该方法是一个测试用例Disabled加在方法上表示当前方法不参与测试用例的执行BeforeEach表示当前方法在每个用例执行前都会执行一次BeforeAll表示当前方法方法需用static修饰在所有用例执行前执行一次AfterEach表示当前方法在每个用例执行后都会执行一次AfterAll表示当前方法方法需用static修饰在所有用例执行完执行一次在做UI自动化的时候一般将驱动的创建打开的url信息放到BeforeAll方法里将浏览器关闭的信息放到AfterAll方法里参数化使用ParameterizedTest与ValueSource注解进行参数化的设置单个参数ParameterizedTest ValueSource(ints {1,2,3}) void method2(int i){ System.out.println(i); }ParameterizedTest ValueSource(strings {zs,ls,ww}) void method2(String s){ System.out.println(s); }多个参数使用CsvSource可以给多个参数类型传递参数ParameterizedTest CsvSource(value {zs,5,li,6,wu,7}) void method4(String name,int id){ System.out.println(id:name); }CSV获取参数如果参数的用例非常多则可以将测试的参数放进csv文件中然后通过csv文件获取参数每个参数类型对应文件的一列数据列与列之间用分割ParameterizedTest CsvFileSource(files ./dir/test01.csv) //文件路径 void method3(String name,int i){ System.out.println(name:i); }打印结果方法获取参数public class Test { ParameterizedTest MethodSource(test111) void method1(String name,int id){ System.out.println(id:name); } static StreamArguments test111(){ return Stream.of(Arguments.arguments(zs,2), Arguments.arguments(ls,3), Arguments.arguments(wu,4)); } }用例的执行顺序使用TestMethodOrder与Order注解进行排序//该注解表示当前类下所有的用例需要使用order注解来进行排序 TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class Test04 { Order(1) Test void test_m1(){ System.out.println(m1); } Order(2) Test void test_m2(){ System.out.println(m2); } Order(3) Test void test_m3(){ System.out.println(m3); } }断言Assertions.assertEquals(s1,s2)匹配才通过Assertions.assertNotEquals(s1,s2)不匹配才通过Assertions.assertTrue(条件)条件为真通过Assertions.assertFalse(条件)条件为假才通过Assertions.assertNull(xxx)xxx为null才通过Assertions.assertNotNull(xxx)xxx不为null才通过测试套件通过class运行测试用例Suite //先跑01.class接着02.class最后03.class SelectClasses({Test01.class, Test02.class, Test03.class}) public class RunSuit { }通过包运行测试用例Suite //先跑autotest1包再跑autotest2包 SelectPackages(value {autotest1,autotest2}) public class RunSuit1 { }最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。