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

Selenium4.0+Python三种元素等待方式介绍 及 元素等待封装

目录

前言

三种等待

一、线程等待

二、隐性等待

三、显性等待

封装


前言

        web自动化测试,常常因为硬件配制,浏览器,网速等因素导致网页加载速度过慢,需要加入等时间。使用Selenium做自动化时,可以用到三种等待方式:线程等待(睡眠)隐性等待显性等待

        

        提供自动化测试练手的网站:scho测试练手网站http://schotest.hunwei.top/    

三种等待

一、线程等待

time.sleep()

此方法多用于线程延迟执行,线程挂起等场景,像自动化执行就是线程挂起场景:

让进程睡上几秒,等待元素加载成功,线程醒来后再操作页面元素。

形象展示其作的代码

import time

print("开始时间 : %s" % time.ctime())
time.sleep(5)  #睡眠五秒
print("结束时间 : %s" % time.ctime())

参数是数字(整型,浮点型),以为单位

练手网站登录页面如下,账密编辑框都可以以name为定位,值分别是username、password

 代码编辑如下

import time

from selenium import webdriver
#导入元素定位类型枚举
from selenium.webdriver.common.by import By

webdr = webdriver.Chrome()   #Chrome没有带路径参数需要将chromedriver.exe跟本文件放在同一个目录下面
webdr.get(url='http://schotest.hunwei.top/')

# 等待一般加在这类位置,在渲染页面元素出现过程中。
print("开始时间 : %s" % time.ctime())
time.sleep(5)  #睡眠五秒
print("结束时间 : %s" % time.ctime())

webdr.find_element(By.NAME, 'username').clear()
webdr.find_element(By.NAME, 'username').send_keys('admin')
webdr.find_element(By.NAME, 'password').clear()
webdr.find_element(By.NAME, 'password').send_keys('qwer1234')
webdr.find_element(By.XPATH, '//*[@id="app"]/div/form/button').click()

运行 成功登录到系统,规矩的等待了5秒

二、隐性等待

implicitly_wait()

隐性等待

webdr.implicitly_wait(5)

上行代码是1~5秒内等待页面加载完成,加载完成页面后,将停止等待(比如页面在第2秒加完成,就停止等待,后面3秒不再等待)执行下一步代码。

当然5秒页面没刷新成功,那也不再等待,也执行下一步代码,接着因找不到元素报错

隐性等待比起线程等待它更智能,更效率。隐性等待是webdriver自带的等待方式,很受大众喜爱。

案例代码如下:

import time

from selenium import webdriver
#导入元素定位类型枚举
from selenium.webdriver.common.by import By

webdr = webdriver.Chrome()   #Chrome没有带路径参数需要将chromedriver.exe跟本文件放在同一个目录下面
webdr.get(url='http://schotest.hunwei.top/')

# 等待一般加在这类位置,在渲染页面元素出现过程中。
print("开始时间 : %s" % time.ctime())
webdr.implicitly_wait(10)  #睡眠五秒
print("结束时间 : %s" % time.ctime())

webdr.find_element(By.NAME, 'username').clear()
webdr.find_element(By.NAME, 'username').send_keys('admin')
webdr.find_element(By.NAME, 'password').clear()
webdr.find_element(By.NAME, 'password').send_keys('qwer1234')
webdr.find_element(By.XPATH, '//*[@id="app"]/div/form/button').click()

像下图,因为网站很快,页面一秒都不想等待,运行的老快了

三、显性等待

隐性等待虽好,页面加载完成了,网站开发者说,我为了性能,要做很多异步加载的元素,页面加载完成,异步加载的元素还在加载中,自动化测试脚本 find_element 又找不元素了。

这时就看显性等待的了

WebDriverWait

案例代码

import time

from selenium import webdriver
#导入元素定位类型枚举
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

webdr = webdriver.Chrome()   #Chrome没有带路径参数需要将chromedriver.exe跟本文件放在同一个目录下面
webdr.get(url='http://schotest.hunwei.top/')

# 等待一般加在这类位置,在渲染页面元素出现过程中。
print("开始时间 : %s" % time.ctime())
WebDriverWait(webdr, 30, 0.5).until(EC.visibility_of_element_located((By.NAME, 'username')))
print("结束时间 : %s" % time.ctime())

webdr.find_element(By.NAME, 'username').clear()
webdr.find_element(By.NAME, 'username').send_keys('admin')
webdr.find_element(By.NAME, 'password').clear()
webdr.find_element(By.NAME, 'password').send_keys('qwer1234')
webdr.find_element(By.XPATH, '//*[@id="app"]/div/form/button').click()

WebDriverWait(webdr, 30, 0.5).until(EC.visibility_of_element_located((By.NAME, 'username')))

显性等待这一行代码解析

WebDriverWait为第一部分

until为第二部分

第一部分: 传入webdriver对象,等待30s,每0.5s执行一下until里的代码

第二部分:  EC是expected_conditions是Selenium的一个判断元素的模块,

        visibility_of_element_located 表示判断元素(By.NAME, 'username')是否可见

这两部分组成的含义:等待30s,每0.5s检查一次指定元素是否可见,可见后,跳出等待,超过30s都指定元素没有出现,抛出TimeoutException异常。

显性等待能等待隐性等待处理不了的异步加载,所以在自动化使用中,频次出现是最高的。

执行

封装

在手撸自动化框架时,需要将一些常用的脚本先封装好,设计好既定的参数与返回值,上述三种等待是很好封装的。

        构思中~

相关文章:

  • django梳理
  • 嵌入式软件调试的发展历程
  • PT_连续型随机变量/分布函数/概率密度
  • Python告别pip手动安装模块,实现全自动安装第三方库,彻底解放你的双手
  • 文件目录操作——Linux命令核心
  • Taichi 加速 Python 中图像处理
  • Vue--》MVVM模型在Vue中的使用
  • 迷宫求解(云南大学)
  • 【夜读】坚持这5个习惯,遇见更优秀的自己
  • 算法与数据结构【30天】集训营——平衡二叉树的LL、RR、LR、RL调整的简单快速方法(16)
  • Java本地搭建宝塔部署实战医药WMS进销存源码
  • 基于meanshift算法的目标聚类和目标跟踪matlab仿真
  • Google Earth Engine ——把reducer统计的数据分别放在不同的列表中打印出来,使用unzip()函数
  • Ubuntu 18.04 LTS PWN安装
  • @Bean注解详解
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 03Go 类型总结
  • C++11: atomic 头文件
  • HomeBrew常规使用教程
  • HTML-表单
  • iOS | NSProxy
  • js
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • magento 货币换算
  • mysql中InnoDB引擎中页的概念
  • Redis在Web项目中的应用与实践
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SQLServer之创建数据库快照
  • vue 个人积累(使用工具,组件)
  • 闭包--闭包之tab栏切换(四)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 离散点最小(凸)包围边界查找
  • 盘点那些不知名却常用的 Git 操作
  • 前端
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 我是如何设计 Upload 上传组件的
  • 一起参Ember.js讨论、问答社区。
  • ​插件化DPI在商用WIFI中的价值
  • %check_box% in rails :coditions={:has_many , :through}
  • (175)FPGA门控时钟技术
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (day6) 319. 灯泡开关
  • (javascript)再说document.body.scrollTop的使用问题
  • (待修改)PyG安装步骤
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一) springboot详细介绍
  • (转载)(官方)UE4--图像编程----着色器开发
  • .describe() python_Python-Win32com-Excel
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net 后台导出excel ,word
  • .NET企业级应用架构设计系列之结尾篇
  • .NET上SQLite的连接