2024.02.25
设置元素等待
大多数web应用都是ajax和JavaScript开发的,当我们加载页面的时候,一些元素是需要时间,就有可能发生代码执行到了,而元素没有被加载出来,此时就会出现找不到元素的情况
此问题的解决方案就是在元素定位之前进行等待,等到元素出现
强制等待time.sleep(),容易浪费时间,代码执行效率太低,因此webdriver为我们提供了两种等待类型,一种是隐式等待,一种是显式等待
1、显式等待
使webdriver等待某个条件的成立,当条件成立时,继续执行;若条件不成立,则每隔一段时间(默认是0.5s)检查一次,直到达到最大超时时间,还不成立,就抛出超时异常(TimeoutException);若等到元素,就不会再等了;
显式等待,是对具体的元素操作声明,若想使用显式等待,则必须对元素定位进行修改
from selenium.webdriver.common.by import By #设置元素定位使用哪种方法
from selenium.webdriver.support.ui import WebDriverWait #元素等待类
from selenium.webdriver.support import expected_conditions as EC #提供条件判断函数
ele = WebDriverWait(driver,5,0.5).util(
#检查元素是否在界面上被加载出来
EC.visibility_of_element_located(
(By.CSS_SELECTOR,"css定位表达式")
)
)
ele.click()
将显示等待封装成函数:
def waitEle(driver,timeout,poll_frequency,findType,findpath):
"""
:param driver:
:param timeout:等待时间
:param poll_frequency:轮询时间,默认是0.5s
:param findType: 元素定位方式
:param findpath: 元素定位表达式
:return:
"""
ele = WebDriverWait(driver,timeout,poll_frequency).util(
#检查元素是否在界面上被加载出来
EC.visibility_of_element_located(
(findType,findpath)
)
)
return ele
2、隐式等待
声明隐式等待,只对声明之后的代码有效
隐式等待默认参数是秒,如下代码,最大超时时间为5秒;当脚本执行到某个元素定位的时候,能定位就继续执行;如果不能定位,以轮询的方式()不断地判断元素是否能被定位(假设在第x秒定位到元素了门就不等了,继续往下执行),若直到最大时长还没定位成功,就抛出异常
#声明隐式等待
driver.implicitly_wait(5)
隐式等待简单,为什么还会有显示等待?
像点击微博热搜后,打印第一行,需要等一下,成功后其他行就没必要再等了,如果用隐式等待,每一行都需要等,比较浪费时间