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)
原理:
隐式等待针对的是全局的所有元素,会等待界面加载完成,在规定时间内不断刷新,
找到设置的条件后,会继续执行后续代码,如果在规定时间内找不到就抛出异常.
注意:
隐式等待的作用是全局的,也就是说只要设置一次隐式等待,后面就不需要设置。如果再次设置隐式等待,那么后一次的会覆盖前一次的效果。
优先使用显示等待,因为隐式等待会不断刷新,耗内存。