文章目录
- [1. 显示等待分析](#1. 显示等待分析)
- [2. ExpectedConditions集合的使用](#2. ExpectedConditions集合的使用)
- [3. 自定义显示等待](#3. 自定义显示等待)
- [4. 了解 FluentWait -流等待](#4. 了解 FluentWait -流等待)
- 总结
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。

本文开始
1. 显示等待分析
显示等待 :WebDriverWait(driver 实例, 最长等待时间).until(结束条件函数)
1)在代码中等待指定条件发生后,然后再执行其他代码
2)在最长等待时间内循环执行结束条件的函数
3)结束等待两种方式:达到最大等待时间 或者 满足结束条件函数;
2. ExpectedConditions集合的使用
常见几种ExpectedConditions集合方法的使用如下:
element - 元素相关等待
java
public static WebDriverWait webDriverWait;
@BeforeAll
public static void setUp() {
//前置
webDriver = new ChromeDriver();
webDriverWait = new WebDriverWait(webDriver, Duration.ofSeconds(10));
}
/**
* 第一种:显示等待高阶使用
* 使用集合ExpectedConditions
* 测试按钮说明:点击按钮找不到元素,元素初始是不能点击的,需要等待几秒才能点击
*/
//元素是否可点击
@Test
public void waitAdvance1() {
webDriver.get("https://study_up_up");
//方式1.使用By定位器
WebElement successBtn = webDriverWait.until(
ExpectedConditions.elementToBeClickable(By.id("success_btn")));
successBtn.click();
// 方式2:使用 WebElement
WebElement button = driver.findElement(By.id("submitBtn"));
WebElement clickableElement = wait.until(
ExpectedConditions.elementToBeClickable(button)
);
clickableElement.click();
}
--------------------------------------------------------------------------------------
//元素是否可见invisibilityOfElementLocated()
@Test
public void waitAdvanceTest2() {
// 等待加载动画消失
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loadingSpinner")));
// 等待成功消息显示
WebElement successMsg = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.className("success-message"))
);
System.out.println("成功消息: " + successMsg.getText());
// 等待搜索结果列表可见
WebElement resultsList = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".search-results ul"))
);
}
url 包含特定文本等待 - urlContains()
java
@Test
public void waitAdvanceTest2() {
// 登录后等待跳转到首页
driver.findElement(By.id("loginBtn")).click();
// 等待URL包含"dashboard"
wait.until(ExpectedConditions.urlContains("dashboard"));
System.out.println("当前URL: " + driver.getCurrentUrl());
// 等待URL匹配完整路径
wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard/home"));
// 文件上传后的跳转
driver.findElement(By.id("uploadBtn")).click();
//等待浏览器地址栏的URL包含"upload-success"这个字符串
wait.until(ExpectedConditions.urlContains("upload-success"));
}
title 页面标题相关等待 - titleIs()
java
@Test
public void waitAdvanceTest2() {
// 精确匹配标题
wait.until(ExpectedConditions.titleIs("用户登录 - 我的网站"));
System.out.println("页面标题: " + driver.getTitle());
// 标题包含特定文本
wait.until(ExpectedConditions.titleContains("用户登录"));
// 或者
boolean containsLogin = wait.until(ExpectedConditions.titleContains("登录"));
// 页面跳转后的标题验证
driver.findElement(By.linkText("个人中心")).click();
wait.until(ExpectedConditions.titleContains("个人中心"));
}
frame 框架相关的等待 - frameToBeAvailableAndSwitchToIt()
java
@Test
public void waitAdvanceTest2() {
// 方式1:通过ID或name切换到iframe
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("iframeId"));
// 方式2:通过index切换到iframe
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(0));
// 方式3:通过WebElement切换到iframe
WebElement iframeElement = driver.findElement(By.tagName("iframe"));
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(iframeElement));
// 方式4:通过By定位器切换到iframe
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[src*='form']")));
// 操作iframe内的元素
driver.findElement(By.id("iframeInput")).sendKeys("测试数据");
// 切换回主文档
driver.switchTo().defaultContent();
}
alert 弹窗相关的等待 - alertIsPresent()
java
@Test
public void waitAdvanceTest2() {
// 等待弹窗出现
wait.until(ExpectedConditions.alertIsPresent());
// 获取弹窗并操作
Alert alert = driver.switchTo().alert();
// 获取弹窗文本
String alertText = alert.getText();
System.out.println("弹窗信息: " + alertText);
// 接受弹窗(确定)
alert.accept();
// 或者取消弹窗
// alert.dismiss();
// 处理带输入的弹窗
// alert.sendKeys("输入内容");
// alert.accept();
}
3. 自定义显示等待
官方的 ExpectedConditions 不可能覆盖所有场景,自定义封装显示等待条件会更加灵活。
使用:主要是在until()中自定义函数,满足测试需要;
如:这里是轮询点击,点击成功后出现弹窗获取文本信息;
java
/**
* 第二种:自定义显示等待逻辑和条件
* 推荐使用lambda表达式
*/
@Test
public void waitAdvance2() throws InterruptedException {
//测试说明:要求点击两次,才能获取到弹窗中内容文本
webDriver.get("https:/study_up_up");
String primaryBtn = webDriverWait.until(
(webDriver) -> {
//点击按钮-在显示设置的等待时间内一直会点击按钮
webDriver.findElement(By.id("primary_btn")).click();
//直到找到弹窗内容文本,才返回-也就是结束函数,否则等待时间到了就报异常
return webDriver.findElement(By.xpath("//*[text()='弹框点击两次后才会弹出']")).getText();
}
);
Thread.sleep(2000);
System.out.println(primaryBtn);
}
4. 了解 FluentWait -流等待
说明:与显式等待类似
主要设定参数:设定超时时间-withTimeout();设定轮询频率-pollingEvery();忽略特定类型的异常ignoring();
【注】使用较少,平常使用80%显示等待可以解决;
java
@Test
public void fluentWaitTest() throws InterruptedException {
webDriver.get("https://study_up_up");
Wait<WebDriver> wait = new FluentWait<>(webDriver)
//设置等待超时时间
.withTimeout(Duration.ofSeconds(30))
//设置轮询频率时间
.pollingEvery(Duration.ofSeconds(5))
//设置忽略特定的异常
.ignoring(NoSuchElementException.class);
WebElement primaryBtn = wait.until(
(webDriver) -> {
webDriver.findElement(By.id("primary_btn")).click();
return webDriver.findElement(By.xpath("//*[text()='弹框点击两次后才会弹出']"));
}
);
Thread.sleep(2000);
System.out.println(primaryBtn.getText());
}
总结
✨✨✨各位读友,本篇分享到内容是否更好的让你理解了 显示等待的高级使用呢,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!
