前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Selenium常用的元素等待方法

Selenium常用的元素等待方法

作者头像
Altumn
发布2019-10-21 17:34:41
1.6K0
发布2019-10-21 17:34:41
举报

写在前面

日常的UI自动化测试,单步调试的时候元素可以定位到,并且可以正常操作,但是在跑测试案例流程的时候反而报错。这时就需要考虑是否界面的切换,或者功能的跳转缓慢导致元素未加载完成就执行了操作,所以我们需要加上元素等待。WebDriver提供了几种类型的等待:强制等待、显式等待和隐式等待。

强制等待

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行;缺点是不智能,如果设置的时间太短,元素还没有加载出来一样会报错;设置的时间太长,则会浪费时间.这个方式一般比较少用。

代码语言:javascript
复制
#testclass.py
#www.testclass.cn
#Altumn
from selenium import webdriver
import timedriver = webdriver.Chrome()  
driver.maximize_window()
driver.implicitly_wait(30) # 隐性等待,最长等30秒; 
driver.get('https://www.testclass.cn')
time.sleep(3)#强制等待3秒;
driver.quit()

隐式等待

WebDriver提供了implicitly_wait()方法来实现隐式等待。隐式等待相当于设置全局等待,在定位元素时,对所有元素设置的超时时间。implicitly_wait()默认参数的单位为秒,默认设置为0。本例中设置等待时长为10秒。

注:默认设置超时时间为0,设置后这个隐式等待会在WebDriver对象实例的整个生命周期起作用。

代码语言:javascript
复制
#Baidu.py
#www.testclass.cn
#Altumn
from selenium import webdriver
from selenium.common.exceptions 
import NoSuchElementException
from time import ctimedriver = webdriver.Chrome()

# 设置隐式等待为10秒;
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

#处理异常机制;此案例正常不会超时抛出异常;
try:
   print(ctime())
   driver.find_element_by_id("kw").send_keys('www.testclass.cn')
except NoSuchElementException as e:
   print(e)
finally:
   print(ctime())
   driver.quit()

在上面的案例中implicitly_wait()设置等待时长为10秒。这个10秒的设置并不针对页面上的某一个元素进行等待,也不是一个固定的等待时间。如果设置了隐式等待,当元素定位时,如果元素可以正常定位,则继续执行;如果元素定位失败,将以轮询的方式不断地判断元素是否被定位到。直到超出设置时长(10秒)还没有定位到元素,则抛出异常。 抛出异常的案例:

代码语言:javascript
复制
#Baidu.py
#www.testclass.cn
#Altumn

from time import ctime
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementExceptiondriver = webdriver.Chrome()

# 设置隐式等待为10秒;
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

#处理异常机制;超出设置时长(10秒)还没有定位到元素,则抛出异常;
try:
   print(ctime())
   driver.find_element_by_id("kw_test").send_keys('www.testclass.cn')
except NoSuchElementException as e:
   print(e)
finally:
   print(ctime())
   driver.quit()

执行结果:

显式等待

接下来介绍一种更智能的等待方式:显示等待。显示等待比隐式等待更节省测试时间,个人更推荐使用显示等待的方式来判断页面元素是否出现。程序会每隔一段时间(默认为0.5秒,可自定义)执行一下判断条件,等待某个条件成立时继续执行,否则在达到最大时长抛出超时异常(TimeoutException);WebDriverWait()类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。

代码语言:javascript
复制
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver :浏览器驱动。
timeout :最长超时时间,默认以秒为单位。
poll_frequency :检测的间隔(步长)时间,默认为0.5S。
ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。

until(method, message=‘’)

method:

在等待期间,每隔一段时间调用这个传入的方法,直到返回值为True;

message:

如果超时,抛出TimeoutException,将message传入异常。

until_not(method, message=‘’)

method:

在等待期间,每隔一段时间调用这个传入的方法,直到返回值为False;

message:

如果超时,抛出TimeoutException,将message传入异常。

为了更直观的演示处理效果,制作了一个html(请复制到浏览器打开)。Confirm提示框传送门:

https://www.testclass.cn/test_html/Confirm.html

代码语言:javascript
复制
#Baidu.py
#www.testclass.cn
#Altumn
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

#导入模块,将expected_conditions 重命名为EC ;
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.testclass.cn/test_html/Confirm.html")

#等待标题是'confirm'的网页出现;
element = WebDriverWait(driver, 5,0.5).until(EC.title_is(u'confirm'))

#网页出现后打印一下提示;
print(u'网页标题是:“confirm”')

#等待元素属性NAME="button"点击按钮出现;
element = WebDriverWait(driver, 5,0.5).until(EC.presence_of_element_located((By.NAME, "button")))
element.click()

#等待Alert框出现;
alert=WebDriverWait(driver,5,0.5).until(EC.alert_is_present())

#定位到Alert;
alert = driver.switch_to.alert

#获取Alert的Text值;
print(alert.text)

#确定Alert;
alert.accept()

#设置等待Alert消失;
WebDriverWait(driver,5,0.5).until_not(EC.alert_is_present())
print(u'弹出框Alert已经被关闭啦~')

执行结果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试testclass 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档