Selenium 3和JUnit 5中的显示等待与隐式等待

目录

[显示等待(Explicit Wait)](#显示等待(Explicit Wait))

什么是显示等待?

如何实现显示等待?

显示等待条件

[隐式等待(Implicit Wait)](#隐式等待(Implicit Wait))

什么是隐式等待?

如何实现隐式等待?

显示等待和隐式等待的区别

强制等待


在Selenium自动化测试中,等待是一个至关重要的概念。网页加载速度、元素的可见性以及元素的可交互性都是测试脚本成功执行的关键因素。Selenium提供了两种主要的等待方式,即"显示等待"和"隐式等待",用于处理这些情况。本文将深入探讨这两种等待方式的使用场景和实现方式,并结合Selenium 3和JUnit 5来说明。

显示等待(Explicit Wait)

什么是显示等待?

显示等待是一种在特定条件下等待某个元素出现或某个条件变为真的等待方式。这意味着你可以设置一个等待时间,只有在这个时间内特定条件满足时,测试脚本才会继续执行。这样可以确保在元素加载完成或者某个条件成立之后再进行后续的操作,从而提高测试的稳定性和可靠性。

如何实现显示等待?

在Selenium 3和JUnit 5中,我们可以使用WebDriverWait类来实现显示等待,如以下示例:

java 复制代码
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExplicitWaitExample {

    @Test
    public void explicitWaitExample() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();

        // 打开网页
        driver.get("https://example.com");

        // 创建一个等待对象,设置等待时间为10秒
        WebDriverWait wait = new WebDriverWait(driver, 10);

        // 等待直到按钮可点击
        WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Click Me']")));

        // 点击按钮
        button.click();

        // 关闭浏览器
        driver.quit();
    }
}

上述代码中,我们首先设置了Chrome浏览器的驱动路径,并创建了一个WebDriver实例。然后,我们打开了网页,并使用WebDriverWait类来创建一个显示等待对象,并指定了最大等待时间为10秒。接下来,我们使用ExpectedConditions.elementToBeClickable条件来等待按钮出现并可点击。一旦按钮符合条件,就会执行后续的点击操作。

显示等待条件

  1. elementToBeClickable: 等待元素可点击,适用于需要点击某个元素的操作。
java 复制代码
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));
  1. visibilityOfElementLocated: 等待元素可见,适用于需要验证元素是否出现在页面上的操作。
java 复制代码
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='example']")));
  1. textToBePresentInElement: 等待文本出现在元素中,适用于需要验证元素是否包含特定文本的操作。
java 复制代码
boolean textPresent = wait.until(ExpectedConditions.textToBePresentInElement(By.id("elementId"), "Expected Text"));
  1. presenceOfElementLocated: 等待元素存在,不关心元素是否可见或可点击,只要元素在DOM中存在即可。
java 复制代码
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId")));
  1. frameToBeAvailableAndSwitchToIt: 等待帧可用并切换到它,适用于需要在iframe中执行操作的情况。
java 复制代码
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frameId")));
  1. alertIsPresent: 等待警告框出现,适用于需要处理JavaScript警告框的情况。
java 复制代码
Alert alert = wait.until(ExpectedConditions.alertIsPresent());

这些等待条件使你能够根据需要等待元素的各种状态,以确保你的自动化测试脚本在执行操作之前等待正确的条件。根据具体的测试场景和需求,你可以选择适当的等待条件来提高测试的稳定性和可靠性。

隐式等待(Implicit Wait)

什么是隐式等待?

隐式等待是一种全局性的等待设置,它会在整个测试脚本的执行过程中生效。当你启用隐式等待后,Selenium会在查找元素时等待一段时间,如果元素在这个时间内找到了,就会立即执行后续操作,否则会抛出超时异常。这个等待时间是全局的,适用于所有的元素查找操作。

如何实现隐式等待?

在Selenium 3和JUnit 5中,你可以使用implicitlyWait方法来启用隐式等待。以下是一个示例:

java 复制代码
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ImplicitWaitExample {

    @Test
    public void implicitWaitExample() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();

        // 设置全局的隐式等待时间为10秒
        driver.manage().timeouts().implicitlyWait(10, java.util.concurrent.TimeUnit.SECONDS);

        // 打开网页
        driver.get("https://example.com");

        // 查找元素,如果元素不在页面上立即找到,最多等待10秒
        WebElement element = driver.findElement(By.xpath("//input[@name='search']"));

        // 执行其他操作
        element.sendKeys("Selenium");

        // 关闭浏览器
        driver.quit();
    }
}

在上述代码中,我们首先设置了Chrome浏览器的驱动路径,并创建了一个WebDriver实例。然后,我们使用driver.manage().timeouts().implicitlyWait方法来设置全局的隐式等待时间为10秒。这意味着每次查找元素时,Selenium会等待最多10秒,如果元素在这个时间内找到了,就会继续

执行后续操作。


显示等待和隐式等待的区别

1. 用法和范围:

  • 隐式等待: 隐式等待是一种全局性的等待设置,适用于整个WebDriver实例的生命周期。一旦设置了隐式等待,它将在所有的元素查找操作上生效,除非被显式地覆盖或禁用。它不依赖于特定条件或元素,而只是设置了一个全局的最大等待时间,当查找元素时,如果元素没有立即找到,WebDriver会等待指定的时间。

  • 显示等待: 显示等待是一种更灵活的等待机制,它允许你根据特定的条件等待元素或条件满足后再执行后续操作。显示等待需要明确地定义等待条件和等待时间,并且仅在等待条件满足或超时后才继续执行操作。显示等待是针对特定的元素或条件,可以根据需要在不同的地方使用不同的等待条件和时间。

2. 超时处理:

  • 隐式等待: 隐式等待设置一个全局的超时时间,如果在该时间内找到了元素,就会立即执行后续操作。如果超过了超时时间而元素还未找到,WebDriver会抛出NoSuchElementException异常。

  • 显示等待: 显示等待允许你为每个等待条件设置不同的超时时间。这意味着你可以根据不同的情况和需求设置不同的等待时间,以确保测试脚本在特定条件满足后继续执行。

3. 等待条件:

  • 隐式等待: 隐式等待不依赖于特定的等待条件,它只是等待一段时间,无论元素是否可见、可交互或其他条件。

  • 显示等待: 显示等待允许你使用预定义的等待条件(例如visibilityOfElementLocatedelementToBeClickabletextToBePresentInElement等)或自定义的等待条件,以满足特定的测试需求。你可以根据需要选择适当的条件。

综上所述,显示等待提供了更大的灵活性和控制,因为它允许你为不同的元素或情况设置不同的等待条件和超时时间。隐式等待则是一种全局设置,适用于整个WebDriver实例,对于整体性能有较好的控制,但缺乏灵活性,可能会导致不必要的等待时间或等待时间过短。在实际测试中,通常建议优先使用显示等待,根据需要进行精确的等待条件配置,以提高测试的稳定性和可维护性~~😁

强制等待

强制等待是一种等待方式,它不依赖于特定条件或元素的可见性或可点击性。相反,它是在测试脚本中添加一个明确的等待时间,无论条件是否满足,都会等待指定的时间。虽然强制等待不是推荐的等待策略,因为它不够灵活,但在某些情况下仍然有用,例如等待网页加载或执行复杂的JavaScript操作后。

在Selenium中,我们可以使用Thread.sleep方法来实现强制等待。这个方法会导致当前线程暂停执行指定的时间,单位是毫秒。

java 复制代码
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class ExplicitWaitExample {

    @Test
    public void forceWaitExample() throws InterruptedException {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();

        // 打开网页
        driver.get("https://example.com");

        // 执行一些操作...

        // 强制等待5秒钟
        Thread.sleep(5000);

        // 执行其他操作...

        // 关闭浏览器
        driver.quit();
    }
}

在上述代码中,我们使用Thread.sleep方法来强制等待5秒钟。请注意,这会导致测试脚本暂停执行,无论页面是否已经加载完毕或其他条件是否满足。因此,强制等待可能会导致测试脚本变得不稳定,因为它不会等待元素的可见性或可交互性。

总结:

在Selenium自动化测试中,等待是一个至关重要的概念,用于处理页面加载、元素可见性和可交互性等情况。两种主要的等待方式是隐式等待(Implicit Wait)和显示等待(Explicit Wait),它们在用法和行为上有一些关键区别。

隐式等待 是一种全局性的等待设置,它适用于整个WebDriver实例的生命周期。它会设置一个全局的最大等待时间,当查找元素时,如果元素没有立即找到,WebDriver会等待指定的时间,然后继续执行后续操作。隐式等待不依赖于特定条件或元素,而只是在元素查找时等待一段时间。

显示等待 是一种更灵活的等待机制,它允许你根据特定的条件等待元素或条件满足后再执行后续操作。显示等待需要明确地定义等待条件和等待时间,并且仅在等待条件满足或超时后才继续执行操作。显示等待是针对特定的元素或条件,可以根据需要在不同的地方使用不同的等待条件和时间。

相关推荐
Marktowin2 小时前
Mybatis-Plus更新操作时的一个坑
java·后端
赵文宇2 小时前
CNCF Dragonfly 毕业啦!基于P2P的镜像和文件分发系统快速入门,在线体验
后端
程序员爱钓鱼3 小时前
Node.js 编程实战:即时聊天应用 —— WebSocket 实现实时通信
前端·后端·node.js
Libby博仙3 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端
源代码•宸4 小时前
Golang原理剖析(Map 源码梳理)
经验分享·后端·算法·leetcode·golang·map
小周在成长4 小时前
动态SQL与MyBatis动态SQL最佳实践
后端
瓦尔登湖懒羊羊4 小时前
TCP的自我介绍
后端
小周在成长4 小时前
MyBatis 动态SQL学习
后端
子非鱼9214 小时前
SpringBoot快速上手
java·spring boot·后端
我爱娃哈哈4 小时前
SpringBoot + XXL-JOB + Quartz:任务调度双引擎选型与高可用调度平台搭建
java·spring boot·后端