[测试]Selenium自动化测试常用函数
文章目录
- 1. 元素定位
- 1.1 cssSelector
- 1.2 xpath
- 2. 操作测试对象
- 2.1 点击/提交对象
- 2.2 模拟按键输入
- 2.3 清除文本内容
- 2.4 获取文本信息
- 2.5 获取当前页面标题
- 2.6 获取当前页面URL
- 3. 窗口
- 3.1 切换窗口
- 3.2 窗口设置大小
- 3.3 屏幕截图
- 4. 等待
- 4.1 强制等待
- 4.2 隐式等待
- 4.3 显式等待
- 5. 浏览器导航
- 6. 弹窗
- 6.1 警告弹窗 + 确认弹窗
- 6.2 提示弹窗
- 7. 文件上传
- 8. 浏览器参数设置
- 8.1 设置无头模式
- 8.2 设置浏览器加载策略
1. 元素定位
Web自动化测试的核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。常见的元素定位方式包括 id
、classname
、tagname
、xpath
、cssSelector
等。最常用的是 cssSelector
和 xpath
。
1.1 cssSelector
选择器的功能是选中页面中指定的标签元素。选择器分为基础选择器和复合选择器,常见的元素定位方式可以通过 id
选择器和子类选择器来进行定位。
示例:
- 定位百度首页的“百度热搜”元素:
#s-hotsearch-wrapper > div > a.hot-title > div
- 搜索输入框元素:
#kw
- 百度一下按钮:
#su
1.2 xpath
XPath(XML路径语言)不仅可以在XML文件中查找信息,还可以在HTML中选取节点。XPath使用路径表达式来选择XML文档中的节点。
XPath语法:
- 获取HTML页面所有的节点:
//*
- 获取HTML页面指定的节点:
//[指定节点]
- 获取所有 ui 节点:
//ui
- 获取所有 input 节点:
//input
- 获取所有 ui 节点:
- 获取一个节点中的直接子节点:
//span/input
- 获取一个节点的父节点:
//input/..
- 实现节点属性的匹配:
[@...]
- 匹配
id
属性为kw
的节点://*[@id='kw']
- 匹配
- 使用指定索引的方式获取对应的节点内容:
- 定位到第三个百度热搜标签:
//div/ui/li[3]
- 定位到第三个百度热搜标签:
注意: XPath 的索引是从 1 开始的。
便捷生成 selector/xpath 的方式:
- 右键选择元素,选择“Copy selector”或“Copy XPath”。
问题: 手动复制的 selector/xpath 表达式不一定满足唯一性要求,有时需要手动修改表达式。
2. 操作测试对象
获取到页面的元素后,接下来就是对元素进行操作。常见的操作包括点击、提交、输入、清除、获取文本等。
2.1 点击/提交对象
使用 click()
方法点击元素。
示例:
driver.findElement(By.cssSelector("#su")).click();
2.2 模拟按键输入
使用 sendKeys()
方法输入文本。
示例:
driver.findElement(By.cssSelector("#kw")).sendKeys("输入文字");
2.3 清除文本内容
使用 clear()
方法清除输入框中的文本。
示例:
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
2.4 获取文本信息
使用 getText()
方法获取元素的文本内容。
示例:
String bdtext = driver.findElement(By.xpath("//*[@id='title-content']/span[1]")).getText();
System.out.println("打印的内容是:" + bdtext);
注意: getText()
用于获取元素的文本内容,而 getAttribute("属性名称")
用于获取元素的属性值。
2.5 获取当前页面标题
使用 getTitle()
方法获取当前页面的标题。
示例:
String title = driver.getTitle();
2.6 获取当前页面URL
使用 getCurrentUrl()
方法获取当前页面的URL。
示例:
String url = driver.getCurrentUrl();
3. 窗口
当打开一个新的页面后,获取到的 title
和 URL
仍然是前一个页面的。为了切换到新窗口,可以使用窗口句柄(handle)。
3.1 切换窗口
- 获取当前页面句柄:
driver.getWindowHandle()
- 获取所有页面句柄:
driver.getWindowHandles()
- 切换当前句柄为最新页面:
示例:
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for (String w : allWindow) {
if (!w.equals(curWindow)) {
driver.switchTo().window(w);
}
}
注意: 在执行 driver.close()
之前,需要切换到未被关闭的窗口。
3.2 窗口设置大小
- 窗口最大化:
driver.manage().window().maximize()
- 窗口最小化:
driver.manage().window().minimize()
- 全屏窗口:
driver.manage().window().fullscreen()
- 手动设置窗口大小:
driver.manage().window().setSize(new Dimension(1024, 768))
3.3 屏幕截图
屏幕截图可以记录自动化脚本运行时的错误场景。
屏幕截图方法需要额外导入包:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
示例:
//简单版本
File srcfile = driver.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcfile,new File("my.png"));
//⾼阶版本
List<String> times = getTime();
//⽣成的⽂件夹路径./src/test/autotest-2025-03-01/goodsbroser-20250301-214130.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));
3.5关闭窗口
driver.close();
注意: 窗口关闭后driver要重新定义
4. 等待
由于代码执行速度通常比页面渲染速度快,为了避免因渲染过慢导致的自动化误报问题,可以使用 Selenium 提供的三种等待方法。
4.1 强制等待
使用 Thread.sleep()
方法进行强制等待。
优点: 使用简单,调试时有效。
缺点: 影响运行效率,浪费大量时间。
4.2 隐式等待
隐式等待是一种智能等待,它规定在查找元素
时,在指定时间内不断查找元素。如果找到则继续执行,否则超时报错。
示例:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
优点: 智能等待,作用于全局。
注意: 隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放(driver.quit()),隐式等待就一直生效。
4.3 显式等待
显式等待也是一种智能等待,它在指定超时时间范围
内等待某个条件满足
后继续执行。
ExpectedConditions预定义方法的⼀些示例:
elementToBeClickable(By locator)
‒ 用于检查元素的期望是可见的并已启用,以便您可以单击它。textToBe(Bylocator,String str)
- 检查元素。presenceOfElementLocated(Bylocator)
‒ 检查页面的 DOM 上是否存在元素。urlToBe(java.lang.String url)
‒ 检查当前页面的 URL 是⼀个特定的 URL。
示例:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-top-left > a:nth-child(1)"), "新闻"));
if (ispass) {
System.out.println("测试通过");
} else {
System.out.println("测试失败");
}
优点: 可以自定义等待条件,操作灵活。
缺点: 写法复杂。
注意: 不要混合使用隐式等待和显式等待,可能会导致不可预测的等待时间。
5. 浏览器导航
常见的浏览器导航操作包括打开网站、前进、后退、刷新等。
示例:
// 打开网站
driver.get("https://selenium.dev");
// 浏览器前进
driver.navigate().forward();
// 浏览器后退
driver.navigate().back();
// 刷新页面
driver.navigate().refresh();
6. 弹窗
弹窗是页面中无法直接定位的元素,可以使用 Selenium 提供的 Alert
接口处理。
6.1 警告弹窗 + 确认弹窗
示例:
Alert alert = driver.switchTo().alert();
alert.accept(); // 确认
alert.dismiss(); // 取消
6.2 提示弹窗
示例:
Alert alert = driver.switchTo().alert();
alert.sendKeys("hello");
alert.accept();
7. 文件上传
点击文件上传的场景下会弹窗系统窗口,进行文件的选择。
selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素
但可以通过 sendKeys()
方法上传文件。
示例:
WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
8. 浏览器参数设置
8.1 设置无头模式
无头模式可以在不打开浏览器的情况下运行自动化脚本。
示例:
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver driver = new ChromeDriver(options);
driver.get("https://www.baidu.com");
driver.quit();
8.2 设置浏览器加载策略
默认加载策略为normal
示例:
options.setPageLoadStrategy(PageLoadStrategy.NONE);