selenium 等待

为什么要等待?
  因为在web中看到的元素,不一定是写在html代码中的, 有可能是通i过javascript代码的dom操作产生出来的。而js产生元表,很可能先要去获取到数据,处理后再去显示的。所以: 不一定网页打开,所有的元素都在页面中了。如果马上去找,可能出错。

Message: no such element: Unable to locate element: 

强制等待:

# 由于代码执行时间远远少于页面加载时间,
# 在执行的时候下一条语句的时候,所需要的元素可能还没有加载出来,
# 所以需要让代码等待一下页面

# 强制等待
# 存在一定的问题,人为规定了等待的时间,但实际上的情况没办法实现预知
# 事先规定好等待时间,可能出现浪费时间或者等待时间不够的情况
time.sleep(2)

一、显式等待

如何操作:
  1.使用WebDriverWait包装webDriver对象
  2.使用webDriverWait的util方法,传入可调用对象(通常是presence_of_element_located函数的返回值)
  3.需要导包

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC  # 新导入
from selenium.webdriver.support.wait import WebDriverWait  # 新导入

例:

# 显示等待
# 等待某个元素加载完成 每隔0.5s检查一次,最多持续5s时间
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, '1')))

原理:
  每隔一定时间不断尝试查找元素。找到了就返回
  如果超过指定时间还没找到就报错

 

二、隐式等待

 

# 隐式等待
# 没有说等的是谁,不需要导很多包
driver.implicitly_wait(5)

原理:

  隐式等待针对的是全局的所有元素,会等待界面加载完成,在规定时间内不断刷新,

  找到设置的条件后,会继续执行后续代码,如果在规定时间内找不到就抛出异常.

注意:

  隐式等待的作用是全局的,也就是说只要设置一次隐式等待,后面就不需要设置。如果再次设置隐式等待,那么后一次的会覆盖前一次的效果。

优先使用显示等待,因为隐式等待会不断刷新,耗内存。

 

posted @ 2022-07-25 15:52  石元  阅读(41)  评论(0编辑  收藏  举报