当前位置: 首页 > 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;有些过于简单…...

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型&#xff08;LLMs&#xff09;已显示出在上下文中学习的能力 给定几个带注释的示例作为演示&#xff0c;LLMs 能够为新的测试输入生成输出然而&#xff0c;现行的上下文学习&#xff08;ICL&#xff09;范式仍存在以下明显…...

C语言 | Leetcode C语言题解之第28题找出字符串中第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; int strStr(char* haystack, char* needle) {int n strlen(haystack), m strlen(needle);if (m 0) {return 0;}int pi[m];pi[0] 0;for (int i 1, j 0; i < m; i) {while (j > 0 && needle[i] ! needle[j]) {j pi[j - …...

「Python大数据」数据采集-某东产品数据评论获取

前言 本文主要介绍通过python实现数据采集、脚本开发、办公自动化。数据内容范围:星级评分是1-3分、获取数据页面是前50页。 友情提示 法律分析:下列三种情况,爬虫有可能违法,严重的甚至构成犯罪: 爬虫程序规避网站经营者设置的反爬虫措施或者破解服务器防抓取措施,非法…...

ORACLE错误提示概述

OceanBase分布式数据库-海量数据 笔笔算数 保存起来方便自己查看错误代码。 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程…...

2024年4月13日美团春招实习试题【第一题:好子矩阵】-题目+题解+在线评测【模拟】

2024年4月13日美团春招实习试题【第一题:好子矩阵】-题目题解在线评测【模拟】 题目描述&#xff1a;输入描述输出描述样例 解题思路一&#xff1a;模拟解题思路二&#xff1a;思路二解题思路三&#xff1a;直接判断 题目描述&#xff1a; 塔子哥定义一个矩阵是”好矩阵”&…...

ssm057学生公寓管理中心系统的设计与实现+jsp

学生公寓管理中心系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生&#xff0c;其可以帮助管…...

循环神经网络(RNN):概念、挑战与应用

循环神经网络&#xff08;RNN&#xff09;&#xff1a;概念、挑战与应用 1 引言 1.1 简要回顾 RNN 在深度学习中的位置与重要性 在深度学习的壮丽图景中&#xff0c;循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNN&#xff09;占据着不可或缺的地位。自从…...

UML 介绍

前言 UML 简介。 文章目录 前言一、简介1、事务2、关系1&#xff09;依赖2&#xff09;关联聚合组合 3&#xff09;泛化4&#xff09;实现 二、类图三、对象图四、用例图五、交互图1、序列图&#xff08;顺序图&#xff09;2、通信图 六、状态图七、活动图八、构件图&#xff0…...

Pytorch——训练时,冻结网络部分参数的方法

一、原理&#xff1a; 要固定训练网络的哪几层&#xff0c;只需要找到这几层参数(parameter)&#xff0c;然后将其 .requires_grad 属性设置为 False 即可。 二、代码&#xff1a; # 根据参数层的 name 来进行冻结 unfreeze_layers ["text_id"] # 用列表 # 设置冻…...

制冷铜管焊接介绍

铜管是制冷装置的重要原材料&#xff0c;它主要有两种用途&#xff1a;①制作换热器。②制作连接管道和管件。常用的焊料类型有铜磷焊料、银铜焊料、铜锌焊料等。在焊接时要根据管道材料的特点&#xff0c;正确的选择焊料及熟练的操作&#xff0c;以确保焊接的质量。 1.1对同类…...

php mysql怎么编写视频网站/网店推广方案

String类1、Java.lang包简介java.lang包是java内置的一个基础包&#xff0c;其中包含了一系列程序中经常要用到的类&#xff1b;在默认情况下&#xff0c;每个java程序都会自动导入该包&#xff0c;因此无需在程序中显式地声明。2、String类Java语言中&#xff0c;字符串是Stri…...

罗湖网站建设报价/把百度网址大全设为首页

#金山快盘#窗前明月光&#xff0c; [快盘] 签到忙。点击得10M&#xff0c;微博还有奖。文件 [快盘] 放&#xff0c;不畏丢失殇&#xff1b;作息分两地&#xff0c;同步最擅长&#xff1b;在线想协作&#xff1f; [快盘] 有共享&#xff1b;平台终端广&#xff0c;陪我走四方&am…...

wordpress 底部音乐播放器插件/百度客户端下载安装

在开始 GUI 自动化之前&#xff0c;你应该知道如何避免可能发生的问题。Python 能以想象不到的速度移动鼠标并击键。实际上&#xff0c;它可能太快&#xff0c;导致其他程序跟不上。而且&#xff0c;如果出了问题&#xff0c;但你的程序继续到处移动鼠标&#xff0c;可能很难搞…...

深圳企业网站建设定制开发服务/网站开发流程

题目&#xff1a;原题链接&#xff08;简单&#xff09; 标签&#xff1a;字符串、哈希表 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N)O(N)O(N)O(1)O(1)O(1)36ms (83.40%)Ans 2 (Python)O(N)O(N)O(N)O(1)O(1)O(1)44ms (66.36%)Ans 3 (Python) 解法一&#xff08;哈希…...

建设网站 备案/淘宝网店代运营正规公司

本文实例讲述了Python简单实现自动删除目录下空文件夹的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;总是发现电脑用上一段时间&#xff0c;各种软件生成各种目录&#xff0c;可是这些目录都是空文件夹&#xff0c;感觉没用&#xff0c;或许有些许强迫症吧&…...

wordpress 无限下拉菜单/网络推广seo是什么

2019独角兽企业重金招聘Python工程师标准>>> 好久没看大数据&#xff0c;最近发现用的软件都太旧了&#xff0c;所以准备更行所有大数据相关的新用法。 第一步&#xff1a;下载hadoop3.0.0-alpha2 我就给个网站吧&#xff0c;怎么下载(http://http://mirrors.cnnic.…...