当前位置: 首页 > news >正文

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的登录操作,具体如下 :

  1. 点击首页登录 ,使用显式等待8s .

  2. 输入用户名 ,输入密码 ,输入验证 。

  3. 使用逻辑与属性定位用户名输入框,并输入账号,如13988888888

  4. 点击登录 ,使用隐藏等待 ,等待时间8s .

  5. 进入首页 ,点击安全退出按钮 ,使用强制等待2s .

  6. 关闭浏览器

# 定位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创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 修改web.xml文件开头的web-app的版本 <?xml version"1.0" encoding"UTF-8"?> <web-app x…...

【Python基础】字典

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

2024HW --> 安全产品 Powershell无文件落地攻击

在HW中&#xff0c;除了了解中间件&#xff0c;web漏洞&#xff0c;这些攻击的手法&#xff0c;还得了解应急响应&#xff0c;安全产品&#xff0c;入侵排查&#xff0c;溯源反制...... 那么今天&#xff0c;就来说一下安全产品&#xff08;安全公司我就不说了&#xff0c;这个…...

力扣哈哈哈哈

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 最佳实践-视觉稳定性的探索与实践

写在前面的话 在当今数字时代&#xff0c;网页的视觉稳定性对于提供良好的用户体验至关重要。其中一个衡量视觉稳定性的关键指标就是累积布局偏移&#xff08;Cumulative Layout Shift&#xff0c;简称 CLS&#xff09;。CLS 作为 Web Vitals 指标之一&#xff0c;它衡量的是网…...

PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…...

爬虫开发教程

一、爬虫概述 爬虫&#xff08;也称为网络爬虫或蜘蛛&#xff09;是一种自动化程序&#xff0c;能够模拟人类在互联网上浏览和抓取数据的行为。它通过发送HTTP请求&#xff0c;获取网页的HTML代码&#xff0c;然后解析这些代码以提取有用的数据。爬虫在数据分析、价格监测、竞…...

【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 二级排序&#xff0c;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…...

【缓存常见问题】

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

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取&#xff0c;首先我们打开猫眼 接着我们想要进行数据抓包&#xff0c;就要看网站的具体内容&#xff0c;通过按F12…...

Spring Boot深度解析:是什么、为何使用及其优势所在

在Java企业级应用开发的漫长历史中&#xff0c;Spring框架以其卓越的依赖注入和面向切面编程的能力&#xff0c;赢得了广大开发者的青睐。然而&#xff0c;随着技术的不断进步和项目的日益复杂&#xff0c;传统的Spring应用开发流程逐渐显得繁琐和低效。为了解决这一问题&#…...

面向对象——类与对象

文章目录 类与对象构造函数、析构函数get/set方法函数&#xff1a;类内声明、类外定义static 类与对象 #include<iostream> #include<string> using namespace std; /* 类与对象 */ class Person{public:string name;// 固有属性&#xff0c;成员变量 int age;pu…...

Golang的[]interface{}为什么不能接收[]int?

在 Go 中&#xff0c;[]interface{} 和 []int 是两种不同的类型&#xff0c;虽然它们的底层数据结构都是切片&#xff0c;但是它们的元素类型不同。[]interface{} 是一个空接口切片&#xff0c;可以容纳任意类型的元素&#xff0c;而 []int 是一个整数切片&#xff0c;只能容纳…...

重启服务器或重启docker,导致emqx的Dashboard的密码重置为public

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

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…...

常用的过滤网站扫描网站攻击的路径是那些,比如:/etc/passwd等

网站攻击中经常被尝试的路径主要包括利用漏洞获取敏感文件、执行系统命令或者注入恶意代码的尝试。以下是一些常见的被攻击者尝试访问的路径和文件&#xff0c;这些通常在网络入侵检测系统&#xff08;IDS&#xff09;和网络防火墙的过滤规则中被特别关注&#xff1a; 系统文件…...

考研数学|《1800》《660》《880》如何选择和搭配?(附资料分享)

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...