selenium - 元素等待

101 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详

元素等待:在定位页面元素时如果没有找到会在指定时间内一直等待的过程,设置元素等待的原因主要是HTML页面加载需要时间,总结为以下几个:

  • 网络速度慢
  • 电脑配置低
  • 服务器处理请求慢

元素等待的方式有以下三种:

  • 隐式等待
  • 显示等待
  • 强制等待

隐式等待

首先要等待页面加载成功,在进行元素定位。定位元素时,如果能定位到元素就直接返回元素不触发等待,如果不能定位到元素,则间隔一段时间再去定位元素,超过该时间之后如果在达到最大等待时长(参数)还没有找到元素,则抛出元素不存在异常nosuchelementexception。隐式等待为全局设置,针对所有元素有效

driver.implicitly_wait(timeout)
# timout最大等待时长。
​
​
bro=webdriver.Chrome(executable_path='./chromedriver.exe')
# 隐式等待:需要写在get('url')之前,针对所有元素,找一个空间,如果没有加载出来就等待5s
bro.implicitly_wait(5)
bro.get('https://www.baidu.com/')

显式等待

无需等待页面加载完成。定位元素时,如果能定位到元素就直接返回元素不触发等待,如果不能定位到元素,则间隔一段时间再去定位元素,超过改时间之后如果在达到最大等待时长(参数)还没有找到元素,则抛出元素不存在异常timeoutexception

显式等待的方法被封装在selenium.webdriver.support.wait.WebDriverWait,针对的是一个元素而不是全局元素。

WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
- driver 浏览器驱动对象
- timeout 最大等待时间,超时之前等待的时间单位是s
- poll_frequency 每次定位之间间隔时间,默认是0.5s
通常和until一起使用,而unitl的参数是匿名函数,用来查找元素
​
from selenium.webdriver.support.ui import WebDriverWait 
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) 
​
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id("someId").is_displayed())

强制等待

就是让代码休眠,不做任何的操作,就是time.sleep()

当需要获取元素的文本内容时,而元素的文本内容是需要通过后台接口请求并渲染的,此时如果使用隐式等待或者显示等待是没有办法获取文本内容的,因此需要使用强制等待。

当需要操作的元素已经定位到,但是有其他的元素需要等待并且和需要操作的元素有业务关联,如果使用隐式等待或者显式等待是没有办法进行的,也需要使用强制等待