web自动化系列-selenium的3种等待方式(十一)
在ui自动化测试中,几乎出现问题最多的情况就是定位不到元素 ,当你的自动化在运行过程中 ,突然发现报错走不下去了 。很大概率就是因为找不到元素 ,而找不到元素的一个主要原因就是页面加载慢 ,代码运行速度快导致 。
遇到以上的问题 ,该怎么办呢 ?其中一个解决方案就是加等待时间 。
1.元素等待介绍
1.什么是元素等待 ? 在运行web自动化的过程中,有两个运行速度 。 一个就是代码的运行速度 ,一个是浏览器的渲染速度 。
代码的运行速度很快 ,基本都是保持在毫秒级甚至以下 ,通过人眼的观察你可能都看不到的运行过程就已经结束了 ;而浏览器的渲染速度较慢 ,一般保持在毫秒到秒级别 ,再加上网络时间和网站的一些性能问题 ,这个速度就更慢 。
而在web自动化中 ,这两个速度的关联就是代码运行驱动浏览器的运行 ,代码运行速度快 ,有时候浏览器渲染速度跟不上 ,就会导致找不到元素的情况 。解决的办法就是让代码的运行速度慢一些 ,在执行过程中等待一会或者检查下浏览器的元素出来没有 ,如果出来了则再运行 ,这就是元素等待的本质 。
2.三种等待方式
在web自动化中 ,可以使用以下三种等待方式 ,分别是强制等待 、隐式等待 、显示等待 。
2.1 强制等待
所谓的强制等待 ,就是通过python time模块中的sleep方法 ,让代码在某个地方暂停n秒 。放在自动化中 ,就是让代码的运行暂时先停下来 ,让浏览器的渲染速度更上代码的允许速度 。
# 导包 :import time
# 等待5s : time.sleep(5)
在这里就存在这个问题 ,web自动化代码那么多 ,我应该把这种强制等待放在哪里呢 ?具体的说放在那一行代码呢 ?这个问题的答案跟我们的系统有关系 ,一般编写好代码以后 ,我们都会进行调试运行 ,在调试运行的过程中 ,你会发现某个页面的加载速度比较长 ,页面元素多 ,那么进入这个页面以后往往就需要加等待时间 ,对应代码的位置就是加载这个页面的下一行就是等待时间的代码 。
那么 ,当出现一个加载慢的页面时 ,应设置几秒的等待时间呢 ?3s还是5s ? 这就需要我们多次运行以观察在该页面一般需要几秒加载出来 ,一般设置的等待时间会比这个长个1~2s .大白话就是我们需要根据观察得出一个等待时间 ,这个时间往往都是我们主观判断得出 的,经常会出现等待时间不够或者等待时间过长的情况 。
-
它的优点是:在一些不稳定的页面、复杂的页面 ,使用强制等待是比较好的,反正就等那么长时间 。
-
它的缺点是:因为时间往往是根据我们的经验值设置 ,难免会出现等待时间长的情况 ,这样就降低了自动化的执行效率 。其实很多情况下页面元素早已出现 ,而我们设置的等待时间还没有到 ,它还在那傻傻的等 ,直到时间到了它才会继续运行 。
2.2 隐式等待
什么是隐式等待 ?隐式等待是对页面中的所有元素进行等待 ,它也需要设置一个等待时间,在等待的时间内,当页面所有元素都加载出来后就往下执行了 ,即便时间没到也会继续往下执行 。所以 ,它的等待结束时间是页面所有元素都加载完,而不是它设置的等待时间 。当然 ,这里面还有一种情况就是等待时间已用完,但是页面元素还没有都加载出来 ,这时就会抛出异常 。
比如我一个页面有200个页面对象 ,有输入框、有按钮、有链接、有图标等 。使用隐式等待就是在规定的时间内,若这200个页面对象都加载出来了,就继续往下执行 ,否则到了规定时间还有元素没加载完就会报错 。
# 隐式等待
driver.implicitly_wait(5) # 等待5s .
这是webDriver里的一个方法 ,可使用浏览器对象直接调用 。
-
它的优点是:相比time.sleep()而言 ,它更加智能 ,不需要必须等到所有时间用完才往下执行 。也许你设置了5s ,但是当到了3s时页面元素都已加载出来 ,这个时候它就会继续往下执行了 ,这样就能提高执行效率 。
-
它的缺点是 :它的这种等待方式不太合理 ,很多情况下 ,我们定位的是具体的某个元素 ,也就是说我们等待的是一个元素 ,而它现在是等待这个页面的所有元素 。即便我们要等到元素早以出现 ,但是它还是要把所有元素都加载完才会继续运行 。所以,从效率上还是优化空间的 。
2.3 显式等待
什么是显式等待 ?显式等待就是针对某个特定的元素设置等待时间 ,它就等待一个元素 ,元素出现则往下运行 ,元素没出现,则继续等待,直到等到到超出规定的等待时间 ,这时也会抛出NoSuchElementException
异常 。
还是以上面的例子说明 ,比如一个页面有200个对象 ,有输入框、有按钮、有链接、有图标等 。但是我在代码中设置就等待其中的一个操作按钮 ,使用显式等待后,它就会等待这一个操作按钮 ,如果这个按钮的元素已经加载出来,即便其它元素仍没有加载出来 ,它也不管 ,则会继续往下运行。
# 1.导包 : from selenium.webdriver.support.wait import WebDriverWait
# 2.使用类:WebDriverWait(driver,timeout,poll_frequency=0.5)driver : 浏览器驱动对象timeout : 超时的时长 ,单位 :秒poll_frequency : 检测间隔时间 ,默认为0.5s
# 3)调用它的方法 :until(method) ,直到 ... 时 ,此方法返回的布尔值。method : 函数名称,该函数实现的是对元素的定位 。一般使用匿名函数来实现 :#显式等待的完整代码如下:
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_id("username"))
-
它的优点是:只等待一个元素 ,等待到即可继续运行 ,花费时间最少 ,执行效率也高 ,所以一般都会用此方法,并且会将它封装成一个公共方法 。
三种方法总结 :
-
显式等待 :等待页面中的一个元素 ,等待到即可继续运行,时间到还没有等待到即报错
-
隐式等待 : 等待页面中的所有元素 ,所有元素加载完即可继续运行 ,时间到还没有加载完的即报错 。
-
强制等待 : 按时间等待 ,无论页面元素是否加载完毕 ,它都会继续运行 。
3.具体案例
需求:通过selenium完成对tpshop的登录操作,具体如下 :
-
点击首页登录 ,使用显式等待8s .
-
输入用户名 ,输入密码 ,输入验证 。
-
使用逻辑与属性定位用户名输入框,并输入账号,如13988888888
-
点击登录 ,使用隐藏等待 ,等待时间8s .
-
进入首页 ,点击安全退出按钮 ,使用强制等待2s .
-
关闭浏览器
# 定位tpshop登录
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait# 1. 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()# 2. 输入地址
driver.get("http://localhost")# 3. 元素定位
# 3.1 点击登录 : link_text
driver.find_element_by_link_text("登录").click()# 定位输入框 :显式等待8s .
WebDriverWait(driver,8,0.5).until(lambda driver:driver.find_element_by_id("username"))# 3.2 输入用户名
driver.find_element_by_id("username").send_keys("13088888888")# 3.3 输入密码
driver.find_element_by_name("password").send_keys("123456")# 3.4 输入验证码
driver.find_element_by_id("verify_code").send_keys("8888")# 4. 点击登录
driver.find_element_by_class_name("J-login-submit").click()driver.implicitly_wait(8) # 隐式等待# 点击安全退出按钮
driver.find_element_by_link_text("安全退出").click()
sleep(2) # 强制等待2s driver.quit()
相关文章:

web自动化系列-selenium的3种等待方式(十一)
在ui自动化测试中,几乎出现问题最多的情况就是定位不到元素 ,当你的自动化在运行过程中 ,突然发现报错走不下去了 。很大概率就是因为找不到元素 ,而找不到元素的一个主要原因就是页面加载慢 ,代码运行速度快导致 。 …...

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)
目录 力扣279. 完全平方数 问题解析 解析代码 优化代码(相同子问题分析和滚动数组) 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值…...

web项目中jsp页面不识别el表达式
如果使用el表达式出现下图问题 ** 解决办法 ** 这是因为maven创建项目时,web.xml头部声明默认是2.3,这个默认jsp关闭el表达式 修改web.xml文件开头的web-app的版本 <?xml version"1.0" encoding"UTF-8"?> <web-app x…...

【Python基础】字典
文章目录 [toc]什么是字典键值对示例键异常 遍历列表什么是遍历遍历字典的键keys()方法 遍历字典的值values()方法 遍历字典的键值对items()方法 字典操作增加键值对修改键值对查询键值对get()方法 删除键值对delclear()方法 个人主页:丷从心 系列专栏:…...

2024HW --> 安全产品 Powershell无文件落地攻击
在HW中,除了了解中间件,web漏洞,这些攻击的手法,还得了解应急响应,安全产品,入侵排查,溯源反制...... 那么今天,就来说一下安全产品(安全公司我就不说了,这个…...

力扣哈哈哈哈
public class MyStack {int top;Queue<Integer> q1;Queue<Integer> q2;public MyStack() {q1new LinkedList<Integer>();q2new LinkedList<Integer>();}public void push(int x) {q2.offer(x);//offer是入队方法while (!q1.isEmpty()){q2.offer(q1.pol…...

RUM 最佳实践-视觉稳定性的探索与实践
写在前面的话 在当今数字时代,网页的视觉稳定性对于提供良好的用户体验至关重要。其中一个衡量视觉稳定性的关键指标就是累积布局偏移(Cumulative Layout Shift,简称 CLS)。CLS 作为 Web Vitals 指标之一,它衡量的是网…...

PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...
爬虫开发教程
一、爬虫概述 爬虫(也称为网络爬虫或蜘蛛)是一种自动化程序,能够模拟人类在互联网上浏览和抓取数据的行为。它通过发送HTTP请求,获取网页的HTML代码,然后解析这些代码以提取有用的数据。爬虫在数据分析、价格监测、竞…...

【Python】高级进阶(专版提升3)
Python 1 程序结构1.1 模块 Module1.1.1 定义1.1.2 作用1.1.3 导入1.1.3.1 import1.1.3.2 from import 1.1.4 模块变量1.1.5 加载过程1.1.6 分类 1.2 包package1.2.1 定义1.2.2 作用1.2.3 导入1.1.3.1 import1.1.3.2 from import 2 异常处理Error2.1 异常2.2 处理 3 迭代3.1 可…...
LeetCode 1378、1277、2944
1378 二级排序,compare函数必须是static的 class Solution { public:struct node {int val;int priority;};static bool compare(const node &n1, const node &n2) {if (n1.priority n2.priority) {return n1.val < n2.val;}return n1.priority < n…...

【缓存常见问题】
在使用缓存时特别是在高并发场景下会遇到很多问题,常用的问题有缓存穿透、缓存击穿、缓存雪崩以及缓存一致性问题。 1、缓存穿透 首先,什么是缓存穿透呢? 缓存穿透是指请求一个不存在的数据,缓存层和数据库层都没有这个数据&…...

Python爬取猫眼电影票房 + 数据可视化
目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取,首先我们打开猫眼 接着我们想要进行数据抓包,就要看网站的具体内容,通过按F12…...
Spring Boot深度解析:是什么、为何使用及其优势所在
在Java企业级应用开发的漫长历史中,Spring框架以其卓越的依赖注入和面向切面编程的能力,赢得了广大开发者的青睐。然而,随着技术的不断进步和项目的日益复杂,传统的Spring应用开发流程逐渐显得繁琐和低效。为了解决这一问题&#…...
面向对象——类与对象
文章目录 类与对象构造函数、析构函数get/set方法函数:类内声明、类外定义static 类与对象 #include<iostream> #include<string> using namespace std; /* 类与对象 */ class Person{public:string name;// 固有属性,成员变量 int age;pu…...
Golang的[]interface{}为什么不能接收[]int?
在 Go 中,[]interface{} 和 []int 是两种不同的类型,虽然它们的底层数据结构都是切片,但是它们的元素类型不同。[]interface{} 是一个空接口切片,可以容纳任意类型的元素,而 []int 是一个整数切片,只能容纳…...

重启服务器或重启docker,导致emqx的Dashboard的密码重置为public
最近在项目中突然发现重启服务器,或者重启docker 修改好的emqx的Dashboard的密码重置为public 技术博客 http://idea.coderyj.com/ 1.解决办法就是固定 emqx的节点 # 拉取镜像 docker pull emqx/emqx# 创建目录,进行目录挂载 mkdir -p /docker/emqx/{etc,lib,data,…...

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色
六、Ansible playbook 简介 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。 通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…...
常用的过滤网站扫描网站攻击的路径是那些,比如:/etc/passwd等
网站攻击中经常被尝试的路径主要包括利用漏洞获取敏感文件、执行系统命令或者注入恶意代码的尝试。以下是一些常见的被攻击者尝试访问的路径和文件,这些通常在网络入侵检测系统(IDS)和网络防火墙的过滤规则中被特别关注: 系统文件…...

考研数学|《1800》《660》《880》如何选择和搭配?(附资料分享)
直接说结论:基础不好先做1800、强化之前660,强化可选880/1000题。 首先,传统习题册存在的一个问题是题量较大,但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大,但有些题目难度不够平衡,有些过于简单…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...