目录

前言

三种等待

一、线程等待

二、隐性等待

三、显性等待

封装

一、参数设计

二、函数名设计

三、封装代码设计


前言

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

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

三种等待

一、线程等待

time.sleep()

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

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

形象展示其作的代码

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

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

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

代码编辑如下

import timefrom selenium import webdriver
#导入元素定位类型枚举
from selenium.webdriver.common.by import Bywebdr = 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 timefrom selenium import webdriver
#导入元素定位类型枚举
from selenium.webdriver.common.by import Bywebdr = 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 timefrom 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 ECwebdr = 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异常。

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

执行

封装

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

个人喜好自然语言系列的自动化测试框架,

自然语言有的小伙伴认为它是关键字驱动,没数据驱动好(个人面试时经常遇到这种说法的面试官,也不是说他怎么的,但思想有点守旧,不开放),

关键字驱动与数据驱动结合开发框架不难的。容易上手、批量执行应该是框架两个小特性。

在这里我们可以将三种等待封装在一起,

一、参数设计

参数1、等待类型 wait_type:用来接收,等待,隐性等待,显性等待三种类型之一

参数2、 等待时间  secs:用来接收等待时间,单位是秒,默认3s

参数3、元素类型 type:接收元素定位顺类型,如:id, name, xpath等等,默认为空

参数4、元素定位器 location:接收定位器,如: username,password, //*[@id='su']等等,默认空、

参数5、浏览器对象 opr:接收webdriver.Chrome对象,默认为空

二、函数名设计

按照上面的设计,封闭函数名称如下

def waiting_for_element(wait_type, secs=3, type=None, location=None, opr:webdriver.Chrome=None):

疑问:为啥后面三个参数默认为空?带着疑问看下去,自行在代码中寻找答案。

三、封装代码设计

import timefrom 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
from selenium.common.exceptions import TimeoutException'''
定位类型字典设计
手撸框架可以节省很多if...else...代码
'''
LOCATION_TYPE = {'id': By.ID,'name': By.NAME,'class': By.CLASS_NAME,'tag': By.TAG_NAME,'link': By.LINK_TEXT,'plink': By.PARTIAL_LINK_TEXT,'xpath': By.XPATH,'css': By.CSS_SELECTOR
}def waiting_for_element(wait_type, secs=3, type=None, location=None, opr:webdriver.Chrome=None):if wait_type == '等待':time.sleep(secs)return True, '【等待】成功'elif wait_type == '隐性等待':opr.implicitly_wait(secs)return True, '【隐性等待】成功'elif wait_type == '显性等待':if type is None or location is None or opr is None:return False, '【显性等待】请填写所有参数'try:WebDriverWait(opr, secs, 0.5).until(EC.visibility_of_element_located((LOCATION_TYPE[str.lower(type)],location)))except TimeoutException as e:return False, '【显性等待】{}秒超时,元素[{}]=[{}]没有出现'.format(str(secs), type, location)except Exception as e:return False, '【显性等待】传参有误,请检查参数'

编写自动化测试脚本测试封装

webdr = webdriver.Chrome()   #Chrome没有带路径参数需要将chromedriver.exe跟本文件放在同一个目录下面
webdr.get(url='http://schotest.hunwei.top/')# 等待一般加在这类位置,在渲染页面元素出现过程中。
print("开始时间 : %s" % time.ctime())#waiting_for_element('等待')   #线程等待的调试# waiting_for_element('隐性等待', 10, opr=webdr)   #隐性等待的调试print(waiting_for_element('显性等待', 10, type='id', location='username', opr=webdr))   #显性等待的调试,此处故意将type='id',引起它找不到id='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()

执行结果

本文到此告一段落

望大家多多点赞收藏

兄弟文有

新版selenium4.0 + Python使用详解https://mp.csdn.net/mp_blog/creation/editor/124637868
新版 Selenium4.0 与 谷歌、火狐、Edge浏览器的兼容性封装https://mp.csdn.net/mp_blog/creation/editor/126356747

Selenium4.0+Python手撸自动化框架系列之 Web元素等待方式介绍 与 封装相关推荐

  1. 视频教程-手写Java框架系列教程之一反射(含配套资料)-Java

    手写Java框架系列教程之一反射(含配套资料) 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业 ...

  2. 【手撸RPC框架】SpringBoot+Netty4实现RPC框架

    [手撸RPC框架]SpringBoot+Netty4实现RPC框架 线程模型1:传统阻塞 I/O 服务模型 模型特点: 采用阻塞IO模式获取输入的数据 每个链接都需要独立的线程完成数据的输入,业务处理 ...

  3. Python+Selenium WebUI自动化框架 -- 实现特殊PO模型

    前言: 设计执行格式,封装PO模型工厂,实现PO模型脱离代码,一套代码执行所有项目的UI自动化,让UI自动化框架脱离高成本.低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试 ...

  4. 开源工具 | 手游自动化框架GAutomator,新增iOS系统和UE4引擎支

    WeTest 导读 GAutomator是腾讯WeTest推出的手游自动化测试框架,已用于腾讯多个手游项目组的自动化测试. 1.GAutomator诞生背后 研究过手游自动化测试的同学都知道,虽然市场 ...

  5. 已解决python selenium模块自动化操作谷歌浏览器点击元素失效问题解决(亲测有效)

    已解决python selenium模块自动化操作浏览器点击元素,抛出异常selenium.common.exceptions.ElementClickInterceptedException: Me ...

  6. ShutIt:一个基于Python的shell自动化框架

    译者注:本文通过实例简单介绍了ShutIt这个基于Python的自动化框架的使用方法.除了pexpect,我们又多了这个选择.以下是译文. ShutIt是一个易于使用的基于shell的自动化框架.它对 ...

  7. 浅谈python+requests接口自动化框架

    为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...

  8. python手撸桌面计算器

    网上有一些许多关于计算器的源码,但我似乎不太care 一直寻思着自己手撸一个才有意思,于是这就开始了 实现功能: 1.基本的两个数 +-x÷ 运算以及取反,百分之,平方等 2.支持连续运算 3.暂不支 ...

  9. Java接口自动化框架系列07:Web接口自动化测试框架设计思路

    1.Java web接口自动化框架 框架名称:Java+Maven+httpClients+TestNg+Allure (因本次只讲解java部分,未包括git和jenkins,如果是包括git和je ...

最新文章

  1. 【html】如何解决标签设置成超链接后字体格式及颜色变化的问题
  2. Selenium3+python自动化009- 截图
  3. asp.net core监控—引入Prometheus(六)
  4. 顺丰快递,果然不一般!
  5. 威马汽车创始人沈晖:10万以下的不能叫智能电动汽车
  6. 利用切片操作,实现一个trim()函数,去除字符串首尾的空格
  7. html常用的英文字体,50款设计必备 英文字体
  8. fpgrowth算法实战 mlib_MLlib--FPGrowth算法
  9. 企业内部知识共享平台的搭建和应用
  10. bochs运行xp_bochs xp镜像完整免费版
  11. Java中不同时区时间的转换
  12. linux 系统安装aria2以及配置web端
  13. Cardboard的学习(一)Cardboard的介绍
  14. CSP-2019day1题解报告
  15. 如何在Android/鸿蒙上安装XAPK文件
  16. SCAU 软件工程 期末复习
  17. 数值随机化算法和舍伍德随机算法
  18. linux 监控网络出口流量,Linux下网络流量监控
  19. Java 时间转汉字
  20. UIElements开发人员指南9 样式(Style)和Unity样式表(style sheets)

热门文章

  1. 国产2.4G芯片的简单应用
  2. WebStorm右端小地图/代码收缩图
  3. yolov7 姿态识别-人体骨架-实时检测+实例分割
  4. Cordova工程index.html/index.css/index.js结构及关键代码
  5. gitlab mr wip 怎么弄成_GitLab | 为什么我们开源了公司员工手册
  6. 【python教程入门学习】用python制作url短链
  7. 微软数学app 面向从小学,初中到高中各个级别和类型的数学问题
  8. 如何正确高效准确的使用搜索引擎?
  9. 数学问题总结(题目合集)
  10. dy是怎么算收益的?武汉新时标文化传媒