线程等待、显示等待、隐式等待、pollingEvery、页面加载超时设置

本文详细介绍了自动化测试中的三种等待策略:线程等待、隐式等待和显式等待,并提供了具体的代码实现示例。针对不同的测试场景,文章推荐了最佳实践方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程等待、显示等待、隐式等待

1.硬性等待/线程等待:Thread.sleep(5000);

2.隐式等待:全局设置的延时等待,设置等待时间,如果第一次没有找到,会一直循环查找该元素,直到出现或超时抛出异常。

该代码会自动附加到脚本的每一行,每次都不需要写,打开浏览器后只需编写一次。

3.显式等待:在指定的条件范围内查找,找到元素直接返回,超时则抛出异常

在BasePage中封装显示等待方法,提供给页面定位元素时调用

public static WebDriver driver;
//封装显示等待方法
public void waitClickable(By by,int time){
    new WebDriverWait(driver,time).until(ExpectedConditions.elementToBeClickable(By));
}
//页面调用显示等待方法
waitClickable(By.id("1"),5);
findElement(By.id("1")).click();

隐式等待的使用

//隐式等待5秒钟
driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECOND);

注意

自动化脚本中,尽量少用sleep、不用implicitly_wait,多用显示等待。

pollingEvery

设置一段时间去做一件事,比如:每个1秒去查找元素一次

WebDriverWait wait = newWebDriverWait(driver ,30 );
wait.pollingEvery(1,TimeUnit.SECONDS);
driver.findElement(By.xpath("xxx"));

页面加载超时

场景:执行脚本速度太快,页面程序部分页面还没有完全加载出来,就去查找元素,导致抛出异常。

解决方法:PageLoadWait方法

//如果页面加载超过10s还没有加载完成就抛出页面加载超时的异常。
driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);
### 实现线程休眠或等待 在 Selenium 中,为了确保元素能够被成功定位并操作,通常会采用不同的等待策略来应对网页加载时间不确定的情况。这些等待机制主要包括强制等待等待以及显等待。 #### 强制等待 强制等待是一种简单的延迟执行方,它通过让程序暂停指定的时间长度来实现。这种方虽然简单直接,但在实际开发中并不推荐频繁使用,因为固定的等待时间可能会导致测试效率低下或者由于等待不足而失败。Python环境下可以通过`time.sleep()`函数引入固定时长的延时[^4]: ```python import time time.sleep(3) # 让主线程睡眠3秒钟 ``` #### 等待 等待是指 WebDriver 在尝试查找元素之前自动进行的最大等待时间。一旦设置了这个超时期限,当后续调用寻找单个或多个元素的操作未能立即找到目标时,浏览器将会在这个设定的时间范围内持续轮询DOM树直到发现匹配项为止。如果超过了该时限仍找不到,则抛出异常;反之则返回查找到的结果对象。此功能可通过如下代码片段启用[^5]: ```python from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 设置全局等待时间为10秒 ``` #### 显等待 相比于前两种方法,显等待提供了更加灵活精确控制的能力。开发者可以根据具体需求定义特定条件下的动态等待逻辑,比如某个元素变得可见、可点击或是页面标题发生变化等。借助于 `WebDriverWait` 类及其关联的各种预期条件(Expected Conditions),可以构建出满足业务流程所需的复杂等待规则。下面是一个利用FluentWait自定义等待的例子[^3]: ```java // Java版本示例 Wait<WebDriver> wait = new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(30L)) .pollingEvery(Duration.ofSeconds(5L)) .ignoring(NoSuchElementException.class); WebElement foo = wait.until(new Function<WebDriver, WebElement>() { @Override public WebElement apply(WebDriver driver) { return driver.findElement(By.id("foo")); } }); ``` 对于 Python 用户来说,同样有类似的API可供选择: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) ``` 上述代码实现了对ID为 `"myDynamicElement"` 的HTML元素是否存在的一种显等待判断,最大等待周期设定了10秒,并且每隔一段时间就会去检查一次是否已经出现了符合条件的目标节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值