一, web 浏览器控制
- 模拟功能测试中对浏览器的操作
1,基本操作
2,代码示例
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class BrowerTest {
static WebDriver driver;
@BeforeAll
static void setupClass() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
//创建一个driver对象
driver = new ChromeDriver(options);
}
@AfterAll
static void tearDownClass() {
driver.quit();
}
//打开网页
@Test
void getTest(){
driver.get("https://www.ceshiren.com");
}
//浏览器刷新网页
@Test
void refreshTest() throws InterruptedException {
//先打开网页
driver.get("https://www.ceshiren.com");
Thread.sleep(2000);
//刷新
driver.navigate().refresh();
}
//浏览器退回
@Test
void backTest() throws InterruptedException {
//先打开测试人网页网页
driver.get("https://www.ceshiren.com");
//打开百度网页
driver.get("https://www.baidu.com");
//退回到测试人网页
driver.navigate().back();
Thread.sleep(2000);
}
//浏览器前进
@Test
void forwardTest() throws InterruptedException {
//先打开测试人网页网页
driver.get("https://www.ceshiren.com");
//打开百度网页
driver.get("https://www.baidu.com");
//退回到测试人网页
driver.navigate().back();
//再次前进到百度网页
driver.navigate().forward();
Thread.sleep(2000);
}
//浏览器窗口最大化
@Test
void maximizeTest() throws InterruptedException {
//先打开测试人网页网页
driver.get("https://www.ceshiren.com");
driver.manage().window().maximize();
Thread.sleep(2000);
}
//浏览器窗口最小化
@Test
void minimizeTest() throws InterruptedException {
//先打开测试人网页网页
driver.get("https://www.ceshiren.com");
driver.manage().window().minimize();
Thread.sleep(2000);
}
}
二, 常见控件定位方法
1, Selenium定位方式
- Selenium提供了八种定位方式:Locator strategies | Selenium
2,常用定位方式
(1) id 定位
-
先找到log id对应的属性值
site-logo
-
代码展示定位id
//通过 id 定位
@Test
void locatorById() throws InterruptedException {
//打开网页
driver.get("https://www.ceshiren.com");
//查找logo id
WebElement logId = driver.findElement(By.id("site-logo"));
//操作点击logo
logId.click();
Thread.sleep(3000);
}
(2)name 定位
-
示例为百度首页的
更多
选项栏对应的name为tj_briicon
-
代码展示定位name
//通过 name 定位
@Test
void locatorByName() throws InterruptedException {
//打开网页
driver.get("https://www.baidu.com");
//查找name元素的值并点击
driver.findElement(By.name("tj_briicon")).click();
Thread.sleep(3000);
}
(3) cssSelector 定位
-
格式:
driver.findElement(By.cssSelector("css表达式"));
-
css selector获取方式:
- 复制绝对定位
- 编写 cssSelector 表达式(后面章节详细讲解)
-
示例: 从网页获取logo对应的cssSelector
- 鼠标放在logo上点击右键 ,选择检查,会跳转到元素模式;在logo对应的行代码点击右键 - 选择复制 - 选择复制selector即可复制成功
- 鼠标放在logo上点击右键 ,选择检查,会跳转到元素模式;在logo对应的行代码点击右键 - 选择复制 - 选择复制selector即可复制成功
-
代码展示定位logo
@Test
void locatorCssSelecter() throws InterruptedException {
//打开网页
driver.get("https://www.ceshiren.com");
driver.findElement(By.cssSelector("#site-logo")).click();
Thread.sleep(3000);
}
(4)xpath 定位
-
格式:
driver.findElement(By.xpath("xpath表达式"));
-
xpath表达式获取方式:
- 复制绝对定位
- 编写 xpath 表达式(后面章节详细讲解)
-
示例:从网页获取logo图标的xpath(获取方式同cssSelector)
-
代码展示定位logo
@Test
void locatorByXPath() throws InterruptedException {
//打开网页
driver.get("https://www.ceshiren.com");
driver.findElement(By.xpath("//*[@id=\"site-logo\"]")).click();
Thread.sleep(3000);
}
(5) link 定位
-
格式:
driver.findElement(By.linkText("链接的文本信息"));
-
从网页随机获取一篇帖子的标题对应的元素
-
代码展示定位文本元素
@Test
void locatorByLinkText() throws InterruptedException {
//打开网页
driver.get("https://ceshiren.com/tag/%E7%B2%BE%E5%8D%8E%E5%B8%96");
driver.findElement(By.linkText("思寒漫谈测试人职业发展")).click();
Thread.sleep(3000);
}
三,selenium 的等待方式
(1)经典的三种等待方式
- 强制(直接)等待
- 隐式等待
- 显式等待
(2)三种等待方式介绍
直接等待
-
示例:页面还未渲染完成,元素还未加载出来就进行了查询元素的操作,会导致报错
-
在报错的元素操作之前添加等待即可解决
@Test
void waitSleep() throws InterruptedException {
//页面还未渲染完成,元素还未加载出来就进行了查询元素的操作,所以会导致报错
driver.get("https://vip.ceshiren.com/");
//添加直接等待,使线程休眠一定时间
Thread.sleep(3000);
driver.findElement(By.xpath("//*[text()='个人中心']"));
}
隐式等待
- 问题:难以确定元素加载的具体等待时间。
- 解决方案:针对于寻找元素的这个动作,使用隐式等待添加配置。
- 原理:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
- 代码示例
@Test
void waitSleepImplicitlyWait() {
//隐式等待,是一个全局性的配置
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(4));
driver.get("https://vip.ceshiren.com/");
driver.findElement(By.xpath("//*[text()='个人中心']"));
}
显式等待
- 问题:元素可以找到,使用点击等操作,出现报错
- 原因:
- 页面元素加载是异步加载过程,通常html会先加载完成,js、css其后
- 元素存在与否是由HTML决定,元素的交互是由css或者js决定
- 隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互
- 解决方案:使用显式等待
- 示例:
WebDriverWait(driver实例, 最长等待时间).until(结束条件);
- 原理:在最长等待时间内,是否满足结束条件
- 代码示例:
- 示例:
@Test
void waitUntil() {
//操作:打开页面,点击消息提示按钮
driver.get("https://vip.ceshiren.com/#/ui_study/frame");
//显示等待:非全局性配置
//等待By.id("success_btn")元素为可点击的状态
WebElement successBtn = new WebDriverWait(driver, Duration.ofSeconds(5))
.until(ExpectedConditions.elementToBeClickable(By.id("success_btn"))
);
//点击对应的元素按钮
successBtn.click();
}
四,Selenium 常见控件交互方法
元素操作
//输入点击清空操作
@Test
void inputClearClick() throws InterruptedException {
//打开百度网页
driver.get("https://www.baidu.com/");
//在输入框输入霍格沃兹测试开发
driver.findElement(By.id("kw")).sendKeys("霍格沃兹测试开发");
Thread.sleep(2000);
//点击百度一下按钮
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
//清除输入框的输入
driver.findElement(By.id("kw")).clear();
}
获取元素属性信息
//获取定位元素属性信息
@Test
void getAttribute(){
driver.get("https://vip.ceshiren.com/#/ui_study");
WebElement locateId = driver.findElement(By.id("locate_id"));
//获取定位元素的文本信息并打印
System.out.println(locateId.getText());
//获取元素的样式信息并打印,getAttribute需要传入元素属性的名称,才能获取对应属性的值
System.out.println(locateId.getAttribute("style"));
}
五,Selenium 自动化测试定位策略
1, 定位方式
2, 选择定位器通用原则
- (1) 与研发约定的属性优先(class属性:
[name='locate']
) - (2)身份属性 id,name(web 定位)
- (3) 复杂场景使用组合定位:
- xpath,css
- 属性动态变化(id,text)
- 重复元素属性(id,text,class)
- 父子定位(子定位父)
- (4)js定位