显示等待优点:显示等待、若等待到了元素,就不会在进行等待,继续往下执行。若最大超时时间找不到元素,就进行报错。
若想使用显示等待,则必须对元素定位进行修改,也就是说,显示等待必须对具体的某个元素定位,去主动声明。
from selenium import webdriver from selenium.webdriver.common.by import By # 设置元素定位使用哪种方法的 from selenium.webdriver.support.ui import WebDriverWait # 元素等待类 from selenium.webdriver.support import expected_conditions as EC # 提供条件判断函数 # 显示等待,若等到元素,就不会再等了 # 若想使用显示等待,则必须对元素定位进行修改 # 也就是说,显示等待必须对具体的某个元素定位,去主动声明 # 每隔 0.5s 检查一次元素是否存在,最多等待 5 s # 若在最大超时时间内,找到元素,就不等了,继续往下执行 # 若最大超时时间还找不到元素,就报错 ele = WebDriverWait(driver, 5, 0.5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, "#app > div:nth-child(1) > div:nth-child(1) > div.card.m-panel.card16.m-col-2 > div > div > div:nth-child(8) > div > div > h4") ) ) 返回一个元素。 #1.WebDriverWait(driver, 5, 0.5) 返回一个等待类的对象。请求参数:driver,最大超时时间,每多长时间去找一次元素。单位都是:秒 #2.调用until方法,请求参数为:expected_conditions里面的visibility_of_element_located类对象。对象里面的初始化参数: (By.CSS_SELECTOR, "#app > div:nth-child(1) > div:nth-child(1) > div.card.m-panel.card16.m-col-2 > div > div > div:nth-child(8) > div > div > h4") ) 定位元素的方法,定位的元素。
2.封装一个方法
# 将显示等待封装成了函数 def waitEle(driver, timeout, poll_frequency, findType, findStr): ''' :param driver: 浏览器driver :param timeout: 超时时间 :param poll_frequency: 多长时间轮询定位一次 :param findType: 定位的方式 :param findStr: 定位的元素 :return: ''' ele = WebDriverWait(driver, timeout, poll_frequency).until( EC.visibility_of_element_located( (findType, findStr) ) ) return ele
3.进一步优化:传入locator