等待机制简介

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

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

测试元在做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):# 将找到的元素个数赋值给eleseles = driver.find_enements(By.XPATH,'//*[@id="site-test-logo"]')#返回结果returun len(eles)>0driver = webdriver.Chrome()driver.get('https://ceshiren.com')# 等待10秒,直到wait_ele_for返回trueWebDriverWait(driver,10).until(wait_ele_for)
  • Java演示版本

void ceshiren(){webDriver = new ChromeDriver();webDriver.get("https://ceshiren.com");//等待10秒,直到wait_ele_for返回truenew WebDriverWait(webDriver,10).until((ExpectredCondition<Boolean>) size ->waitEleFor());
}
//定义方法
Boolean waitEleFor(){// 将找到的元素个数赋值给 elementsList<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 WebDriverWaitclass 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;@BeforeAllpublic static void setUp(){System.setProperty("webdrive.chrome.driver","/driver/chrome95/chromedriver");driver = new ChromeDrive();driver.manage().timeout().implicitlyWait(60,TimeUnit.SECONDS);}@AfterAllpublic static void teardown(){driver.quit();}@Testpublic 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. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁

    锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...

  2. 事务(ACID)、并发一致性问题(丢失修改、读脏数据、不可重复读、幻影读)、封锁(封锁粒度、类型、协议、MySQL 隐式与显示锁定)

    1. 事务 1.1 概念 事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚. 1.2 ACID 1.2.1  原子性(Atomic ...

  3. 隐式转换和显式转换及强制转换的区别

    string strType = "123"; object objType= (object)strType;//可以不要,隐式转换, 要的为显式转换 string strTyp ...

  4. Appium+PythonUI自动化之webdriver 的三种等待方式(强制等待、隐式等待、显示等待)

    在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行.我们可以通过在 ...

  5. appium 等待的3中方式:强制等待、隐式等待、显示等待

    强制等待.隐式等待.显示等待 三者的特点 强制等待是sleep,强烈不推荐,设定的时间太固定,如果是模拟器等待3秒,真机可能只需要等待2秒 driver.implicitly.wat(timeout) ...

  6. 隐式等待,显示等待,强制等待

    显示等待WebDriverWait().隐式等待implicitly_wait().强制等待sleep() 先说强制等待sleep(), 单位是秒; 无论结果如何都要强制等待,到设置的时间后再执行接下 ...

  7. 强制等待、显示等待和隐式等待

    selenium和appium中强制等待.显示等待和隐式等待的区别: 强制等待 time.sleep() 设置固定的线程休眠时间. 显示等待 WebDriverWait() 比如: driver = ...

  8. selenium的三种等待方式(显示等待,隐式等待,强制等待)简单了解与总结

    1.强制等待(无条件等待) 使用方法:time.sleep(delay) delay的单位为秒,delay设置多少秒页面就会等待多少秒(死等),这个方法很容易让线程挂掉,使程序抛异常,所以要慎用此方法 ...

  9. Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  10. C#隐式类型和显示类型

    一,在程序中我们经常会遇到:无法将类型"XXX"隐式装换为"XXX",如下例子: static void Main(string[] args){int i;i ...

最新文章

  1. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.15节创建剪切蒙版...
  2. PostgreSQL(从版本9.3至11.2)任意命令执行漏洞 cve-2019-9193
  3. Python爬虫-04:贴吧爬虫以及GET和POST的区别
  4. ustc小道消息20220122
  5. 用TensorFlow可视化卷积层的方法
  6. 显示计算机程序的表格如何打开,电脑表格怎么小窗口显示不出来怎么办
  7. Sublime Text 2 支持GB2312和GBK
  8. iframe关于滚动条的去除和保留
  9. python之Map函数
  10. 程序员能为爱情做的,就是用他的技术告诉世界:我爱你
  11. HttpClient官方sample代码的深入分析(连接池)
  12. raspberry pi_我如何使用Raspberry Pi与孙辈联系
  13. poj 2499第K短路模板
  14. 无法定位程序输入点 except_python自制王者荣耀抽卡程序
  15. PHP留言板之提交留言
  16. 【2020版】Basic4Android安装配置指南
  17. 项目小记录—拼音码demo
  18. CSS--实心小圆点样式
  19. 计算机专业买笔记本有什么要求,笔记本电脑什么配置好?硬核选购指南来了!...
  20. Springboot 使用 sendgrid发送邮件

热门文章

  1. 性能优化--缓存(Redis)
  2. Zabbix自动发现规则如何使用过滤器
  3. 正负数的原码、反码、补码
  4. 现代向RIMAC投资9000万美元!
  5. SpringBoot项目集成socketIo实现实时推送
  6. 微软声明称按流量计费下不会实施Windows 10更新
  7. 毕设项目分享 python炸弹人小游戏
  8. python字典实例--三级菜单
  9. Java导出自定义样式的Excel表格(POI)
  10. 百度熊掌号对SEO有哪些作用