selenium的三种等待方式(强制等待,隐式等待,显示等待)

news2024/11/18 8:28:02

目录

1.强制等待(无条件等待)

2.隐式等待

3.显示等待


有时候做自动化测试,需要进行等待,因为下一步的操作依赖于上一步的结果,但是程序执行的很快,有时候页面还未加载完成就进行了下一步的操作,很容易就出现错误,例如像【NO SuchElement Exception】有时候就是因为这个原因造成的,所以我们就需要使用等待来的等待上一个页面的加载完成之后,在进行下一步的操作,selenium中一共有三种等待方式,下面我们来一一讲解:

1.强制等待(无条件等待)

使用方法:time.sleep(num)

num的单位为秒,设置多少秒,页面就会死等多少秒,这个方法很容易使线程挂掉,程序抛出异常,所以要慎用

例如:打开百度页面,强制等待五秒

public class TestSleep {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个浏览器取得
        ChromeDriver driver = new ChromeDriver();
        // 打开百度网页
        driver.get("https://www.baidu.com");
        // 强制等待五秒
        sleep(5000);
        // 在搜索框输入强制等待
        driver.findElement(By.cssSelector("#kw")).sendKeys("强制等待");
        // 点击百度一下
        driver.findElement(By.cssSelector("#su")).click();
    }
}

2.隐式等待

使用方法:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

例如:在百度页面搜索隐式等待,隐式等待搜索结果,然后点击第一条结果

    public static void test02() {
        // 创建一个浏览器取得
        ChromeDriver driver = new ChromeDriver();
        // 打开百度网页
        driver.get("https://www.baidu.com");
        // 在搜索框输入隐式等待
        driver.findElement(By.cssSelector("#kw")).sendKeys("隐式等待");
        // 点击百度一下
        driver.findElement(By.cssSelector("#su")).click();
        // 隐式等待5s
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        // 点击进入第一条结果
        driver.findElement(By.cssSelector("#\\31  > div > div:nth-child(1) > h3 > a")).click();

    }

在规定的时间范围内,一直等待元素的出现就结束等待,否则到达等待数据,就会抛出一个异常【NO SuchElement Exception】,然后脚本停止运行

比如在上面的测试代码中,如果不加隐式等待,就会抛出一个异常如下:

而且,隐式等待作用于webdriver的整个生命周期,只要没有退出浏览器,隐式等待一直存在,所以隐式等待的代码位置可以随意放置

优点:节省了大量等待时间,相比于强制等待来说

缺点:需要等待页面元素全部加载完成,才能执行下一步,还是会有额外浪费的时间

注意:

  • 隐式等待作用不了非HTML页面的元素(比如弹窗)
  • 并且隐式等待不要和显示等待同时使用(比如你在项目中使用了隐式等待,但是你有需要处理弹窗,那么就只能使用强制等待了)

3.显示等待

这里我们需要使用到selenium中的一个类ExpectedConditions以及until方法

显示等待就是如果在规定的时间内,没有找到元素,就会报异常【NO SuchElement Exception】

优点:针对其中某一个元素来等待,极大地降低了等待时间(相比于隐式等待需要等待整个页面的情况)

缺点:写法有点复杂

我们来对比一下显示等待和隐式等待分别所需要的时间

打开百度网页,在输入框搜索隐式等待vs显示等待,然后点击百度一下进行搜索,分别使用显示等待和隐式等待,等待页面上的图片按钮出现,然后点击图片按钮

1.隐式等待:

    public void test03() {
        // 创建一个浏览器取得
        ChromeDriver driver = new ChromeDriver();
        // 打开百度网页
        driver.get("https://www.baidu.com");
        // 在搜索框输入隐式等待VS显示等待
        driver.findElement(By.cssSelector("#kw")).sendKeys("隐式等待VS显示等待");
        // 点击百度一下
        driver.findElement(By.cssSelector("#su")).click();
        // 隐式等待50s
        driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
        // 点击图片按钮
        driver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic")).click();
        driver.quit();
    }

2.显示等待

    public  void test04() {
        // 创建一个浏览器取得
        ChromeDriver driver = new ChromeDriver();
        // 打开百度网页
        driver.get("https://www.baidu.com");
        // 在搜索框输入隐式等待VS显示等待
        driver.findElement(By.cssSelector("#kw")).sendKeys("隐式等待VS显示等待");
        // 点击百度一下
        driver.findElement(By.cssSelector("#su")).click();
        // 显示等待50s
        WebDriverWait wait = new WebDriverWait(driver, 50);
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic")));
        // 点击图片按钮
        driver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic")).click();
        driver.quit();
    }

从运行结果中就可以看出来,相较于隐式等待需要等待整个页面的加载,显示等待只需要等待图片这个按钮的出现即可,大大的提高了时间效率

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

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

相关文章

【数据挖掘】使用 LSTM 进行时间和序列预测

一、说明 每天,人类在执行诸如过马路之类的任务时都会做出被动预测,他们估计汽车的速度和与汽车的距离,或者通过猜测球的速度并相应地定位手来接球。这些技能是通过经验和实践获得的。然而,由于涉及众多变量,预测天气或…

网络安全 Day19-计算机网络基础知识04(网络协议)

计算机网络基础知识04(网络协议) 1. ARP1.1 ARP通讯原理1.2 arp欺骗1.3 ARP欺骗与预防1.4 排查ARP病毒 2. DHCP工作原理(自动分配内网IP)3. TCP协议三次握手、四次挥手原理4. DNS协议工作原理 1. ARP Linux查看arp:ar…

12.Netty源码之整体架构脉络

Netty 整体架构脉络 Netty 的逻辑处理架构为典型网络分层架构设计,共分为网络通信层、事件调度层、服务编排层,每一层各司其职。 网络通信层 网络通信层的职责是执行网络 I/O 的操作。它支持多种网络协议和 I/O 模型的连接操作。当网络数据读取到内核缓冲…

一分钟叫你怎样AI绘画 Vega Ai

先看效果图: 是不是也想自己去创造这样的图片呢,注意已经不需要自己画了!! Vega AI 简介 Vega AI是一款能够 文字生成图片、根据图片文字进行生成图片、条件生成图片 、根据多张图片训练出自己的风格,在风格广场选择…

使用 OpenCV 和 GrabCut 算法进行交互式背景去除

一、说明 我想,任何人都可以尝试从图像中删除背景。当然,有大量可用的软件或工具能够做到这一点,但其中一些可能很昂贵。但是,我知道有人使用窗口绘画3D魔术选择或PowerPoint背景去除来删除背景。 如果您是计算机视觉领域的初学者…

Linux系统知识1—Linux命令基础格式,什么是命令,命令行,ls命令入门,ls命令的参数和选项,-a,-l -h选项的使用及组合使用

一.什么是命令,命令行 .命令行:即 Linux 终端( Terminal ),是一种命令提示符页面。以纯"字符"的形式操作系统,可以使用各种字符化命令对系统发出操作指令。 .命令:即 Lin…

【LangChain】检索器之上下文压缩

LangChain学习文档 【LangChain】检索器(Retrievers)【LangChain】检索器之MultiQueryRetriever【LangChain】检索器之上下文压缩 上下文压缩 LangChain学习文档 概要内容使用普通向量存储检索器使用 LLMChainExtractor 添加上下文压缩(Adding contextual compression with an…

数据结构基本概念及算法分析

文章目录 1. 数据结构基本概念1.1 基本概念和术语1.1.1 数据1.1.2 数据元素1.1.3 数据项1.1.4 数据对象1.1.5 数据结构 1.2 逻辑结构与物理结构1.2.1 逻辑结构(我们最需要关注的问题)1.2.2 物理机构 1.3 数据类型1.3.1 数据类型定义1.3.2 抽象数据类型 2. 算法分析2.1 算法的复…

【Python机器学习】实验02 线性回归

文章目录 线性回归1. 单变量的线性回归1.1 数据读取1.2 训练数据的准备1.3 假设函数定义--假设函数是为了去预测1.4 损失函数的定义1.5 利用梯度下降算法来优化参数w1.6 可视化误差曲线1.7 可视化回归线/回归平面 1.2 单变量的线性回归--基于sklearn试试?1.3 多变量…

object tracking论文代码汇总

文章目录 2023Segment and Track AnythingTrack Anything: Segment Anything Meets VideosSAM-DA: UAV Tracks Anything at Night with SAM-Powered Domain Adaptation 2023 Segment and Track Anything code:https://github.com/z-x-yang/Segment-and-Track-Anyt…

响应式赋值Object.assign()和JSON.parse(JSON.stringify())的区别

一、需求:点击编辑弹出编辑框,修改后的内容点击认按钮修改后的数据更新回显到原列表。今天优化代码的时候发现了Object.assign()和JSON.parse(JSON.stringify())的区别。 优化前代码如下: // 编辑药品回显editMedicData(data) {this.table…

会员系统怎么搭建,适合门店的会员系统有哪些?

会员系统是一种为企业和门店提供会员管理和服务的工具。会员系统可以通过提供专属优惠、积分奖励、个性化推荐等方式,激励顾客成为会员并保持长期关系。 我们在自己搭建或选择会员系统时,需要考虑门店的特定需求以及系统的功能、可靠性、易用性和成本等因…

github前端开源json2html

软件介绍 前端低代码工具包,通过 JSON 配置就能生成各种页面。 应用场景 json解析超大数据动态渲染,渲染速度、性能解决问题 包引用列表 vue3 (cdn模式开发)element plusnodehttp-serveraxios 操作步骤 1.环境准备下载node:https://no…

长tree用buffer还是inverter?驱动强度如何选型?

相关文章链接: 静态时序分析: 最小脉冲宽度检查 redhawk:clock buffer cluster 面试中关于CTS buf/inv选型的问题经久不衰,依托经验,不看纸面信息,inverter和buffer各有优劣,同驱动buffer实际推力更强,意味着只用buffer,clock repeater数量更少,inverter必须成对的…

从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建、医药知识图谱的自动问答等

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…

抖音seo矩阵系统源码保姆式开发部署指导

抖音seo霸屏,是一种专为抖音视频创作者和传播者打造的视频批量剪辑,批量分发产品。使用抖音seo霸屏软件,可以帮助用户快速高效的制作出高质量的优质视频。 使用方法:1. 了解用户的行为习惯 2. 充分利用自身资源进行开发 3. 不…

超全整理,selenium自动化测试常见问题解决(汇总)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化代码中&…

静态路由小实验

文章目录 一、实验要求及拓扑图二、实验步骤三、思考题 一、实验要求及拓扑图 二、实验步骤 1、创建VLAN,将端口划入vlan 在交换机S3、S4上创建VLAN10、20 Switch(config)#vl 10 Switch(config-vlan)#vl 20 S3(config)#int f0/3 S3(config-if)#switchport access …

SpringBoot中使用测试框架MockMvc来模拟HTTP请求测试Controller接口

场景 Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用: Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用_assert java8_霸道流氓气质的博客-CSD…

17的勒索软件攻击泄露关键OT信息

数据泄漏一直是企业关注的问题,敏感信息泄露可能导致声誉受损、法律处罚、知识产权损失、甚至影响员工和客户的隐私。然而很少有关于工业企业面临的威胁行为者披露其OT安全、生产、运营或技术的敏感细节的研究。 2021年,Mandiant威胁情报研究发现&#…