页面还没加载出来就对页面上的元素进行操作,就会出现:因为加载元素延时造成的脚本失败,我们可以通过设置等待时间来提升自动化脚本的稳定性。
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 秒,则用小数表示。
37000.com威尼斯 copyright © 2013-2021 河南云和数据信息技术有限公司 isp经营许可证:豫b-20160281