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

文章目录

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

    }

总结

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

相关推荐
掌心向暖RPA自动化20 分钟前
如何用影刀RPA自动化采集公号对标账号历史文章?(上篇) | 选题库+标题库+案例库搭建必备
经验分享·自动化·新媒体运营·影刀rpa
中屹指纹浏览器1 小时前
大模型赋能指纹浏览器:基于安全 GPT 的动态风控对抗与指纹生成技术
经验分享·笔记
meizisay1 小时前
亿可达_自动发邮件攻略
人工智能·经验分享·低代码·职场和发展·自动化
syt_biancheng3 小时前
大规模考试系统性能优化与风险评估
python·功能测试·selenium·性能优化·postman
ClouGence4 小时前
打通复杂医疗数据链路:某头部医疗服务商的数据底座落地经验分享
数据库·经验分享·数据分析
海边夕阳20064 小时前
【每天一个AI小知识】:什么是自注意力?
人工智能·经验分享·机器学习·强化学习·自注意力
天行健王春城老师5 小时前
未来洞察:数字化布局,新趋势解读
经验分享
卓码软件测评5 小时前
CMA/CNAS软件测评机构:【Gatling XPath检查:XPath语法在XML响应中的应用】
测试工具·单元测试·测试用例
时光瀚海5 小时前
澳洲二手交易平台合集,闲置轻松交易
经验分享
金海境科技5 小时前
【服务器数据恢复】互联网短视频平台高并发存储故障数据恢复案例
经验分享