为什么要等待:需要的元素尚未加载出来(原因可能有:网速慢、网站内容过多),代码已经运行到元素位置,此时会报错;为避免这种错误,需要使用到等待,等待元素加载出来再执行元素
1、显式等待
显式等待是针对于某个特定的元素设置的等待时间
格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
示例:WebDriverWait(driver,10,0.2).until(ec.presence_of_element_located((By.CSS_SELECTOR,'.box-conteny')))
解释:WebDriverWait(driver,10,0.2)意思是:使用浏览器driver显式等待,10秒内,每0.2秒进行一次后面的元素定位,若发现可以定位元素,则跳过,执行下一行代码;若元素未加载出来,无法定位,一直等待,等到10秒过后还无法定位则报错(会卡在这里,不通过不会执行下一行代码);presence_of_element_located()方法作用是判断后面的元素是否存在
# 显式等待 # 导入WebDriver from selenium import webdriver # 导入by from selenium.webdriver.common.by import By # 导入等待类WebDriver from selenium.webdriver.support.ui import WebDriverWait # 导入预期条件设置类expected_conditions 命名为ec from selenium.webdriver.support import expected_conditions as ec import time # 创建一个浏览器 driver = webdriver.Firefox() driver.maximize_window() # 访问网址 driver.get('https://dev.zebrapp.com/Manager/#/') # 设置显式等待预置条件 # WebDriverWait(driver,10,0.2):使用浏览器driver显式等待,10秒内,每0.2秒进行一次后面的元素定位,若发现可以定位元素,则跳过,执行下一行代码;
若元素未加载出来,无法定位,一直等待,等到10秒过后还无法定位则报错(会卡在这里,不通过不会执行下一行代码) # until意思是直到,直到后面的条件满足为止,即10秒内可以定位则跳过,10秒内定位不了则报错 WebDriverWait(driver,10,0.2).until(ec.presence_of_element_located((By.CSS_SELECTOR,'.box-content'))) # 下拉滚动条 for i in range(5): js = 'window.scrollTo(0,%s)' % (i*100) driver.execute_script(js) time.sleep(0.5) driver.quit()
显示等待稍微复杂
2、隐式等待
使用implicitly_wait()方法实现隐式等待,设置的是全局等待(对页面的所有元素有效);若设置了隐式等待,运行到元素定位时定位不到元素,会在时间内多处尝试定位,超过时间则报错;设定的时间非固定,不影响脚本运行,不针对某个特定的元素进行等待;脚本执行到元素定位,可以定位则继续执行;定位不了则以轮询的方式不多判断元素 是否定位到,在时间内定位到则继续执行;时间内定位不到,则报错
格式: driver.implicitly_wait(10)
from selenium import webdriver # 创建一个浏览器对象,设置为最大化屏幕 driver = webdriver.Firefox() driver.maximize_window() # 访问淘宝 driver.get('https://www.taobao.com/') # 下拉滚动条 for i in range(100): js = 'window.scrollTo(0,%s)' % (i*100) driver.execute_script(js) # 隐式等待(10秒):隐式并不针对某个元素进行等待,脚本运行到元素定位时,元素若已经加载出来,可以定位,则不等待,继续运行;
若元素未加载出来,还不能定位,则等待10秒,10秒内加载出来则继续运行,加载不出来则报错 driver.implicitly_wait(10) # 定位元素(此元素需要下拉滚动条,否则不加载出来;若验证隐式等待的效果,可以注释下拉操作运行代码) driver.find_element_by_css_selector('.hotsale-hd > em:nth-child(1)') # 关闭浏览器 driver.quit()
3、休眠
time.sleep(2),休眠2秒;此方式需要导入time模块,属于强制代码休眠
# 导入模块 from selenium import webdriver import time # 创建浏览器,设置为最大化 driver = webdriver.Firefox() driver.maximize_window() # 访问百度 driver.get('http://www.baidu.com') # 强制休眠2秒 time.sleep(2) # 定位百度输入框 driver.find_element_by_id('kw')
显式等待针对的是某个 特定的元素,需要设置查询元素是否能被定位到频率等;隐式等待设置的是全局,对整个网页所有元素有效;休眠则强制代码休眠时间,显式和隐式 不休眠,只是等待