五、Selenium 三种等待方式:强制等待、隐式等待、显示等待


一、强制等待

名词解释:强制线程休眠一定时间,适合脚本调试时使用。

常用方法:Thread.sleep(long millis);

  • 优点:适合脚本调试时使用;
  • 缺点:不能准确把握需要等待的时间,如果用例中大量使用,会浪费不必要的等待时间,影响用例的执行效率;
    • 操作未完成,等待结束,导致系统报错;
    • 操作完成,时间未到,导致浪费时间;

二、隐式等待

名词解释:设置一个最长等待时间,轮询查看页面是否加载完成(默认 0.5 秒),如果超过最长等待时间页面未加载完成则抛出异常。

常用方法:driver.manage().timeouts().implicitlyWait(Duration duration);

  • 优点:隐式等待对整个 WebDriver 生命周期都起作用,在开始时设置一次即可。
  • 缺点:使用隐式等待,程序会一直等待页面加载完成,才会执行下一步操作(有时候页面想要的元素早已加载完成了,但是页面上个别元素还没有加载完成,仍要等待页面全部加载完成才能执行下一步,使用也不是很灵活)

三、显示等待

名词解释:定义等待条件,当条件发生时才执行后续代码。程序会轮询查看条件是否发生(默认 0.5 秒),如果条件成立则执行下一步,否则继续等待,直到超过设置的最长时间,程序抛出异常。
在这里插入图片描述
Wait 接口有两个实现类:WebDriverWait 和 FluentWait

常用方法1:FluentWait 流畅等待

源码解释:

  • Wait 接口的一个实现,可以动态配置它的超时和轮询间隔。
  • 每个 FluentWait 实例定义等待条件的最长时间,以及检查条件的频率。
  • 可配置等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。
  • 线程不安全

示例用法:等待一个元素出现在页面上 30 秒,每 5 秒检查一次它的存在。

	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
         .withTimeout(Duration.ofSeconds(30L))
         .pollingEvery(Duration.ofSeconds(5L))
         .ignoring(NoSuchElementException.class);
  
     WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
       public WebElement apply(WebDriver driver) {
         return driver.findElement(By.id("foo"));
       }
     });

示例用法:登录测试人网站

package com.sunskblue.selenium.waitTest;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.*;

import java.time.Duration;
import java.util.function.Function;

public class LoginTest {

    public static WebDriver driver;

    @BeforeAll
    public static void SetUp() {
        driver = new ChromeDriver();
    }

    @Test
    public void LoginTest() throws InterruptedException {
        driver.get("https://ceshiren.com/");
		// 显示等待核心逻辑
        FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(Duration.ofSeconds(30))
                .pollingEvery(Duration.ofSeconds(5))
                .ignoring(NoSuchElementException.class);
		// 显示等待核心逻辑
        WebElement loginElement = wait.until(new ExpectedCondition<WebElement>() {
            @Override
            public WebElement apply(WebDriver webDriver) {
                return driver.findElement(By.xpath("//span[contains(text(),'登录')]"));
            }
        });
        
        loginElement.click();
        driver.findElement(By.id("login-account-name")).clear();
        driver.findElement(By.id("login-account-name")).sendKeys("961370624@qq.com");
        driver.findElement(By.id("login-account-password")).clear();
        driver.findElement(By.id("login-account-password")).sendKeys("*******");
        driver.findElement(By.id("login-button")).click();
    }

    @AfterAll
    public static void TearDown() {
        driver.quit();
    }
}

常用方法2:WebDriverwait

  • WebDriverWait 继承了 FluentWait,可以使用 FluentWait 中的特性;
  • WebDriverWait 中有两个有参构造器,都调用了本类中的一个全参构造器
  • 全参构造器中使用了 ignoring(NotFountException.class) 方法,使得 WebDriverWait 等待时自动忽略NotFountException;
    在这里插入图片描述

第一个参数: WebDriver 对象
第二个参数:最长等待时间
第三个参数:轮询时间

优点:等待判断准确,不会浪费多余的等待时间,在用例中使用,可以提高执行效率。
缺点:
1、使用相对比较复杂;
2、和强制等待类似,每一行等待只执行一次,如果要进行多个元素的等待,则需要多次写入。

示例用法:等待一个元素出现在页面上 30 秒

package com.sunskblue.selenium.waitTest;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;

/**
 * 显示等待
 */
public class DisplayWaitTest {
    public static WebDriver driver;

    @BeforeAll
    public static void SetUp() {
        driver = new ChromeDriver();
    }

    @Test
    public void LoginTest() throws InterruptedException {

        driver.get("https://ceshiren.com/");
		// 核心逻辑
        WebElement loginElement = new WebDriverWait(driver, Duration.ofSeconds(30)).until(
                new ExpectedCondition<WebElement>() {
                    @Override
                    public WebElement apply(WebDriver webDriver) {
                        return webDriver.findElement(By.xpath("//span[contains(text(),'登录')]"));
                    }
                });
        loginElement.click();

        driver.findElement(By.id("login-account-name")).clear();
        driver.findElement(By.id("login-account-name")).sendKeys("961370624@qq.com");
        driver.findElement(By.id("login-account-password")).clear();
        driver.findElement(By.id("login-account-password")).sendKeys("********");
        driver.findElement(By.id("login-button")).click();
    }

    @AfterAll
    public static void TearDown() {
        driver.quit();
    }
}

四、ExpectedCondition 模块常用方法

https://blog.csdn.net/zyooooxie/article/details/84561783

五、隐式等待和显示等待公用优先级

Selenium官网明确说明说两者不建议一同使用;
共用时,两种等待取决于谁的时间更长;

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Selenium中的显示等待隐式等待是用于在自动化测试中等待页面加载和元素出现的方法。 显示等待需要先导入显示等待所需的模块和等待条件。通过指定最长等待时间和查询元素的频率,直到条件满足或超时后才继续执行后续操作。使用举例中的代码,可以在打开百度页面后,等待10秒钟,每0.5秒检查一次是否存在id为"s-top-loginbtn"的元素,直到该元素出现或超时才继续执行下一步操作。 隐式等待是一次设置,全局生效的等待方法。它会在一个时间段内等待页面加载完成,如果在规定时间内加载完成则执行下一步,否则等待时间结束后执行下一步。隐式等待不应该被频繁地使用,只需要在测试开始前设置一次即可。使用举例中的代码,可以在打开百度页面后,等待5秒钟,直到页面加载完成后才继续执行下一步操作。 所以,显示等待隐式等待都是用于等待页面加载和元素出现的方法,但显示等待是有条件等待,可以指定等待条件和超时时间,而隐式等待是无条件等待,只需设置一个最长等待时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [selenium三种等待方式显示等待隐式等待强制等待)简单了解与总结](https://blog.csdn.net/qq_44728587/article/details/122997412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geekJP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值