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()

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis的RedisObject和对外可见的5种数据结构

目录 RedisObject Redis的编码方式 对外可见的5种数据结构 1.string string结构的源码 为什么是小于44字节会采用embstr编码? embstr和raw区别 2.list list结构的源码 3.set set结构的源码 4.zset zset结构的源码 5.hash hash结构的源码 Redis中…

EtherCAT开发_2_SSC使用记录

SSC快速开始参考《EtherCAT Slave Design Quick Guide》 字段内容直接参考SSC工具右侧Description,本文未填写。中文也可直接参考:《https://blog.csdn.net/g360250466/article/details/129847081》 ① Select EL9800 | 8Bit Digital I/O, 16Bit Analog Input 一、S…

Intel性能分析工具Vtune安装和使用简介

一、介绍 Intel Vtune profiler是用于串行和多线程应用程序的性能分析工具,可以帮助软件开发人员对应用程序的性能问题进行分析,支持包括linux和windows在内的多种操作系统。主要功能包括: 性能分析:可以对应用程序进行深入的性…

如何将低分辨率的视频变高清,使用AI工具分辨率画质增强至1080P、4K或者8K(附工具)

环境: Topaz Video AI 5.0 问题描述: 如何将低分辨率的视频变高清,使用AI工具分辨率画质增强至1080P、4K或者8K 原视频 增强1080P 解决方案: 1.打开软件,导入要处理的视频(工具在本文最后附上&#xf…

网络安全:绕过 MSF 的一次渗透测试

这次渗透的主站是 一个 Discuz!3.4 的搭建 违法招 piao 网站, 配置有宝塔 WAF 用 Discuz!ML 3.X 的漏洞进行攻击,但是没有成功 发现主站外链会有一个发卡网,引导人们来这充值,是 某某发卡网,而且域名指向也是主站的 ip…

Stable Diffusion 模型分享:CyberRealistic XL(真实)cyberrealisticXL_v11VAE.safetensors

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍

计算机网络基础:宏观认识

目录 一、网络发展背景与基本概念 二、网络协议的意义与TCP/IP五层结构模型 三、网络传输的基本流程与封装分用 四、ip地址和mac地址 随着信息技术的飞速发展,计算机网络已经成为了现代社会不可或缺的一部分。无论是工作、学习还是娱乐,我们几乎都离…

Crossref

https://baijiahao.baidu.com/s?id1766583173146005960&wfrspider&forpc https://zhidao.baidu.com/question/1796197318615421547.html

Java垃圾回收2

垃圾回收的算法有哪些 通过可达性分析算法,我们已经可以找到需要回收的对象。现在需要通过垃圾回收算法,把垃圾回收,释放内存。 1.标记清除算法(使用较少) 标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。…

面试官:来说说vue3是怎么处理内置的v-for、v-model等指令?

前言 最近有粉丝找到我,说被面试官给问懵了。 粉丝:面试官上来就问“一个vue文件是如何渲染成浏览器上面的真实DOM?”,当时还挺窃喜这题真简单。就简单说了一下先是编译成render函数、然后根据render函数生成虚拟DOM,…

国外GIS软件排名简介<30个>

简介 国外gisgeography网站进行了一次GIS软件排名,通过分析、制图、编辑等因素进行测试,具体规则如下: 分析:矢量/栅格工具、时态、地统计、网络分析和脚本。 制图:地图类型、坐标系、地图布局/元素、标注/注记、3D …

请勿假设你的用户都有管理员权限

有些人觉得自己很聪明,他们在程序中做了这样一项”优化”。 在程序的安装阶段,他们不会安装某些程序功能,而是等到用户第一次使用的时候才执行,也即所谓的 “按需加载”。 问题在于,第一次使用的时候,用户…

CSS-布局

display display 属性是用于控制 布局 的最重要的 CSS 属性。display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值,具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 block block:块级元素。块级…

从二本调剂到上海互联网公司算法工程师:我的成长故事

探讨选择成为一名程序员的原因,是出于兴趣还是职业发展? 在这个科技飞速发展的时代,程序员这一职业无疑成为了许多人眼中的香饽饽。那么,是什么驱使着越来越多的人选择投身于这一行业呢?是出于对编程的热爱&#xff0…

三步教你怎么把icloud照片恢复至iphone!

“我手机里面照片被优化后,然后不小心把所有被优化的模糊照片从手机中删除了,但是iCloud还有,我应该怎样把iCloud的照片重新放回手机?谢谢。” 在使用iPhone时,iCloud照片库是一个非常方便的功能,它允许你在…

文化=知识+素质!电动车限制多!——早读(逆天打工人爬取热门微信文章解读)

你是一个有文化的人! 引言Python 代码第一篇 洞见 一个人有没有文化,就看这五点第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 知耻近乎勇 文化教会我们自省 以羞耻心为镜 照见自我 不断向善向上。 引言 绝了 昨天晚上早早上床 10点左右就睡眠模…

微信小程序自定义导航栏定位及胶囊按钮图解

在自定义小程序导航栏时,右上角的胶囊(MenuButton)在不同机型测试,会发现很难适配。 实测中 不同的手机,胶囊高度不一样、状态栏高度不一样。与模拟器显示的情况是不一样的。 由于小程序在不同的手机上顶部布局会发生…

单片机入门还能从51开始吗?

选择从51单片机开始入门还是直接学习基于ARM核或RISC核的单片机,取决于学习目标、项目需求以及个人兴趣。每种单片机都有其特定的优势和应用场景,了解它们的特点可以帮助你做出更合适的选择。 首先,我们说一下51单片机的优势: 成熟…

设计模式之模板方法模式详解(上)

模板方法模式 1)概述 1.定义 定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.方案 背景:某个方法的实现需要多个步骤(类似…

Postman之接口测试

接口测试的必要条件 :请求方式、请求协议、请求地址、请求头、请求参数 常用请求方式 :Get请求(get请求一般是获取数据)、Post请求(post请求一般是提交数据) 传参格式 :表单提交、请求体提交 注…
最新文章