selenium强制等待,隐式等待,显式等待
Posted Bug挖掘机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium强制等待,隐式等待,显式等待相关的知识,希望对你有一定的参考价值。
在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(appium通用)常用的等待分为显示等待WebDriverWait()、隐式等待implicitly_wait()、强制等待sleep()三种,下面我们就分别介绍一下这三种等待的区别
强制等待
sleep(): 强制等待,设置固定休眠时间。脚本的执行过程中执行 sleep()后线程休眠。
隐式等待
implicitly_wait():隐式等待,是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
# 导包-selenium
from selenium import webdriver
# 导入时间包
from time import sleep
# 实例化对象-火狐浏览器
driver=webdriver.Firefox()
# 调用隐式等待
driver.implicitly_wait(10)
url="E:\\\\双元\\\\Web自动化\\\\02_其他资料\\\\注册A.html"
# 打开url
driver.get(url)
driver.find_element_by_css_selector("#userA").send_keys("admin")
driver.find_element_by_css_selector("#passwordA").send_keys("123456")
sleep(3)
# 关闭浏览器
driver.quit()
显式等待
WebDriverWait():显式等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
实现步骤
1. 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait
2. 导包 判断条件 --> from selenium.webdriver.support import expected_conditions as EC
(将expected_conditions 通过as关键字起个别名:EC)
3. WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver:浏览器对象
2). timeout:超时的时长,单位:秒
3). poll_frequency:检测间隔时间,默认为0.5秒
4. 调用方法 until(method):直到..时
1). method:调用EC.presence_of_element_located(element)
element:调用By类方法进行定位
# 导包-selenium
from selenium import webdriver
# 导入显示等待类
from selenium.webdriver.support.wait import WebDriverWait
# 导入预期条件类 as 关键字起个别名为:EC
from selenium.webdriver.support import expected_conditions as EC
# 导入By类
from selenium.webdriver.common.by import By
# 导入时间包
from time import sleep
# 实例化对象-火狐浏览器
driver=webdriver.Firefox()
url="E:\\\\双元\\\\Web自动化\\\\02_其他资料\\\\注册A.html"
# 打开url
driver.get(url)
element=WebDriverWait(driver,30).until(EC.presence_of_element_located((By.ID,userA)))
element.send_keys("admin")
sleep(3)
# 关闭浏览器
driver.quit()
显示等待的第二种调用方式
可以使用lambda表达式,如
WebDriverWait(driver,30).until(lambda x:x.find_element_by_id("kw")).send_keys("yoyo")
#以下代码同理
element=WebDriverWait(driver,30).until(lambda x:x.find_element_by_id("kw"))
element.send_keys("yoyo")
这里的lambda表达式还可以这样写
def get_element(self, by, locator):
"""
find alone element
:param by: eg: id, name, xpath, css.....
:param locator: id, name, xpath for str
:return: element object
"""
try:
print([Info:Starting find the element "" by ""!].format(locator, by))
element = WD(self.driver, self.outTime).until(lambda x: x.find_element(by, locator)) #注意这里的find_element是selemium的内置方法
except TimeoutException as t:
print(error: found "" timeout!.format(locator), t)
else:
return element
重点看这行代码
element = WD(self.driver, self.outTime).until(lambda x: x.find_element(by, locator))
通过看until的源码,我们发现匿名函数lambda传了webdriver对象进去
def until(self, method, message=):
"""Calls the method provided with the driver as an argument until the \\
return value is not False."""
screen = None
stacktrace = None
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver) #发现匿名函数传参driver
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, screen, None)
stacktrace = getattr(exc, stacktrace, None)
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message, screen, stacktrace)
关于lambda表达式的使用说明
# 普通函数定义和调用
def f(x):
return x**2
什么是Selenium Webdriver中的显式等待与隐式等待?