selenium之显式等待和隐式等待、休眠

  为什么要等待:需要的元素尚未加载出来(原因可能有:网速慢、网站内容过多),代码已经运行到元素位置,此时会报错;为避免这种错误,需要使用到等待,等待元素加载出来再执行元素

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')

  显式等待针对的是某个 特定的元素,需要设置查询元素是否能被定位到频率等;隐式等待设置的是全局,对整个网页所有元素有效;休眠则强制代码休眠时间,显式和隐式 不休眠,只是等待

原文地址:https://www.cnblogs.com/will-wu/p/13491358.html