相关文章链接:
【Web自动化测试】(一)Selenium介绍及安装部署说明
【Web自动化测试】(二)使用selenium编写测试用例
【Web自动化测试】(三)Selenium中控件定位方法
【Web自动化测试】(四)Selenium中WEB控件交互的方法
【Web自动化测试】(六)Selenium中表单、多窗口、多frame、多浏览器等场景处理方法
【Web自动化测试】(七)selenium中执行JavaScript脚本
【web自动化测试】(八)cookie复用
前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步。
selenium提供三种等待方式,分别为:直接等待、隐式等待、显示等待。这三种等待方式都有各自的优缺点,下面就为大家介绍一下这三种等待方式。
1. 直接等待
-
语法:
time.sleep(N)
-
说明:
- 强制等待,线程会休眠一段时间
-
缺点:
- 非常不智能,使用不当会影响程序运行。
- 例如,定位元素。让页面加载完成后,元素才能被成功定位。因此我们会加入等待语句来等待页面加载。当使用直接等待时,若设置时间较短,很可能会因为页面还未完全加载而导致元素未成功定位;若设置时间较长,则会影响线程运行时间。
-
示例:
from time import sleep# 1. 导入依赖
from selenium import webdriver
class Testdemo():
def setup(self):
self.driver = webdriver.Chrome() # 2. 创建driver
self.driver.maximize_window()
def teardown(self): # 测试用例结束后操作
self.driver.quit() # 不添加的话,页面不会自动退出,影响资源回收
def test_wait(self):
self.driver.get("https://www.baidu.com")
self.driver.find_element_by_id('kw').send_keys("Selenium") #1.查询框输入 “Selenium”
sleep(5)
self.driver.find_element_by_id('su').click() #2. 点击查询按钮
sleep(3)
2. 隐式等待
- 语法:
driver.implicitly_wait()
- 说明:
- 设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没有出现就抛出异常。
- 优点:
- 轮询查找,相对智能,避免元素提前加载好后,程序还一直等待的情况。
- 缺点:
- 全局设置,作用域所有find element的方法,因此等待时间必须设置成元素查找的最长时间。若元素查找出现故障时则会影响程序运行。
- 示例:
from selenium import webdriver
class TestDemo():
def setup(self):
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5) #在setup中设置隐式等待,作用于全局find element函数
def teardown(self):
self.driver.quit()
def test_implicitly_wait(self):
self.driver.get("https://www.baidu.com")
self.driver.find_element_by_id('kw').send_keys("Selenium") #由于隐式等待,每0.5秒查找元素,查找到了就继续执行
self.driver.find_element_by_id('su').click()
3. 显示等待
- 语法:
WebDriverWait( ).until()
WebDriverWait( ).until_not()
- 说明:
- 在代码中定义等待条件,当条件发生时才继续执行代码。
- WebDriverWait( )配合until()和until_not()方法,根据判断条件进行等待。
- 程序每个一段时间(默认0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间。
- 优点:
- 显示等待是最优的等待方式,它是指定某一个元素来进行等待条件判断的,因此避免了在使用直接等待和隐式等待时可能产生的问题,提高程序运行的效率。
- 示例:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions # 导入依赖:条件判断时使用的类
from selenium.webdriver.support.wait import WebDriverWait # 导入依赖:显示等待
class TestDemo():
def setup(self):
self.driver=webdriver.Chrome()
self.driver.maximize_window()
def teardown(self):
self.driver.quit()
def test_webdriverwait(self):
self.driver.get("https://www.baidu.com")
#设置等待条件,当百度首页的logo图标可以点击的时候,则进行下一步操作
#使用内置方法:expected_conditions 来进行判断
WebDriverWait(self.driver,3).until(expected_conditions.element_to_be_clickable((By.ID,'s_lg_img')))
self.driver.find_element_by_id('kw').send_keys("Selenium")
#自定义方法,来进行until的条件判断
def wait(x):
'''
当找到元素的时候则返回True,否则False
:return: bool值,True-查到到元素,False-未找到元素
'''
# 使用find_elements方法,返回的是元素对象列表,未找到元素则为返回空列表
return len(self.driver.find_elements_by_class_name('s_tab_inner'))>=1
WebDriverWait(self.driver, 3).until(wait)
self.driver.find_element_by_id('su').click()
sleep(3) #添加直接等待,为了方便最后看页面查询效果 可以删除