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异常。
显性等待能等待隐性等待处理不了的异步加载,所以在自动化使用中,频次出现是最高的。
执行
封装
在手撸自动化框架时,需要将一些常用的脚本先封装好,设计好既定的参数与返回值,上述三种等待是很好封装的。
构思中~