自动化测试-显示等待高级使用

文章目录

  • [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());

    }

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了 显示等待的高级使用呢,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
易知微EasyV数据可视化2 小时前
数字孪生可视化破局多行业痛点,EasyV 场景化方案重构效率逻辑:行业demo拆解合集
经验分享·信息可视化·数字孪生
源代码•宸2 小时前
GoLang并发示例代码2(关于逻辑处理器运行顺序)
服务器·开发语言·经验分享·后端·golang
weixin_5372170612 小时前
UI教程资源合集
经验分享
芯有所享14 小时前
【芯片设计后端中的Routing:连接数字世界的精密艺术】
经验分享
许长安14 小时前
C++ 多态详解:从静态多态到动态多态
开发语言·c++·经验分享·笔记
初遇见16 小时前
【Postman 白屏加载问题及解决方案】
测试工具·postman
架构师沉默17 小时前
阿里为何重写 HashMap?ConcurrentHashMap 的缺陷在哪?
经验分享
天才测试猿18 小时前
Postman接口测试:如何导入swagger接口文档?
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
狮子座的男孩19 小时前
js函数高级:06、详解闭包(引入闭包、理解闭包、常见闭包、闭包作用、闭包生命周期、闭包应用、闭包缺点及解决方案)及相关面试题
前端·javascript·经验分享·闭包理解·常见闭包·闭包作用·闭包生命周期