Skip to content

强制等待与隐式等待


简介

在自动化测试中,等待机制用于确保测试脚本可以正确执行,避免因页面加载、网络延迟或动画效果导致的测试失败。常见的等待方式包括强制等待和隐式等待。


使用场景

使用等待就是为了避免页面未渲染完成时就操作,从而导致报错。

  • 等待动画或过渡效果完成
  • 处理某些特定的固定延迟(如弹窗消失、页面重定向等)
  • 调试测试脚本

强制等待

强制等待是指让测试脚本暂停执行指定的时间,无论页面是否加载完成,它都会等待设定的时间再执行下一步操作。

  • 原理:强制等待,线程休眠一定时间。
  • python:time.sleep(3000) (单位是毫秒)
  • java:Thread.sleep(3000);(单位是毫秒)

python 示例

from selenium import webdriver
from selenium.webdriver.common.by import By

def wait_sleep():
    """
    如果直接执行,不添加任何等待,可能会报错
    """
    driver = webdriver.Chrome()
    driver.get("https://vip.ceshiren.com/")
    # 添加等待,让页面渲染完成
    time.sleep(3)
    driver.find_element(By.XPATH, "//*[text()='个人中心']")

if __name__ == '__main__':
    wait_sleep()

java 示例

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.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.time.Duration;


public class WaitTest {
    public static WebDriver driver;

    @BeforeAll
    static void setUpAll() {
        driver = new ChromeDriver();
    }
    @AfterAll
    static void tearDownAll() {
        driver.quit();
    }
    @Test
    void waitSleep() throws InterruptedException {
        driver.get("https://vip.ceshiren.com/");
        Thread.sleep(3000);
        driver.findElement(By.xpath("//*[text()='个人中心']"));
    }
}

隐式等待

隐式等待告诉 WebDriver 在查找元素时,如果找不到元素,则在超时时间范围内不断轮询查找,直到元素出现或超时。适用于页面加载时间不固定、元素可能会在一段时间后才出现,或者是需要全局适用的等待策略。

  • 原理:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常。
  • python:driver.implicitly_wait(10)
  • java:driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

强制等待 vs. 隐式等待

对比项 强制等待(Sleep) 隐式等待(Implicit Wait)
等待方式 固定时间,无论元素是否加载完成 设定时间内轮询查找元素,找到后立即执行
适用场景 适用于短暂等待(如动画、重定向) 适用于页面加载时间不确定的情况
执行效率 低,可能造成不必要的等待 高,减少等待时间,提高测试效率

隐式等待无法解决的问题

  • 元素可以找到,使用点击等操作,出现报错
  • 原因: - 页面元素加载是异步加载过程,通常html会先加载完成,js、css其后 - 元素存在与否是由HTML决定,元素的交互是由css或者js决定 - 隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互
  • 解决方案:使用显式等待

显式等待基本使用(初级)

  • 原理:在最长等待时间内,是否满足结束条件
  • 基本使用:WebDriverWait(driver实例, 最长等待时间).until(结束条件);

python 示例


java 示例

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.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;
import java.time.Duration;

public class WaitTest {
    public static WebDriver driver;

    @BeforeAll
    static void setUpAll() {
        driver = new ChromeDriver();
        //显式等待
        driver.manage().timeouts().implicitlyWait(
            Duration.ofSeconds(10));
    }

    @AfterAll
    static void tearDownAll() {
        driver.quit();
    }
    @Test
    void wait_untils(){
        driver.get("https://vip.ceshiren.com/#/ui_study");
        WebElement resElement = new WebDriverWait(driver, 
        Duration.ofSeconds(10))
        .until(ExpectedConditions.elementToBeClickable(
            By.cssSelector("#success_btn")));
        resElement.click();
    }
}

总结

类型 使用方式 原理 适用场景
直接等待 Thread.sleep(3000); 强制线程等待 调试代码,临时性添加
隐式等待 driver.manage(). timeouts().implicitlyWait( Duration.ofSeconds(10)); 在时间范围内,轮询查找元素 解决找不到元素问题,无法解决交互问题
显式等待 WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件) 设定特定的等待条件,轮询操作 解决特定条件下的等待问题,比如点击等交互性行为