目录
1.什么是自动化测试
2.web⾃动化测试
2.1驱动
WebDriverManager
3. Selenium
3.1selenium+驱动+浏览器的⼯作原理
4.常用函数
4.1元素的定位
4.1.1cssSelector选择器
4.2.2xpath
4.2操作测试对象
4.3窗⼝
4.4等待
4.5浏览器导航
4.6弹窗
4.7文件上传
4.8设置无头模式
4.9加载策略
1.什么是自动化测试
自动化测试是指使用专门的软件工具和执行脚本,替代人工操作,自动执行测试用例并验证系统功能、性能或安全性的过程。其核心目标是提高测试效率、减少重复劳动,并提升测试的准确性和覆盖率。
自动化测试主要目的就是用来做回归测试,例如在一个软件当中更新了新的功能,我们不仅要测试历史功能没有问题还要测试新的功能没有问题。此时我们就需要自动化来实现历史功能的测试,手工测试实现新的功能测试。
2.web⾃动化测试
2.1驱动
web系统的测试前提是需要打开浏览器,通过访问web服务器来对服务器界 ⾯进⾏⼀系列的操作。因此程序想要打开web浏览器就需要安装web驱动(即WebDriver),WebDriver以本地化⽅式驱动浏览器。
WebDriverManager
WebDriverManager 是一个开源 Java 库,用于自动化管理浏览器驱动程序(如 ChromeDriver、GeckoDriver 等)。它解决了 Selenium 测试中手动下载、配置和更新驱动程序的繁琐问题,显著提升自动化测试的效率和可维护性。
导入依赖库:WebDriverManager
:自动下载和管理浏览器驱动程序,避免手动配置。
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope></dependency>
3. Selenium
Selenium 是一个开源的自动化测试框架,主要用于Web应用程序的测试。它允许开发者通过编程方式控制浏览器行为,模拟用户操作,如点击按钮、输入文本等。Selenium的核心优势在于支持多种浏览器(如Chrome、Firefox、Edge)和编程语言(如Python、Java、C#),使其成为功能测试和回归测试的流行工具。
安装selenium库:
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency>
简单代码示例
public class secondTest {public void test_01() throws InterruptedException {//驱动程序管理的?动化WebDriverManager.edgedriver().setup();EdgeOptions options = new EdgeOptions();//允许访问所有链接options.addArguments("--remote-allow-origins=*");//1、打开浏览器WebDriver driver = new EdgeDriver(options);//2.输?百度?址:https://www.baidu.comdriver.get("https://www.baidu.com");//3、找到输?框并输?“迪丽热巴”driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("迪丽热巴");//4、找到“百度?下”按钮并点击driver.findElement(By.xpath("//*[@id=\"su\"]")).click();//5、关闭浏览器driver.quit();}
}
3.1selenium+驱动+浏览器的⼯作原理
1. 通过selenium编写的⾃动化脚本代码中在EdgDriverService中创建⼀个服务
2. 通过创建好的服务打开webdriver,安装在本地的驱动服务IP为localhost,PORT为 EdgDriverService中创建的端⼝号,该服务地址为selenium向webdriver发送请求的服务地址。
3. 向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id
4. 打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过创建好的服务链接到 webdriver,然后使⽤execute发送请求
5. 驱动收到请求并对请求进⾏解析,转成浏览器能够解析的脚本并发送给浏览器,浏览器通过请求的 内容执⾏对应动作
6. 浏览器再把执⾏的动作结果通过浏览器驱动程序返回给测试脚本
4.常用函数
4.1元素的定位
web⾃动化测试的操作核⼼是能够找到⻚⾯对应的元素,然后才能对元素进⾏具体的操作。 常⻅的元素定位⽅式⾮常多,如id,classname,tagname,xpath,cssSelector 常⽤的主要由cssSelector和xpath
查找元素:findElement 查找单个元素 ;findElements 查找多个元素。
4.1.1cssSelector选择器
选中页面中的标签元素,可在页面中直接复制标签元素
driver.findElement(By.cssSelector("#kw"));
4.2.2xpath
XML路径语⾔,不仅可以在XML⽂件中查找信息,还可以在HTML中选取节点。
driver.findElement(By.xpath("//*[@id=\"kw\"]"));
4.2操作测试对象
获取到了⻚⾯的元素之后,接下来就是要对元素进⾏操作了。常⻅的操作有点击、提交、输⼊、清 除、获取⽂本。
点击 :click()
//找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#su")).click();
模拟按键输入 : sendKey(" ")
driver.findElement(By.cssSelector("#kw")).sendKeys("输⼊⽂字");
清除⽂本内容: clear
driver.findElement(By.cssSelector("#kw")).sendKeys("
我爱游戏
");driver.findElement(By.cssSelector("#kw")).clear();driver.findElement(By.cssSelector("#kw")).sendKeys("
我爱学习
");
获取文本信息 : getText
//getText()返回类型为string
String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);
获取当前页标题:getTitle
System.out.println("跳转之前的标题:" + driver.getTitle());
获取当前URL: getCurrentUrl()
System.out.println("跳转之前的URL:" + driver.getCurrentUrl());
4.3窗⼝
当我们手工测试的时候我们可以通过眼镜去看窗口可是计算机又该怎么去看呢,这是就需要通过句柄来表示窗口。
获取当前⻚⾯句柄: driver.getWindowHandle();
String currWindow = driver.getWindowHandle();
获取所有⻚⾯句柄: driver.getWindowHandles();
Set<String> allWindow = driver.getWindowHandles();
切换句柄(代表切换了窗口)但在测试大多数不用,当在新的窗口进行操作的时候,就再获取url
//获取当前句柄
String curWindow = driver.getWindowHandle();
//获取所有句柄Set<String> allWindow = driver.getWindowHandles();for( String w : allWindow){if(w!=curWindow){driver.switchTo().window(w);}}
窗口大小设置
//窗⼝最⼤化driver.manage().window().maximize();//窗⼝最⼩化driver.manage().window().minimize();//全屏窗⼝driver.manage().window().fullscreen();//⼿动设置窗⼝⼤⼩driver.manage().window().setSize(new Dimension(1024, 768));
屏幕截图
我们的⾃动化脚本⼀般部署在机器上⾃动的去运⾏,如果出现了报错,我们是不知道的,可以通过抓 拍来记录当时的错误场景
屏幕截图⽅法需要额外导⼊包:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
//简单版本
File srcfile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
//srcfile转成图片文件
FileUtils.copyFile(srcfile, new File("test.png"));
//高阶版本
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HH-mm-ss-SS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());// 图片文件名: ./src/test/images/2025-4-21/18-56-57-50.pngString filename = "./src/test/images/" + dirTime + "/" + fileTime + ".png";File srcfile = ((TakesScreenshot)driverManager).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcfile,new File(filename));
4.4等待
强制等待: Thread.sleep ();
隐式等待
隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码 继续执⾏,直到超时没找到元素才会报错。隐式等待是贯穿全局的只要要driver对象没有被释放掉,就可以一直执行。
//implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等⽅法//隐式等待1000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));//隐式等待5秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
显⽰等待
显示等待(Explicit Wait)是自动化测试中用于动态等待特定条件满足的一种机制。与隐式等待(Implicit Wait)不同,显示等待针对特定元素或条件设置等待时间,直到条件成立或超时为止。其核心优势在于灵活性和精确性,避免全局等待导致的性能浪费。
//定义显示等待三秒
WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
//elementToBeClickable(By locator)‒⽤于检查元素的期望是可⻅的并已启⽤,以便您可以单击它。
// ExpectedConditions预定义⽅法还有别的方法以应对不对的对象
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
4.5浏览器导航
打开网站
// 更⻓的⽅法driver.navigate().to("https://selenium.dev");// 简洁的⽅法driver.get("https://selenium.dev");
浏览器的前进、后退、刷新
//后退driver.navigate().back();
//前进driver.navigate().forward();
//更新driver.navigate().refresh();
4.6弹窗
弹窗是在⻚⾯是找不到任何元素的,使⽤selenium提供的Alert接⼝可以去实现弹窗
Alert alert = driver.switchTo.alert();//确认
alert.accept()//取消
alert.dismiss()
//弹窗的输入alert.sendKeys("hello");
4.7文件上传
WebElement ele = driver.findElement(By.cssSelector("body > div > div >
input[type=file]"));ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
4.8设置无头模式
在测试中不可能随时的去盯着代码的运行,因此需要设置无头模式让代码自己去测试。
//options.addArguments("-headless");
4.9加载策略
在测试网站的过程中有些页面的元素加载过程比较慢可能导致测试的速度慢,所以此时需要页面框架加载完了就往下执行不用一直等待加载
//这种策略会让 WebDriver 等待整个页面完全加载完毕(包括 HTML 内容、CSS、JavaScript 和子资源)。这是默认的策略
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
//这种策略会让 WebDriver 只等待初始 HTML 文档(DOMContentLoaded 事件)完成加载,不等待 CSS、JavaScript 和子资源加载完毕。
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
//这种策略会让 WebDriver 完全不等待页面加载,立即执行后续操作。
options.setPageLoadStrategy(PageLoadStrategy.NONE);