软件测试 | 隐式等待、显示等待和强制等待分别是什么?

518 篇文章 3 订阅
514 篇文章 2 订阅
文章介绍了Web自动化测试中确保代码稳定性的等待机制,包括隐式等待、显式等待和强制等待。隐式等待是全局设置,按时间轮询查找元素;显式等待基于特定条件判断;强制等待则是固定时间间隔的线程休眠。文中提供了Python和Java版本的代码示例,并通过实战演示解释了各种等待机制的使用场景。
摘要由CSDN通过智能技术生成

等待机制简介

系统在实际工作中引入等待机制可以保证代码运行的稳定性,保证代码运行不会受网速、计算机心梗等条件的约束。

等待就是当系统运行是,如果页面的渲染速度跟不上程序的运行速度,就需要认为地区限制程序执行的速度。

测试元在做Web自动化测试时,一般要等待页面元素加载完成后,才能执行测试操作,否则会报找不到元素等错误,这样就要求在有些测试场景下加上等待机制。

最常见的等待机制有3种:隐式等待、显示等待和强制等待,下面介绍这3种等待机制。

1.隐式等待

我们在测试用例中设置一个隐式等待时间,测试用例执行时会按时间轮询查找(默认0.5秒)元素是否出现,如果在轮询查找的时间内元素没出现系统就抛出异常。

隐式等待的作用域是全局的,隐式等待可以在setup方法中设置,是作用在整个Session的声明周期。也就是说只要设置一次隐式等待,后面就不需要再设置。如果再次设置隐式等待,那么后一次的设置会覆盖前一次的设置。

实战演示

当我们在 DOM 结构中查找元素,且元素处于不能立即交互的状态时,将会触发隐式等待。

  • Python版本实现代码

self.drvier.implicitly_wait(30)
  • Java版本实现代码

//隐式等待调用方式,设置等待时间为30秒
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);

2.显式等待

显式等待是在代码中定义等待条件,触发改条件后再执行后续代码,这是根据判断条件进行等待。通俗地讲就是,程序每隔一段时间进行一次条件判断,如果条件成立,则执行下一步;否则继续等待,知道超过设置的最长时间。核心用法代码如下。

  • Python版本

# 导入显式等待
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_condittions
...
# 设置10秒的最大等待时间,等待(By.TAG_NAME,"title")这个元素被点击
WebDriverWait(driver,10).until(
    expected_conditions eleniumt_to_be_clickable((By.TAG_NAME,"title"))
)
...

这里通过导入expected_conditions这个库来满足显式等待所需的使用场景,但是expected_conditions库并不能满足所有场景,这个时候就需要定制化开发一个库来满足特定场景,Java版的实现如下。

  • Java版本

import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
...
//设置10秒的最大等待时间,等待(By.tag_NAME,"title")这个元素被点击
WebDriverWait wait = new WebDriverWait(driver,10);
wait.unitl(ExpectedConditions.elementToBClickable(By.tagName("title")));
...

实战演示

假设:测试Web应用中某个元素超过指定的个数,就可以执行某一个操作。

  • Python演示代码

def ceshiren():
     # 定义一个方法
     def wait_ele_for(driver):
     # 将找到的元素个数赋值给eles
     eles = driver.find_enements(By.XPATH,'//*[@id="site-test-logo"]')
     #返回结果
     returun len(eles)>0
     driver = webdriver.Chrome()
     driver.get('https://ceshiren.com')
     # 等待10秒,直到wait_ele_for返回true
     WebDriverWait(driver,10).until(wait_ele_for)
  • Java演示版本

void ceshiren(){
      webDriver = new ChromeDriver();
      webDriver.get("https://ceshiren.com");
      //等待10秒,直到wait_ele_for返回true
      new WebDriverWait(webDriver,10).until((ExpectredCondition<Boolean>) size ->waitEleFor());
}
//定义方法
Boolean waitEleFor(){
    // 将找到的元素个数赋值给 elements
    List<WebElement>element = webDriver.findElements(By.xpath("//*[@id='sire-text-logo']"));
    return elements.size()>0
}

3.强制等待

强制等待是使程序中的线程休眠一定是啊金。强制等待一般在隐式等待和显式等待都不起作用使用。示例代码如下(Python版和Java版)。

  • Python版本

#等待10秒
time.sleep(10)
  • Java版本

//等待2000毫秒,相当于等待2秒
Thread.sleep(2000)

实战演示

访问测试人社区(测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins),点击 “ 分类” 按钮,然后点击 “霍格沃兹答疑区”链接(见图3-10)

 我们进行上述操作时,当点击“分类”按钮后,发现网页中的严肃还未加载完成,这时就需要隐式等待。在点击 ”霍格沃兹答疑区“链接时,网页中的元素已加载完成,但是这个链接还处在不可点击的状态,这时要用到显示等待。下面是实战演示代码(Python版和Java版)。

  • Python演示代码

#导入依赖
import time 
from selenium import webdriver
from selenium webdriver.common.by import By
from selenium webdriver.support import expected_conditions
from selenium webdriver.support.wait import WebDriverWait

class TestHogwaets():
     def setup(self):
          self.driver = webdriver.Chrome()
          self.driver.get('https://ceshiren.com/')
          #加入隐式等待
          self.driver.implicitly_wait(5)
          
      def teardown(self):
          #加入强制等待
          time.sleep(10)
          self.driver.quit()
          
      def test_hogwarts(self):
          #元素定位,这里的category_name是一个元组
          category_name = (By.LINK_TEXT,"开源项目")
          #加入显式等待
          WebDriverWait(self.driver,10).until(
             expected_conditions.ellement_to_be_clickable(category_name))
          #点击开源项目
          self.driver.find_element(*category_name).click()
  • 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.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
​
import java.util.concurrent.TimeUnit;
​
public class WebDriverWaitTest{
    private static ChromeDriver driver;
    @BeforeAll
    public static void setUp(){
        System.setProperty(
              "webdrive.chrome.driver",
              "/driver/chrome95/chromedriver"
        );
        driver = new ChromeDrive();
        driver.manage().timeout().implicitlyWait(60,TimeUnit.SECONDS);
    }
    @AfterAll
    public static void teardown(){
        driver.quit();
    }
    @Test
    public void waitTest(){
         driver.get("https://ceshiren.com/");
         By locator = By.linkTest("开源项目");
         //加入显式等待
         WebDriverWait wait = new WebDriverWait(driver,10);
         Wait.until(ExpectedConditions.elementToBeClickable(locator));
         //点击开源项目
         driver.findElement(locator).click();
         }
}

软件测试职业发展

图片

零基础入门

图片

测试必备编程篇

图片

自动化测试

图片

性能测试

图片

测试管理

图片

工程效能篇

图片

面试求职篇

软件测试的面试宝典,内含一线互联网大厂面试真题、面试技巧、软件测试面试简历指导,免费领取!

图片

图片

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值