目录
[2.2webdriver API](#2.2webdriver API)
[2.13alert、confirm、prompt 的处理](#2.13alert、confirm、prompt 的处理)
1.自动化测试
1.1简介
定义:即软件测试的自动化,将人为驱动的测试行为转化为机器执行的过程。在预设状态下运行 应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。
1.2分类
自动化测试包括UI自动化,接口自动化,单元测试自动化。按照这个金字塔模型来进行自动化测试规划,可以产生最佳的自贡话测试产出投入比(ROI),用较少的投入获得很好的收益。

1.2.1单元测试
投入成本最大的测试,运行评率较高。
tips:java的单元测试框架是Junit。
1.2.2接口自动化
即API测试,相对于UI自动化,API自动化更加容易实现,执行起来也更稳定。
接口自动化特点:
- 可在产品前期,接口完成后介入
- 用例维护量小
- 适合接口变动较小,界面变动频繁的项目
常见测试工具:RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman
1.2.3UI自动化
虽然测试金字塔告诉我们尽量多做API层(即接口层)的自动化测试,但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。且有时候不得不进行UI层的测试。
UI自动化特点:
- 页面相关性强,必须后期项目页面开发完成后介入
- 用例维护量大
- 适合界面变动较小的项目
UI自动化优点:
- 降低大型系统由于变更或多期开发引起的大量回归测试的人力投入
- 减少重复测试的时间,实现快速回归测试
- 创建优良可靠的测试过程,减少人为错误
- 可以运行更多更繁琐的测试
- 可执行一些手工测试困难或不可能进行的测试
- 更好的利用资源
- 测试脚本的重用性
UI自动化适用对象:需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用。
UI自动化测试框架:框架较多,如Windows客户端测试的AutoIT,Web测试的selenium以及 TestPlant eggPlant,Robot framework,QTP等。
下面以 Web UI自动化测试框架的Selenium为例进行详细介绍。
2.Selenium
2.1简介
定义:Web应用中基于UI的自动化测试框架,即做UI自动化测试的一个工具。
优点:
- 免费,可查看源码
- 支持各大浏览器(Edge、Chrome、Opera)
- 跨平台(Linux、Windows、Mac)
- 有丰富的API
三个角色:
- 自动化脚本代码(IDEA中编写)
- 驱动,有驱动可对页面进行操作
- 浏览器
2.2webdriver API
元素的定位:对象的定位是自动化测试的核心,想要操作一个对象,首先要识别该对象。对象和 人一样,有各种的特征(属性),我们可以通过这些特征找到对象。

2.2.1css定位器
- 类选择器:.class值(.s_ipt)
- id选择器:#id值(#kw)
- 父类选择器 子类选择器:父类选择器表达式 子类选择器表达式(#s_kw_wrap #kw)
- 标签选择器:标签名(form)
2.2.2Xpath定位
绝对路径:以 / 开头 (/html/body/div/div/div)
相对路径:以 // 开头
- +索引://form/span[1]/input
- +属性值://input[@class="s_ipt"]
- +通配符://*[@*="s_ipt"]
- +文本匹配://span[text()="百度一下"]
2.2.3标签定位
顾名思义,写入标签名即可,如input,button......
2.2.4关闭浏览器
- quit():关闭浏览器窗口,并彻底退出webdriver,释放与driverserver之间的连接。
- close():关闭浏览器窗口。
java
public class Main {
private static void Test01() {
//创建一个驱动
WebDriver webDriver = new ChromeDriver();
// 打开百度首页
webDriver.get("https://www.baidu.com");
// 定位百度搜索框
// 1.通过css选择器定位
// WebElement search_input = webDriver.findElement(By.cssSelector(".s_ipt"));
// 2.通过Xpath定位
// WebElement search_input = webDriver.findElement(By.xpath("//form/span[1]/input"));
// 3.通过标签定位
WebElement search_input = webDriver.findElement(By.tagName("input"));
// 判断是否查找成功
if (search_input == null) {
System.out.println("测试失败");
}else {
System.out.println("测试通过");
}
// 关闭浏览器
webDriver.quit(); // 关的更彻底,所有信息全部删除(推荐)
// webDriver.close();
}
}
2.3操作测试对象
定位之后就可以对这个元素进行操作,常见操作方法如下:
- click:点击对象
- send_keys:在对象上模拟按键输入
- clear:清除对象输入的文本内容
- submit:提交
- text:获取元素的文本信息
- get:打开网页
java
private static void Test02() throws InterruptedException {
// 创建一个浏览器驱动
WebDriver webDriver = new ChromeDriver();
// 打开百度首页
webDriver.get("https://www.baidu.com/");
// 找到搜索输入框
WebElement search_input = webDriver.findElement(By.cssSelector("#kw"));
// 向搜索输入框中输入"软件测试"
search_input.sendKeys("软件测试");
// 找到"百度一下"
WebElement baidu_button = webDriver.findElement(By.cssSelector("#su"));
// 点击"百度一下"按钮
baidu_button.click();
// 等待
sleep(3000);
// 找到页面上所有与"软件测试"相关的元素
List<WebElement> search_results = webDriver.findElements(By.cssSelector("a em"));
// 遍历List
for (int i = 0; i < search_results.size(); i++) {
if (search_results.get(i).getText().equals("软件测试")){
System.out.println("测试通过");
}else {
System.out.println("测试失败");
}
}
}
click() 与 submit() 的区别:submit操作的元素需要放到form标签中,否则会报错;click没有 这个限制,所以推荐使用click。
- getText:获取文本
- getAttribute:获取元素属性值
java
private static void Test03() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("互联网各大行业");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
webDriver.findElement(By.cssSelector("#kw")).clear();
sleep(3000);
webDriver.findElement(By.cssSelector("#result_logo > img.index-logo-src")).click();
sleep(3000);
// String baidu_button_txt = webDriver.findElement(By.cssSelector("#su")).getText(); //测试不通过
String baidu_button_txt = webDriver.findElement(By.cssSelector("#su")).getAttribute("value"); //测试通过
if (baidu_button_txt.equals("百度一下")) {
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
2.4添加等待
2.4.1sleep休眠
引入 time 包,添加固定休眠时间,单位秒(s)。
java
import time
time.sleep(3)
2.4.2隐式等待
添加 implicitly_wait() 方法,实现智能等待。
java
selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)
time_to_wait 是设置的等待时长。
隐式等待并非等待固定的时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则以轮询的方式不断判断元素是否被定位到,直到超出设置的等待时长。
2.5打印信息
- 打印title:getTitle ()
- 打印url:getCurrentUrl ()
java
private static void Test04() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
String title = webDriver.getTitle();
if (title.equals("百度一下,你就知道")) {
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
String url = webDriver.getCurrentUrl();
if (url.equals("https://www.baidu.com/")) {
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
2.6浏览器操作
- 浏览器最大化:manage().window().maximize()
- 设置浏览器大小:manage().window().setSize(new Dimension(x, y))
- 浏览器前进:navigate().forward()
- 浏览器后退:navigate().back()
- 操作浏览器滚动条:executeScript("document.documentElement.scrollTop= x ")
java
private static void Test05() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//浏览器最大化
webDriver.manage().window().maximize();
sleep(3000);
//设置浏览器大小200*200
webDriver.manage().window().setSize(new Dimension(800,600));
sleep(3000);
//输入"张三"
webDriver.findElement(By.cssSelector("#kw")).sendKeys("张三");
//点击"百度一下"按钮
webDriver.findElement(By.cssSelector("#su")).submit();
//浏览器后退
webDriver.navigate().back();
sleep(3000);
//浏览器前进
webDriver.navigate().forward();
sleep(3000);
//浏览器滚动条划到最下面
((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
sleep(3000);
//浏览器滚动条划到最上面
((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=0");
sleep(3000);
//定位到"换一换"这个元素
String expect_str = webDriver.findElement(By.cssSelector("#hotsearch-refresh-btn > span")).getText();
//如果这个按钮存在,测试通过
if (expect_str.equals("换一换")) {
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
2.7键盘事件
2.7.1键盘按键
- TAB:tab
- ENTER:回车
- SPACE:空格键
- ESCAPE:回退键

这里只拿ENTER举例:
java
private static void Test06() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//输入蛋糕
webDriver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
sleep(3000);
//回车
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.);
sleep(3000);
//校验
List<WebElement> webElements = webDriver.findElements(By.xpath("//font[text()=\"蛋糕\"]"));
sleep(3000);
//寻到搜索结果
int flag = 0;
for (int i = 0; i < webElements.size(); i++) {
if (webElements.get(i).getText().equals("蛋糕")) {
flag = 1;
break;
}
}
if (flag == 1) {
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
2.7.2键盘组合键
- CONTROL,''a'':全选
- CONTROL,''c'':复制
- CONTROL,''x'':剪切
- CONTROL,''v'':粘贴
java
private static void Test07() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//输入蛋糕
webDriver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
sleep(3000);
//Ctrl+A
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"a");
sleep(3000);
//Ctrl+X
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"x");
sleep(3000);
//Ctrl+V
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"v");
sleep(3000);
//点击"百度一下"按钮
webDriver.findElement(By.cssSelector("#su")).click();
//校验
String no_expected_url = "https://www.baidu.com/";
String cur_url = webDriver.getCurrentUrl();
//此时已经不在百度首页界面了
if (cur_url.equals(no_expected_url)) {
System.out.println("测试不通过");
}else {
System.out.println("测试通过");
}
webDriver.quit();
}
2.8鼠标事件
- contextClick:右击
- doubleClick:双击
- dragAndDrop:拖动
- moveToElement:移动
这里只拿contextClick举例:
java
private static void Test08() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//输入"企业微信"并搜索
webDriver.findElement(By.cssSelector("#kw")).sendKeys("企业微信");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
//鼠标操作
//先创建一个actions
Actions actions = new Actions(webDriver);
sleep(3000);
//找到目标元素(按钮)
WebElement target = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
sleep(3000);
//鼠标挪动到按钮上右击
actions.moveToElement(target).contextClick().perform();
webDriver.quit();
}
2.9切换窗口
情景:在"百度首页"窗口点击"新闻"超链接,在"新闻"界面搜索框中输入"经济头条"并搜索。
结果:报错,错误原因是 没找到 #ww 这个css
原因:这是因为点击"新闻"超链接后打开了新的页面,而css检索还是在原来的"百度一下"界面中, 这时候就需要切换窗口。
java
private static void Test09() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//找到"新闻"按钮
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
sleep(3000);
//获得当前的窗口句柄
String cur_handle = webDriver.getWindowHandle();
System.out.println("当前窗口句柄:" + cur_handle);
//获取浏览器当前所有的窗口句柄
Set<String> all_handles = webDriver.getWindowHandles();
String target = "";
//遍历浏览器当前所有的窗口句柄
for (String tmp : all_handles) {
if (!tmp.equals(cur_handle)) {
webDriver.switchTo().window(tmp);
}
}
sleep(3000);
//找到新闻搜索框并输入"经济头条"
webDriver.findElement(By.cssSelector("#ww")).sendKeys("经济头条");
//点击"百度一下"
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
sleep(3000);
//找到搜索结果
List<WebElement> webElements = webDriver.findElements(By.xpath("//em[text=\"经济\"]"));
sleep(3000);
//遍历搜索结果
int flag = 0;
for (int i = 0; i < webElements.size(); i++) {
if (webElements.get(i).getText().equals("经济") || webElements.get(i).getText().equals("头条")) {
flag = 1;
break;
}
}
if (flag == 1) {
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
2.10截图
需要导入Maven中央仓库中的Apache Commons IO 到 .pom文件中。
java
private static void Test10() throws InterruptedException, IOException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
//输入"字节跳动"并搜索
webDriver.findElement(By.cssSelector("#kw")).sendKeys("字节跳动");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
//截图,把截的图放到file临时变量中
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
//把file放到指定路径D盘中
FileUtils.copyFile(file, new File("D://截图2024-6-3.png"));
webDriver.quit();
}
2.11定位一组元素
webdriver 可以很方便地使用findElement 方法来定位某个特定的对象,不过有时候我们需要定位一组对象,这时候就需要使用findElements 方法。
2.12下拉框
对于一般的元素,只需要一次定位,但下拉框里的内容需要进行两次定位。先定位到下拉框,对下拉框进行操作后,再定位到下拉框内里的选项。
2.13alert、confirm、prompt 的处理
- text:返回alert/confirm/prompt 中的文字信息
- accept:确认按钮
- dismiss:取消按钮
- send_keys:输入值,若alert无对话框则不可用
..........
后续见下一篇【测试】Selenium