赞
踩
使用webdriver定位元素时,当页面还处于加载中的状态,可能会识别不到该元素。这个时候就需要加上一定的等待时间。主要由以下三种原因造成:
1.代码运行速度比网络速度快
2.电脑配置
3.服务器处理请求需要时间
该方法不仅可以在selenium中使用,还可以在python脚本中使用,可以强制代码停止执行。在使用的时候只需要引入
from time import sleep
作用范围:针对页面上所有元素
适用场景:当产品大大提出某个页面需要在x秒内加载完成的需求,即验证页面上所有元素加载完成的时间时,可以使用隐式等待。
核心讲解:通过implicitly_wait()方式实现隐式等待,默认单位为秒。通过一定的时长等待页面所有元素加载完成,如果超出了设置的时长,元素还没有被加载则抛NoSuchElementException异常 。
示例代码:
# 1.导入selenium from selenium import webdriver from selenium.common.exceptions import NoSuchElementException import time # 2.打开浏览器——谷歌浏览器 driver = webdriver.Chrome('./chromedriver') # 3.输入网址 driver.get("https://www.taobao.com") # 4.使用隐式等待,点击【亲,请登录】链接 print("开始时间",time.time()) # 获取时间戳 driver.implicitly_wait(10) # 隐式等待最大等待时间10s try: driver.find_element_by_link_text("亲,请登录").click() except NoSuchElementException as msg: print(msg) print("结束时间",time.time()) # 获取时间戳 # 5.关闭浏览器 driver.quit()
作用范围:针对页面某一个元素
简单介绍:在设定时间内,针对某个元素每隔一段时间去检测其是否存在,如果超过设定时间检测不到则抛出异常。
调用方法:WebDriverWait(driver, timeout, poll_frequency, ignored_exceptions).until(method, message) 或者WebDriverWait(driver, timeout, poll_frequency, ignored_exceptions).until_not(method, message)
参数详解:
(1)WebDriverWait
参数 | 详解 |
---|---|
driver | WebDriver的驱动程序(IE、Firefox、Chrome等) |
timeout | 最长超时时间,默认以秒为单位 |
poll_frequency | 休眠时间的间隔(步长)时间,默认为0.5秒 |
ignored_exceptions | 超时后的异常信息,默认情况下抛NoSuchElement异常 |
(2)until
参数 | 详解 |
---|---|
method | 在等待期间,每隔一段时间调用这个传入的方法,直至返回True |
message | 如果超时,抛出TimeoutException,将message传入异常 |
(3)until_not
参数 | 详解 |
---|---|
method | 与until相反,until是当某元素出现或什么条件成立则继续执行 |
message | until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述 |
示例代码:
# 1.导入selenium
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
# 2.打开浏览器——谷歌浏览器
driver = webdriver.Chrome('./chromedriver')
# 3.输入网址
driver.get("https://www.taobao.com")
# 4.显示等待
print("开始时间",time.time())
search = WebDriverWait(driver,3).until(lambda x:driver.find_element_by_id("q"))
print("结束时间",time.time())
search.send_keys("衣服")
# 5.关闭浏览器
driver.quit()
注意一下:until里面的参数是method,如果写成search = WebDriverWait(driver,3).until(driver.find_element_by_id(“q”),则控制台会报错:
此时说明WebElement这个对象不能被调用,那正确的写法是什么呢?对于python语法不是很熟悉的同学,可以进入WebDriverWait的方法。这里的Example就给了一个很好的示例:
实际上在python 中,lambda函数是用一个语句表达的匿名函数,它可以用它来代替小的函数,相当于是将元素定位封装成了一个方法,这样一来就我们就可以愉快地使用啦。
当元素定位的表达式写错时,控制台会提示超时错误。说明经过一定的等待时间,元素还是没有被找到。
今天我们主要学习了元素等待的三种方式:sleep强制等待、隐式等待、显式等待,小伙伴们都学会了吗?小王想说:美味需要耐心等待,人生也是如此。只要不停下脚步,终会遇见那个对的人更加优秀的自己。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。