页面还没加载出来就对页面上的元素进行操作,就会出现:因为加载元素延时造成的脚本失败,我们可以通过设置等待时间来提升自动化脚本的稳定性。
WebDriver 提供了3种类型的等待:显式等待、隐式等待、休眠
² 显式等待是针对某一个元素进行相关等待判定;
² 隐式等待不针对某一个元素进行等待,全局元素等待;
² sleep 休眠方法。
WebDriverWait 类由 WebDriver 提供的等待方法。在设置时间内,默认每个一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常
² WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
² n Driver 浏览器驱动
² n Timeout最长超时时间,默认以秒为单位
² n poll_frequency 检测的间隔时间,默认为 0.5 秒
² n ignored_exceptions 超 时 后 的 异 常 信 息 , 默 认 情 况 下 抛 出
² NoSuchElementException 异常
² WebDriverWait 一般由 until()和 until_not()方法配合使用
² n until(method,message=’’) 调用该方法提供的驱动程序作为一个参数,知道返回值为 Ture
² n until_not(method,message=’’ 调用该方法提供的驱动程序作为一个参数,知道返回值为 False
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# as 将expected_conditions重命名为EC
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
# 指定浏览器位置
chrome_location = r'D:\software\Win_x64_1135105_chrome-win\chrome-win\chrome.exe'
options = webdriver.ChromeOptions()
options.binary_location = chrome_location
driver = webdriver.Chrome(options=options)
driver.get(r'https://www.baidu.com/')
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('selenium')
sleep(3)
# 显式等待 30 秒—判断搜索按钮是否存在
element = WebDriverWait(driver, 30, 0.5).until(EC.presence_of_element_located((By.ID, 'su'))
element.click()
sleep(3)
driver.quit()
implicitly_wait() 默认参数的单位为秒。隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载。
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from time import sleep, ctime
# 指定浏览器位置
chrome_location = r'D:\software\Win_x64_1135105_chrome-win\chrome-win\chrome.exe'
options = webdriver.ChromeOptions()
options.binary_location = chrome_location
driver = webdriver.Chrome(options=options)
# 隐式等待 30 秒
driver.implicitly_wait(30)
driver.get(r'https://www.baidu.com')
# 检测搜索框是否存在
try:
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('selenium')
driver.find_element(By.CSS_SELECTOR, '#su').click
except NoSuchElementException as msg:
print(msg)
sleep(3)
driver.quit()
sleep()方法有 Python 的 time 模块提供。在脚本调试过程中,希望脚本再执行到某一位置时做固定时间的休眠,则可以使用。
sleep()默认参数以秒为单位,如果设置时长小于 1 秒,则用小数表示。
Copyright © 2013-2021 河南云和数据信息技术有限公司 豫ICP备14003305号 ISP经营许可证:豫B-20160281