Selenium中的隐式等待和显式等待

在Selenium中,“等待”在执行测试中起着重要作用。在本文中,您将学习Selenium中“隐式”和“显式”等待的各个方面。 在本文中,您将学习到

1. 为什么我们需要在selenium中等待?

2. 隐瞒等待

3. 明确等待

4. 流利的等待

为什么我们需要在Selenium中等待?

大多数Web应用程序都是使用Ajax和Javascript开发的。当浏览器加载页面时,我们想要与之交互的元素可能以不同的时间间隔加载。

它不仅难以识别元素,而且如果元素未定位,它将抛出“ ElementNotVisibleException ”异常。使用Waits,我们可以解决此问题。

让我们考虑一个场景,我们必须在测试中使用隐式和显式等待。假设隐式等待时间设置为20秒,显式等待时间设置为10秒。

假设我们试图找到一个具有一些“ExpectedConditions ”(显式等待)的元素,如果该元素不在显式等待(10秒)定义的时间范围内,它将使用由隐式等待定义的时间帧(在抛出“ ElementNotVisibleException ” 之前20秒)。

Selenium Web驱动程序等待

隐含的等待 明确等待 隐含的等待 Selenium Web Driver借用了Watir隐式等待的想法。

隐式等待将告诉Web驱动程序在它抛出“No Such Element Exception”之前等待一定的时间。默认设置为0.一旦我们设置了时间,Web驱动程序将在抛出异常之前等待该时间。

在下面的示例中,我们声明了一个隐含的等待,时间范围为10秒。这意味着如果元素在该时间范围内不位于网页上,则会引发异常。

声明隐式等待:

 
  1. driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);

 
  1. package guru.test99;

  2. import java.util.concurrent.TimeUnit;

  3. import org.openqa.selenium.By;

  4. import org.openqa.selenium.WebDriver;

  5. import org.openqa.selenium.chrome.ChromeDriver;

  6. import org.testng.annotations.Test;

  7. public class AppTest {

  8. protected WebDriver driver;

  9. @Test

  10. public void guru99tutorials() throws InterruptedException

  11. {

  12. System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );

  13. driver = new ChromeDriver();

  14. driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;

  15. String eTitle = "Demo Guru99 Page";

  16. String aTitle = "" ;

  17. // 启动Chrome并将其重定向到基本网址

  18. driver.get("http://demo.guru99.com/test/guru99home/" );

  19. //最大化浏览器窗口

  20. driver.manage().window().maximize() ;

  21. //获取标题的实际值

  22. aTitle = driver.getTitle();

  23. //将实际标题与预期标题进行比较

  24. if (aTitle.equals(eTitle))

  25. {

  26. System.out.println( "Test Passed") ;

  27. }

  28. else {

  29. System.out.println( "Test Failed" );

  30. }

  31. //关闭浏览器

  32. driver.close();

  33. }

  34. }

代码说明

在上面的例子中,

考虑以下代码:

 
  1. driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;

隐式等待将接受2个参数,第一个参数将接受时间作为整数值,第二个参数将接受时间测量,包括SECONDS,MINUTES,MILISECOND,MICROSECONDS,NANOSECONDS,DAYS,HOURS等。

明确等待 显式等待用于告诉Web驱动程序在抛出“ ElementNotVisibleException ”异常之前等待某些条件(预期条件)或超过最大时间。

显式等待是一种智能的等待,但它只能应用于指定的元素。显式等待提供比隐式等待更好的选项,因为它将等待动态加载的Ajax元素。

一旦我们声明显式等待,我们必须使用“ ExpectedCondtions ”,或者我们可以配置我们想要使用Fluent Wait检查条件的频率。这些天在实现我们使用Thread.Sleep()时通常不建议使用

在下面的示例中,我们创建引用等待“ WebDriverWait ”类并使用“ WebDriver ”引用进行实例化,并且我们给出的最大时间帧为20秒。

句法:

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
  1. package guru.test99;

  2. import java.util.concurrent.TimeUnit;

  3. import org.openqa.selenium.By;

  4. import org.openqa.selenium.WebDriver;

  5. import org.openqa.selenium.WebElement;

  6. import org.openqa.selenium.chrome.ChromeDriver;

  7. import org.openqa.selenium.support.ui.ExpectedConditions;

  8. import org.openqa.selenium.support.ui.WebDriverWait;

  9. import org.testng.annotations.Test;

  10. public class AppTest2 {

  11. protected WebDriver driver;

  12. @Test

  13. public void guru99tutorials() throws InterruptedException

  14. {

  15. System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );

  16. driver = new ChromeDriver();

  17. WebDriverWait wait=new WebDriverWait(driver, 20);

  18. String eTitle = "Demo Guru99 Page";

  19. String aTitle = "" ;

  20. // 启动Chrome并将其重定向到Base URL

  21. driver.get("http://demo.guru99.com/test/guru99home/" );

  22. //最大化浏览器窗口

  23. driver.manage().window().maximize() ;

  24. //获取标题的实际值

  25. aTitle = driver.getTitle();

  26. //将实际标题与预期标题进行比较

  27. if (aTitle.contentEquals(eTitle))

  28. {

  29. System.out.println( "Test Passed") ;

  30. }

  31. else {

  32. System.out.println( "Test Failed" );

  33. }

  34. WebElement guru99seleniumlink;

  35. guru99seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath( "/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));

  36. guru99seleniumlink.click();

  37. }

  38. }

代码说明

考虑以下代码:

 
  1. WebElement guru99seleniumlink;

  2. guru99seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath( "/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));

  3. guru99seleniumlink.click();

在上面的示例中,等待“ WebDriverWait ”类或“ ExpectedConditions ”中定义的时间量,以先发生者为准。

上面的Java代码声明我们正在等待网页上“ WebDriverWait ”类中定义的20秒时间帧的元素,直到满足“ ExpectedConditions ”并且条件为“ visibilityofElementLocated ”。

以下是可以在显式等待中使用的预期条件

·  alertIsPresent()

·  elementSelectionStateToBe()

·  elementToBeClickable()

·  elementToBeSelected()

·  frameToBeAvaliableAndSwitchToIt()

·  invisibilityOfTheElementLocated()

·  invisibilityOfElementWithText()

·  presenceOfAllElementsLocatedBy()

·  presenceOfElementLocated()

·  textToBePresentInElement()

·  textToBePresentInElementLocated()

·  textToBePresentInElementValue()

·  titleIs()

·  titleContains()

·  visibilityOf()

·  visibilityOfAllElements()

·  visibilityOfAllElementsLocatedBy()

·  visibilityOfElementLocated()

流利的等待

流畅的等待用于告诉Web驱动程序等待条件,以及在抛出“ElementNotVisibleException”异常之前我们想要检查条件的频率。

频率:设置具有时间范围的重复循环,以定期验证/检查条件

让我们考虑一个场景,其中元素以不同的时间间隔加载。如果我们声明显式等待20秒,该元素可能会在10秒,20秒甚至更长时间内加载。在抛出异常之前它会等到指定的时间。在这种情况下,流畅的等待是理想的等待使用,因为这将尝试以不同的频率找到元素,直到它找到它或最终的计时器用完为止。 句法:

 
  1. Wait wait = new FluentWait(WebDriver reference)

  2. .withTimeout(timeout, SECONDS)

  3. .pollingEvery(timeout, SECONDS)

  4. .ignoring(Exception.class);

 
  1. package guru.test99;

  2. import org.testng.annotations.Test;

  3. import java.util.NoSuchElementException;

  4. import java.util.concurrent.TimeUnit;

  5. import java.util.function.Function;

  6. import org.openqa.selenium.By;

  7. import org.openqa.selenium.WebDriver;

  8. import org.openqa.selenium.WebElement;

  9. import org.openqa.selenium.chrome.ChromeDriver;

  10. import org.openqa.selenium.support.ui.ExpectedConditions;

  11. import org.openqa.selenium.support.ui.FluentWait;

  12. import org.openqa.selenium.support.ui.Wait;

  13. import org.openqa.selenium.support.ui.WebDriverWait;

  14. import org.testng.annotations.Test;

  15. public class AppTest3 {

  16. protected WebDriver driver;

  17. @Test

  18. public void guru99tutorials() throws InterruptedException

  19. {

  20. System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );

  21. String eTitle = "Demo Guru99 Page";

  22. String aTitle = "" ;

  23. driver = new ChromeDriver();

  24. // 启动Chrome并将其重定向到Base URL

  25. driver.get("http://demo.guru99.com/test/guru99home/" );

  26. //最大化浏览器窗口

  27. driver.manage().window().maximize() ;

  28. //获取标题的实际值

  29. aTitle = driver.getTitle();

  30. //将实际标题与预期标题进行比较

  31. if (aTitle.contentEquals(eTitle))

  32. {

  33. System.out.println( "Test Passed") ;

  34. }

  35. else {

  36. System.out.println( "Test Failed" );

  37. }

  38. Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)

  39. .withTimeout(30, TimeUnit.SECONDS)

  40. .pollingEvery(5, TimeUnit.SECONDS)

  41. .ignoring(NoSuchElementException.class);

  42. WebElement clickseleniumlink = wait.until(new Function<Webdriver, WebElement>(){

  43. public WebElement apply(WebDriver driver ) {

  44. return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));

  45. }

  46. });

  47. //点击selenium链接

  48. clickseleniumlink.click();

  49. //关闭浏览器

  50. driver.close() ;

  51. }

  52. }

代码说明

考虑以下代码:

 
  1. public WebElement apply(WebDriver driver ) {

  2. return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));

  3. }

我们创建了一个新功能来识别页面上的Web元素。(例如:这里的Web元素只不过是网页上的selenium链接)。

频率设置为5秒,最大时间设置为30秒。因此,这意味着它将每隔5秒检查网页上的元素,最长时间为30秒。如果元素位于此时间范围内,它将执行操作,否则将抛出“ ElementNotVisibleException ”

隐式等待与显式等待的区别

结论:

隐式,显式和流利等待是selenium中使用的不同等待。这些等待的使用完全基于以不同时间间隔加载的元素。在测试我们的应用程序或构建我们的框架时,始终不建议使用Thread.Sleep()。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Join优化规则及应用层BI系统实践

目录 一、背景 二、查询优化器概述​编辑 2.1 System R Optimizer 2.2 Volcano Optimizer 2.3 Cascade Optimizer 三、Join相关优化规则 3.1 JoinReorder 3.1.1 少量表的Reorder 3.1.2 大量表的Reorder 3.1.3 星型模型的Reorder 3.2 外连接消除 3.3 Join消除 3.4 谓…

UDP多播

1 、多播的概念 多播&#xff0c;也被称为组播&#xff0c;是一种网络通信模式&#xff0c;其中数据的传输和接收仅在同一组内进行。多播具有以下特点&#xff1a; 多播地址标识一组接口&#xff1a;多播使用特定的多播地址&#xff0c;该地址标识一组接收数据的接口。发送到多…

C#面:Session 喜欢丢值且占内存,Cookis不安全,请问 C# 可以用什么办法代替这两种原始的方法

可以使用 用 ViewState&#xff0c;stateserver。 在 C# 中&#xff0c;ViewState、StateServer 和 Session 都是用于在 Web 应用程序中存储和管理状态信息的机制。它们可以用来在不同的页面之间传递数据或者在同一页面的不同请求之间保持数据的持久性。 ViewState&#xff1…

[Vision Board创客营]--使用openmv识别阿尼亚

文章目录 [Vision Board创客营]使用openmv识别阿尼亚介绍环境搭建训练模型上传图片生成模型 使用结语 [Vision Board创客营]使用openmv识别阿尼亚 &#x1f680;&#x1f680;五一和女朋友去看了《间谍过家家 代号&#xff1a;白》&#xff0c;入坑二刺螈&#xff08;QQ头像也换…

在prompt使用占位符实现提高信息替换成功率和替换位置准确率【prompt】【LLM】

文章目录 问题占位符解决 问题 造数据集的时候遇到的&#xff0c;llm不能很好的帮你替换&#xff0c;替换的内容不对&#xff0c;或者是替换的位置不对&#xff0c;比如这里就是替换位置不对&#xff0c;只盯着doc2替换&#xff0c;无视你的替换位置的变化。 待处理文本 {&quo…

函数作用域(局部变量和全局变量)(狠狠爱住啦)

在Python中&#xff0c;变量可以分为局部变量和全局变量两种类型&#xff0c;它们的作用域不同&#xff0c;对于程序的执行有着不同的影响。 在函数内部定义的变量属于局部作用域&#xff0c;在函数外部定义的变量属于全局作用域。在函数内部&#xff0c;可以使用 global 关键…

小程序地理位置接口申请教程来啦4步学会

小程序地理位置接口有什么功能&#xff1f; 如果我们提审后驳回理由写了“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通&#xff0c;建议完成接口开通后或移除接口相关内容后再进行后续版本提审”&#xff0c;如果你也碰到类似问题&#xff…

电火灶是燃气灶吗?节能、环保效果怎么样?

随着科技的进步&#xff0c;厨房中的传统设备也逐步被新型、高效且环保的设备所替代。电火灶&#xff0c;作为一种新型的电火烹饪设备&#xff0c;逐渐进入人们的视野。那么&#xff0c;电火灶是否与传统的燃气灶有所区别&#xff1f;其节能与环保效果又如何呢&#xff1f;下面…

使用 Spring Boot 构建 RESTful API 的最佳实践

在现代的软件开发中&#xff0c;构建高效、稳定的 RESTful API 是非常重要的一环。Spring Boot 是一个流行的 Java 开发框架&#xff0c;它提供了简化开发的工具和约定&#xff0c;使得构建 RESTful API 变得更加简单和快速。 本文将介绍使用 Spring Boot 构建 RESTful API 的…

2024.5.8 关于 SpringCloud —— Ribbon 的基本认知

目录 Ribbon 负载均衡原理 工作流程 Ribbon 负载均衡规则 Ribbon 负载均衡自定义化 代码方式修改规则 配置文件方式修改规则 小总结 Ribbon 设定饥饿加载 Ribbon 负载均衡原理 工作流程 order-service 使用 RestTemplate 发送请求&#xff0c;随后该请求将会被 Ribbon 所…

【强训笔记】day20

NO.1 思路&#xff1a;先判断能对砍几个回合&#xff0c;取最小值&#xff0c;因为回合数是整数&#xff0c;所以可能存在都大于0的情况&#xff0c;再判断一下如果都存活就再对砍一次&#xff0c;直到一家存活或者都死亡。 代码实现&#xff1a; #include<iostream>u…

土地档案管理关系参考论文(论文 + 源码)

【免费】javaEE土地档案管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296786 土地档案管理关系 摘 要 研究土地档案管理关系即为实现一个土地档案管理系统。土地档案管理系统是将现有的历史纸质档案资料进行数字化加工处理&#xff0c;建成标准化的…

TikTok海外运营:云手机的四种快速变现方法

随着TikTok用户基数的持续扩大&#xff0c;这个平台已成为全球创业者和品牌的新战场。其用户群接近20亿&#xff0c;并以年轻用户为主力军&#xff0c;市场渗透率逐年攀升。无论是大型组织、知名品牌&#xff0c;还是个人创业者&#xff0c;都无法忽视TikTok所带来的巨大商机。…

视频监控系统中,中心录像服务器的录像文件实际大小和理论值相差很大的问题解决

目录 一、现象描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 1、仅视频部分 2、视频和音频部分 3、使用平均码率 &#xff08;二&#xff09;计算工具 1、关注威迪斯特公众号 2、打开“计算容量”的小工具 三、原因分析 &#xff08;一&…

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题&#xff1a; 当SharePoint List里的数据超过5000时&#xff0c;如果使用常用的rest api去获取数据&#xff0c;例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…

Python多线程与互斥锁模拟抢购余票的示例

一、示例代码&#xff1a; from threading import Thread from threading import Lock import timen 100 # 共100张票def task():global nmutex.acquire() # 上锁temp ntime.sleep(0.1)n temp - 1print(购票成…

语音网关有哪些?

语音网关是一种网络设备&#xff0c;它使得通过传统的电话网络&#xff08;如公共交换电话网络&#xff0c;PSTN&#xff09;和现代的数据网络&#xff08;如互联网或私有数据网络&#xff09;进行的语音通信成为可能。语音网关的主要作用是在模拟或数字电话信号与数据网络的数…

python基础--推导式和拆包

推导式和拆包 推导式 这是一个快速地生成数据的方式 比如在数组里面存1, 3, 5…99 [x for x in range(1, 100) if x % 2 0]只一个不可以生成元组, 可以用于列表, 字典和集合 这一个循环是可以嵌套的 [(x, y) for x in range(1, 3) for y in range(3)] [(1, 0), (1, 1), (…

论文 学习 Transformer : Attention Is All You Need

目录 概述&#xff1a; 对摘要的理解&#xff1a; 框架解析 按比例缩放的点积注意力 多头注意力机制 前馈神经网络与位置编码 概述&#xff1a; transformer 是一个encoder ——decoder 结构的用于处理序列到序列转换任务的框架&#xff0c;是第一个完全依赖自注意力机制…

1分钟搞定Pandas DataFrame创建与索引

1.DataFrame介绍 DataFrame 是一个【表格型】的数据结构,可以看作是【由Series组成的字典】(共用同一个索引)。DataFrame 由按一定顺序排列的多列数据组成。设计初衷是将 Series 的使用场景从一维扩展到多维。DataFrame 既有行索引,也有列索引。 行索引:index 列索引:co…