Selenium 3和JUnit 5中的显示等待与隐式等待

目录

显示等待(Explicit Wait)

什么是显示等待?

如何实现显示等待?

显示等待条件

隐式等待(Implicit Wait)

什么是隐式等待?

如何实现隐式等待?

显示等待和隐式等待的区别

强制等待


在Selenium自动化测试中,等待是一个至关重要的概念。网页加载速度、元素的可见性以及元素的可交互性都是测试脚本成功执行的关键因素。Selenium提供了两种主要的等待方式,即"显示等待"和"隐式等待",用于处理这些情况。本文将深入探讨这两种等待方式的使用场景和实现方式,并结合Selenium 3和JUnit 5来说明。

显示等待(Explicit Wait)

什么是显示等待?

显示等待是一种在特定条件下等待某个元素出现或某个条件变为真的等待方式。这意味着你可以设置一个等待时间,只有在这个时间内特定条件满足时,测试脚本才会继续执行。这样可以确保在元素加载完成或者某个条件成立之后再进行后续的操作,从而提高测试的稳定性和可靠性。

如何实现显示等待?

在Selenium 3和JUnit 5中,我们可以使用WebDriverWait类来实现显示等待,如以下示例:

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;public class ExplicitWaitExample {@Testpublic void explicitWaitExample() {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();// 打开网页driver.get("https://example.com");// 创建一个等待对象,设置等待时间为10秒WebDriverWait wait = new WebDriverWait(driver, 10);// 等待直到按钮可点击WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Click Me']")));// 点击按钮button.click();// 关闭浏览器driver.quit();}
}

上述代码中,我们首先设置了Chrome浏览器的驱动路径,并创建了一个WebDriver实例。然后,我们打开了网页,并使用WebDriverWait类来创建一个显示等待对象,并指定了最大等待时间为10秒。接下来,我们使用ExpectedConditions.elementToBeClickable条件来等待按钮出现并可点击。一旦按钮符合条件,就会执行后续的点击操作。

显示等待条件

1. elementToBeClickable 等待元素可点击,适用于需要点击某个元素的操作。

WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));

 2. visibilityOfElementLocated 等待元素可见,适用于需要验证元素是否出现在页面上的操作。

WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='example']")));

 3. textToBePresentInElement 等待文本出现在元素中,适用于需要验证元素是否包含特定文本的操作。

boolean textPresent = wait.until(ExpectedConditions.textToBePresentInElement(By.id("elementId"), "Expected Text"));

 4. presenceOfElementLocated 等待元素存在,不关心元素是否可见或可点击,只要元素在DOM中存在即可。

WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId")));

5. frameToBeAvailableAndSwitchToIt 等待帧可用并切换到它,适用于需要在iframe中执行操作的情况。

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frameId")));

 6. alertIsPresent 等待警告框出现,适用于需要处理JavaScript警告框的情况。

Alert alert = wait.until(ExpectedConditions.alertIsPresent());

这些等待条件使你能够根据需要等待元素的各种状态,以确保你的自动化测试脚本在执行操作之前等待正确的条件。根据具体的测试场景和需求,你可以选择适当的等待条件来提高测试的稳定性和可靠性。

隐式等待(Implicit Wait)

什么是隐式等待?

隐式等待是一种全局性的等待设置,它会在整个测试脚本的执行过程中生效。当你启用隐式等待后,Selenium会在查找元素时等待一段时间,如果元素在这个时间内找到了,就会立即执行后续操作,否则会抛出超时异常。这个等待时间是全局的,适用于所有的元素查找操作。

如何实现隐式等待?

在Selenium 3和JUnit 5中,你可以使用implicitlyWait方法来启用隐式等待。以下是一个示例:

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;public class ImplicitWaitExample {@Testpublic void implicitWaitExample() {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();// 设置全局的隐式等待时间为10秒driver.manage().timeouts().implicitlyWait(10, java.util.concurrent.TimeUnit.SECONDS);// 打开网页driver.get("https://example.com");// 查找元素,如果元素不在页面上立即找到,最多等待10秒WebElement element = driver.findElement(By.xpath("//input[@name='search']"));// 执行其他操作element.sendKeys("Selenium");// 关闭浏览器driver.quit();}
}

在上述代码中,我们首先设置了Chrome浏览器的驱动路径,并创建了一个WebDriver实例。然后,我们使用driver.manage().timeouts().implicitlyWait方法来设置全局的隐式等待时间为10秒。这意味着每次查找元素时,Selenium会等待最多10秒,如果元素在这个时间内找到了,就会继续
执行后续操作。


显示等待和隐式等待的区别

1. 用法和范围:

  • 隐式等待: 隐式等待是一种全局性的等待设置,适用于整个WebDriver实例的生命周期。一旦设置了隐式等待,它将在所有的元素查找操作上生效,除非被显式地覆盖或禁用。它不依赖于特定条件或元素,而只是设置了一个全局的最大等待时间,当查找元素时,如果元素没有立即找到,WebDriver会等待指定的时间。

  • 显示等待: 显示等待是一种更灵活的等待机制,它允许你根据特定的条件等待元素或条件满足后再执行后续操作。显示等待需要明确地定义等待条件和等待时间,并且仅在等待条件满足或超时后才继续执行操作。显示等待是针对特定的元素或条件,可以根据需要在不同的地方使用不同的等待条件和时间。

2. 超时处理:

  • 隐式等待: 隐式等待设置一个全局的超时时间,如果在该时间内找到了元素,就会立即执行后续操作。如果超过了超时时间而元素还未找到,WebDriver会抛出NoSuchElementException异常。

  • 显示等待: 显示等待允许你为每个等待条件设置不同的超时时间。这意味着你可以根据不同的情况和需求设置不同的等待时间,以确保测试脚本在特定条件满足后继续执行。

3. 等待条件:

  • 隐式等待: 隐式等待不依赖于特定的等待条件,它只是等待一段时间,无论元素是否可见、可交互或其他条件。

  • 显示等待: 显示等待允许你使用预定义的等待条件(例如visibilityOfElementLocatedelementToBeClickabletextToBePresentInElement等)或自定义的等待条件,以满足特定的测试需求。你可以根据需要选择适当的条件。

综上所述,显示等待提供了更大的灵活性和控制,因为它允许你为不同的元素或情况设置不同的等待条件和超时时间。隐式等待则是一种全局设置,适用于整个WebDriver实例,对于整体性能有较好的控制,但缺乏灵活性,可能会导致不必要的等待时间或等待时间过短。在实际测试中,通常建议优先使用显示等待,根据需要进行精确的等待条件配置,以提高测试的稳定性和可维护性~~😁

强制等待

强制等待是一种等待方式,它不依赖于特定条件或元素的可见性或可点击性。相反,它是在测试脚本中添加一个明确的等待时间,无论条件是否满足,都会等待指定的时间。虽然强制等待不是推荐的等待策略,因为它不够灵活,但在某些情况下仍然有用,例如等待网页加载或执行复杂的JavaScript操作后。

在Selenium中,我们可以使用Thread.sleep方法来实现强制等待。这个方法会导致当前线程暂停执行指定的时间,单位是毫秒。

import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class ExplicitWaitExample {@Testpublic void forceWaitExample() throws InterruptedException {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();// 打开网页driver.get("https://example.com");// 执行一些操作...// 强制等待5秒钟Thread.sleep(5000);// 执行其他操作...// 关闭浏览器driver.quit();}
}

在上述代码中,我们使用Thread.sleep方法来强制等待5秒钟。请注意,这会导致测试脚本暂停执行,无论页面是否已经加载完毕或其他条件是否满足。因此,强制等待可能会导致测试脚本变得不稳定,因为它不会等待元素的可见性或可交互性。

总结:

在Selenium自动化测试中,等待是一个至关重要的概念,用于处理页面加载、元素可见性和可交互性等情况。两种主要的等待方式是隐式等待(Implicit Wait)和显示等待(Explicit Wait),它们在用法和行为上有一些关键区别。

隐式等待 是一种全局性的等待设置,它适用于整个WebDriver实例的生命周期。它会设置一个全局的最大等待时间,当查找元素时,如果元素没有立即找到,WebDriver会等待指定的时间,然后继续执行后续操作。隐式等待不依赖于特定条件或元素,而只是在元素查找时等待一段时间。

显示等待 是一种更灵活的等待机制,它允许你根据特定的条件等待元素或条件满足后再执行后续操作。显示等待需要明确地定义等待条件和等待时间,并且仅在等待条件满足或超时后才继续执行操作。显示等待是针对特定的元素或条件,可以根据需要在不同的地方使用不同的等待条件和时间。

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

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

相关文章

mapbox 导航记录(release-v2.15分支 纯kotlin)

一、简单使用示例 1. 初始化 MapboxNavigation 初始化时使用 NavigationOptions 设置一些参数,包括accessToken、appMetaData、LocationEngine等,其它还有很多,具体可以详看 NavigationOptions 类的内部。 下面示例中 LocationEngine 使用…

C++ 多线程编程教程:使用 std::thread 和 std::future 进行并发任务管理 ,处理线程超时

C 多线程编程教程:使用 std::thread 和 std::future 进行并发任务管理 引言 多线程编程是一种强大的工具,可以加速计算密集型任务的执行,提高应用程序的性能。C提供了多种多线程编程工具,包括std::thread和std::future&#xff…

【infiniband】用udaddy测试RDMA_CM API通过GID连接

1. 运行ibv_devinfo -vv 找到GID[ 0]。 2.udaddy用1.找到的GID[ 0]测试连接 服务器: rootdebian:~/infiniband/rdma-core-50mlnx1# build/bin/udaddy -f gid -b fe80:0000:0000:0000:e41d:2e03:0051:26d1 udaddy: starting server test.rai->ai_src_addr->sa_famil…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven使用前准备

一.Maven准备 注意:IDEA2019.1.x 最高支持Maven的3.6.0 下载地址:http://maven.apache.org/Maven底层使用Java语言编写的,所以需要配置JAVA_HOME环境变量及Path将Maven解压非中文无空格目录下配置MAVEN_HOME环境变量及Path输入【c…

基于AERMOD模型在大气环境影响评价中的实践

AERMOD模型是在美国EPA(AMS/EPA)在ISC3(Industrial Source Complex Model)基础上建立开发的高斯稳态扩散模型,是我国《环境影响评价技术导则 大气环境(HJ 2.2-2018)》技术导则推荐的大气污染物浓…

人工智能的优势:使用 GPT 和扩散模型生成图像

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 世界被人工智能 (AI) 所吸引,尤其是自然语言处理 (NLP) 和生成 AI 的最新进展,这是有充分理由的。这些突破性技术有可能提高各种任务的日常生产力。…

Vue前端框架08 Vue框架简介、VueAPI风格、模板语法、事件处理、数组变化侦测

目录 一、Vue框架1.1渐进式框架1.2 Vue的版本 二、VueAPI的风格三、Vue开发准备工作四、模板语法文本插值属性绑定条件渲染列表渲染key管理状态 四、事件处理定义事件事件参数事件修饰符 五、数组变化侦测 一、Vue框架 渐进式JavaScript框架,易学易用,性…

Unity的GPUSkinning进一步介绍

大家好,我是阿赵。   在几年前,我曾经写过一篇介绍GPUSkinning的文章,这么多年之后,还是看到不停有朋友在翻看这篇旧文章。今天上去GitHub看了一下,GPUSkinning这个开源的插件已经很久没有更新过了,还是停…

SSH详解

文章目录 SSH简介SSH安装SSH秘钥秘钥生成公钥上传(免密登录) 基本用法命令行配置配置文件SSH代码动态转发本地转发远程转发搭建简易版的VPN SCP命令本地复制到远程远程复制到本地远程复制到远程 Rsync命令安装基本用法本地同步到远程远程同步到本地 SFTP命令 SSH简介 Secure Sh…

分享一个有意思的线程相关的程序运行题

翻开之前的代码,发现了一个有意思的代码,猜以下代码的运行结果: package thread;/*** author heyunlin* version 1.0*/ public class ThreadMethodExample {public static void main(String[] args) {Thread thread new Thread(new Runnabl…

云原生Kubernetes:kubectl管理命令

目录 一、理论 1.kubectl 管理命令 2.项目的生命周期 二、实验 1.kubectl 管理命令 2.项目的生命周期 三、总结 一、理论 1.kubectl 管理命令 (1)陈述式资源管理方法 kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口…

复旦-华盛顿EMBA:AI时代掘金,科技进化里的挑战与机遇

如果从去年年底ChatGPT3.5发布算起,AI赛道的热度已经持续飙升了半年有余。      “AI的iPhone时刻”代表什么?AI驱动的商业时代已经到来?      我们能看到担忧、恐惧、憧憬,但唯独不缺狂飙突进、加速进化。人类制造AI&…

WordPress(4)关于网站的背景图片更换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改的位置1. 红色区域是要更换的随机的图片二、替换图片位置三.开启随机数量四.结束前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也…

Android 10.0 Launcher3桌面显示多个相同app图标的解决办法

1.前言 在10.0的系统ROM定制化开发中,在Launcher3的系统原生桌面中,在显示桌面的时候,在禁用和启用app的功能测试的时候,会发现有多个相同app的图标显示在桌面 这对Launcher3的体验效果不是很好,所以为了优化产品,需要解决这个bug,然后让产品更完善 2.桌面显示多个相同…

Hadoop的分布式文件存储系统HDFS组件的使用

Hadoop的第一个核心组件:HDFS(分布式文件存储系统) 一、HDFS的组成1、NameNode2、DataNode3、SecondaryNameNode4、客户端:命令行/Java API 二、HDFS的基本使用1、命令行操作2、Java API操作 三、HDFS的工作流程问题(H…

Direct3D颜色

在Direct3D中颜色用RGB三元组来表示,RGB数据可用俩种不同的结构来保存,第一种是D3DCOLOR,它实际上与DWORD类型完全相同,共有32位,D3DCOLOR类型种的各位被分成四个8位项,每项存储了一种颜色分量的亮度值。 由…

【Hive SQL 每日一题】统计用户连续下单的日期区间

文章目录 测试数据需求说明需求实现 测试数据 create table test(user_id string,order_date string);INSERT INTO test(user_id, order_date) VALUES(101, 2021-09-21),(101, 2021-09-22),(101, 2021-09-23),(101, 2021-09-27),(101, 2021-09-28),(101, 2021-09-29),(101, 20…

ChatGPT如何协助人们学习新的科学和技术概念?

ChatGPT可以在许多方面协助人们学习新的科学和技术概念。随着科学和技术的不断发展,学习成为了一个终身的过程,人们需要不断地更新和扩展他们的知识。ChatGPT作为一种强大的自然语言处理工具,可以在以下几个方面为学习者提供帮助:…

力扣(LeetCode)算法_C++——至多包含两个不同字符的最长子串

给你一个字符串 s ,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。 示例 1: 输入:s “eceba” 输出:3 解释:满足题目要求的子串是 “ece” ,长度为 3 。 示例 2&#xff…

C语言sizeof()计算空间大小为8的问题

在练习数据结构过程中&#xff0c;定义指针p&#xff0c;并且申请了10个char类型空间&#xff0c;但在计算p所指空间大小时候&#xff0c;发现了一些奇怪的现象。 #include <stdio.h> #include <stdlib.h>int main(){char s[12];printf("the size of memory …