自动化测试常用函数
- [1. 元素定位](#1. 元素定位)
- [2. 操作测试对象](#2. 操作测试对象)
- [3. 窗口](#3. 窗口)
- [4. 等待](#4. 等待)
- [5. 浏览器导航](#5. 浏览器导航)
- [6. 弹窗](#6. 弹窗)
- [7. 文件上传](#7. 文件上传)
- [8. 浏览器参数设置](#8. 浏览器参数设置)
1. 元素定位
web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体操作。常见的元素定位方式有:id、classname、tagname、xpath、cssSelector
cssSelector:
cssSelector(CSS选择器: 是自动化测试中用于定位网页元素的一种强大方式。基于HTML元素的结构和属性来匹配并选中页面上的某个或某写元素。
选择器:选中页面中指定的标签元素
选择器的种类分为基础选择器和复合原则器,常见的元素定位方式通过 i选择器和子类选择器进行经纬。
XPath:
XPath(XML Path language): 是一种用于在 Xml 或 HTML文档中定位和选择节点的语言。
语法:
- 获取HTML页面所有的节点: //*
- 获取HTML页面制定的节点://[指定节点]
- //ul:获取HTML页面所有的 ul节点
- //input:获取HTML页面所有的 input节点
- 获取一个节点中的直接字节点:/
- //span/input
- 获取一个节点的父节点: ...
- //input/...
- 实现节点属性的匹配:[@...]
- //*[@id='kw'] 匹配HTML页面中id属性值为 kw的节点
- 使用指定索引的方式获取对应的节点内容:XPath的索引是从1开始的
- 百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签
2. 操作测试对象
在自动化测试中,操作测试对象是指页面上的元素进行各种交互行为。
点击/提交对象:
-
click()
java//找到百度一下按钮并点击 driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
模拟按键输入:
-
sendKeys("")
java//找到输入框并输入"迪丽热巴" driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("迪丽热巴");
清除文本内容:
-
输入文本后再换一个关键词,需要使用clear()
javadriver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("迪丽热巴"); driver.findElement(By.xpath("//*[@id=\"kw\"]")).click(); driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("博客");
获取文本内容:
-
getText()
javaString text = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText(); System.out.println("打印的内容是:"+ text);
3. 窗口
在自动化测试中,窗口(Window)操作时常见需求之一。当用户点击链接或按钮时,有时会打开新的浏览器窗口或标签页(Tab),此时就需要进行窗口的切换、管理等操作。
每个浏览器窗口都有一个唯一的属性句柄(handle)来表示
切换窗口:
-
获取当前页面句柄:driver.getWindowHandle();
-
获取所有页面的句柄:driver.getWindowHandles();
javaString curWindow = driver.getWindowHandle(); Set<String> allWindow = driver.getWindowHandles(); for (String w : allWindow) { //切换窗口 driver.switchTo().window(w); }
执行了 diver.close() 之前需要切换到未被关闭的窗口
窗口设置大小:
-
窗口大小设置
java//窗口最大化 driver.manage().window().maximize(); //窗口最小化 driver.manage().window().minimize(); //全名窗口 driver.manage().window().fullscreen(); //手动设置窗口大小 driver.manage().window().setSize(new Dimension(1024, 768));
屏幕截图:
-
导入工具包:commons-io主要用于简化文件、流、和目录的操作;
xml<!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
java// 将 WebDriver 对象转换为 TakesScreenshot 接口对象 // getScreenshotAs() 方法用于获取当前页面的截图,并以 File 形式返回 File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); // 使用 Apache Commons IO 的 FileUtils 工具类,将截图文件复制到指定路径和文件名 FileUtils.copyFile(file, new File("my.png"));
java//升级版 // 调用 getTime() 方法,获取一个包含两个时间字符串的 List // 例如:["2025-07-05", "20250705-143045"] List<String> times = getTime(); // 构建截图要保存的目录路径 // 格式为:./src/test/autotest-2025-07-05 String directoryPath = "./src/test/autotest-" + times.get(0); // 定义截图文件名 // 格式为:-20250705-143045.png String fileName = "-" + times.get(1) + ".png"; // 使用 Selenium 的 TakesScreenshot 接口获取当前浏览器窗口的屏幕截图 // 返回的是一个临时文件对象 File srcfile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); // 使用 Apache Commons IO 提供的 FileUtils.copyFile() 方法 // 将截图从临时路径复制到指定的目标路径下 FileUtils.copyFile(srcfile, new File(filePath)); public static List<String> getTime() { List<String> times = new ArrayList<>(); DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss"); String time1 = LocalDateTime.now().format(formatter1); // 如:2025-07-05 String time2 = LocalDateTime.now().format(formatter2); // 如:20250705-143045 times.add(time1); times.add(time2); return times; }
关闭窗口:
- driver.close();
4. 等待
由于web页面是动态加载的,通常代码执行的速度比页面渲染的速度要快,元素不会立刻出现或准备好,需要通过等待(Wait)机制来确保脚本执行时能过正确找到和操作页面的元素。
强制等待:
- Thread.slepp()
- 优点:使用简单,调用时比较有效
- 缺点:影响运行效率,浪费大量的时间
隐式等待:
隐式等待(Implicit Wait)是一种全局性的智能等待机制。它规定在查找元素时,如果当前未找到目标元素,Selenium 会在指定的时间内不断尝试查找该元素。一旦找到元素,立即继续执行后续代码;如果在超时时间内仍未找到元素,则抛出 NoSuchElementException
异常并终止当前操作。
-
implicitlyWait() 参数:Duration 类中提供的毫秒、秒、分钟等方法。
java//隐式等待 1000毫秒 driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); //隐式等待 5秒 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
作用域是整个脚本的 所有元素。即只要driver对象没有别释放掉(driver.quit()),隐式等到一直生效。
优点:智能等待,作用与全局
显示等待:
显式等待(Explicit Wait) 是一种智能的、条件驱动的等待机制。它会在指定的最大超时时间范围内不断检查某个条件是否成立,一旦条件满足,就立即继续执行后续代码;如果在超时后仍未满足条件,则抛出 TimeoutException异常。
与隐式等待不同,显式等待是针对特定条件的等待,适用于更复杂和精确的自动化测试场景。
-
基本语法结构
javaWebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3)) foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
WebDriverWait
:设置最大等待时间。ExpectedConditions
:提供一系列预定义的等待条件判断方法。until(...)
:执行等待,直到条件为真或超时。
-
ExpectedConditions
是 Selenium 提供的一个工具类,它包含了一系列用于显式等待的条件判断方法 ,可以与WebDriverWait
搭配使用。
常见方法 | 描述 |
---|---|
elementToBeClickable(By locator) |
等待元素可见且可点击(常用于按钮、链接等) |
textToBe(By locator, String text) |
等待指定元素中包含指定文本内容 |
presenceOfElementLocated(By locator) |
等待元素出现在 DOM 中(不一定可见) |
urlToBe(String url) |
等待当前页面 URL 等于指定的 URL |
visibilityOfElementLocated(By locator) |
等待元素在页面上可见(显示且宽高 > 0) |
invisibilityOfElementLocated(By locator) |
等待元素不可见(如加载动画消失) |
alertIsPresent() |
等待弹窗(alert)出现 |
java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-topleft > a:nth-child(1)"), "新闻"));
if(ispass){
System.out.println("测试通过");
}else {
System.out.println("测试失败");
}
- 创建了一个最大等待时间为 10 秒 的
WebDriverWait
。- 使用ExpectedConditions.textToBe(...)方法:
- 等待 CSS 选择器为
#s-topleft > a:nth-child(1)
的元素中出现文本"新闻"
。- 如果在 10 秒内找到匹配文本,则返回
true
;否则抛出TimeoutException
。- 根据返回值打印测试结果。
5. 浏览器导航
打开网站:
java
//更长的方法
driver.navigate().to("https://www.baidu.com/");
//简洁的方法
driver.get("https://www.baidu.com/");
浏览器的前进、后退、刷新:
java
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
6. 弹窗
当页面弹出一个 JavaScript 弹窗(如 alert
、confirm
或 prompt
),这些弹窗实际上是独立于页面 DOM 的,无法通过常规的 Selenium 查找元素方法(例如 findElement
)来与它们交互。Selenium 提供了专门的 Alert
接口来处理这类弹窗。
警告弹窗+确认弹窗:
java
Alert alert = driver.switchTo().alert();
//确认
alert.accept();
//取消
alert.dismiss();
提示弹窗:
java
Alert alert = driver.switchTo().alert();
alert.sendKeys("hello");
//确认
alert.accept();
//取消
alert.dismiss();
7. 文件上传
点击⽂件上传的场景下会弹窗系统窗⼝,进⾏⽂件的选择。 selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,⽆法识别窗⼝元素 可以使⽤sendkeys来上传指定路径的⽂件,达到的效果是⼀样的。
java
// 使用 CSS 选择器定位页面中的文件上传控件(input 标签,type 属性为 "file")
// 路径表示:body 下第一个 div,再下一个 div 中的 type 为 file 的 input 元素
WebElement ele = driver.findElement(By.cssSelector("body > div >div > input[type=file]"));
// 向该文件上传控件发送本地文件路径,模拟用户选择文件的操作
// 路径必须是文件系统中存在的绝对路径
ele.sendKeys("C:\\Users\\31681\\Desktop\\chromedriver-win64.html");
8. 浏览器参数设置
设置无头模式:
在自动化测试中,无头模式(Headless Mode) 是一种在不打开真实浏览器窗口的情况下运行浏览器的方式。它非常适合用于服务器环境、CI/CD 流程或希望减少资源占用的场景。
Selenium 支持通过浏览器选项、来设置浏览器以无头模式运行。
- 无界面浏览器模式,即没有图形化界面
- 所有操作在都在后台进行,用户无法看到浏览器窗口
java
//配置本地驱动
System.setProperty("webdriver.chrome.driver", "C:\\Users\\31681\\Desktop\\chromedriver-win64\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
//允许访问所有链接
options.addArguments("--remote-allow-origins=*");
//设置无头模式
options.addArguments("-headless");
//打开浏览器
WebDriver driver = new ChromeDriver(options);
//输入百度网络
driver.get("https://www.baidu.com/");
设置浏览器的加载策略:
设置浏览器的页面加载策略(Page Load Strategy),允许你控制 WebDriver 等待页面加载的方式。
Selenium 提供了三种不同的页面加载策略:normal
、eager
和 none
。
页面加载策略选项
normal
(默认)- 等待整个页面,包括所有子资源(如图片、样式表等)加载完成。
eager
- 交互状态加载,即当初始 HTML 文档已被完全加载和解析,但不等待样式表、图片和其他子资源完成加载时立即返回控制权。
none
- 不等待任何资源加载完成,一旦 DOM 被接收到就返回控制权。
java
//例
// 设置页面加载策略为 NONE
options.setPageLoadStrategy(PageLoadStrategy.NONE);