Python selenium如何设置等待时间
实际应用过程中,网页加载是要消耗一定的时间的。脚本已经开始运行,但要定位的元素却还没加载出来,此时就会报出一个找不到元素的错误。显然,没有考虑加载时间的脚本不是一个成功的脚本。
等待的三种方法
1、time.sleep(n)
强制等待n秒。Python本身的函数,包含在time包中,使用前需要导入time包。我们之前的实例中经常会使用这种等待,方便大家能看清脚本执行的结果。这种等待方法十分笨拙,无论页面加载得如何,都必须等待n秒,可以说是十分不智能了。
2、implicitly_wait(n)--隐性等待
最长等待n秒,若n秒内页面加载完成,则提前结束等待。WebDriver提供的等待方法,也被称为隐性等待,比强制等待聪明了一点,但如果页面本身包含一个超大视频之类的文件,就算我们需要定位的元素在最开始已经加载出来,却依旧要等待所有文件加载结束之后,脚本才能继续执行,依旧算是有些弊端。
# coding = utf-8
from
selenium
import
webdriver
import
time
driver
=
webdriver.Chrome()
driver.implicitly_wait(
60
)
#隐性等待时间60秒
time_start
=
time.time()
#记录打开页面时的时间
driver.get(
'https://www.163.com/'
)
driver.find_element_by_id(
'js_love_url'
).click()
time_end
=
time.time()
#记录点击按钮后的时间
print
(
'access time is : '
, time_end
-
time_start)
#打印时间差,即实际消耗时间
time.sleep(
2
)
#强制等待2秒,为了观察我们确实打开了【公开课】页面
driver.quit()
>>>>>access time
is
:
5.717327117919922
3、WebDriverWait(n)--显性等待
最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在,若存在则提前结束等待。也是WebDriver提供的等待方法,也被称为显性等待,这种等待比隐性等待更智能了一些,无视整个页面的加载,只要需要的元素存在了,就结束等待。
from
selenium.webdriver.support.wait
import
WebDriverWait
WebDriverWait(driver, timeout, poll_frequency
=
0.5
, ignored_exceptions
=
None
)
- driver:不用说了,你定义的WebDriver浏览器(Chrome,Firefox等)
- timeout:最长等待时间,单位为秒
- poll_frequency:间隔查找元素的时间,默认为0.5秒(不设定就是0.5秒),也就是说默认0.5秒去查看一次要查找的元素是否存在,找到了就结束整个显性等待,否则继续等待0.5秒再查找一次
- ignored_exceptions=None:超时发送的异常信息,默认发送NoSuchElementException
由于显性等待可能需要确认元素是否存在,一般还要配合以下两个方法使用
until(method, message
=
'')
until_not(method, message
=
'')
- method:until()的method意为将驱动程序提供的方法作为参数调用,直到返回为not False,until_not()的method就是直到返回为False
- message:超时传的异常信息
注意,method()必须是可调用的方法,要有__call__()方法。
# coding = utf-8
from
selenium
import
webdriver
from
selenium.webdriver.support.wait
import
WebDriverWait
import
time
driver
=
webdriver.Chrome()
class
button():
def
__call__(
self
, driver):
if
driver.find_element_by_id(
'js_love_url'
):
return
True
else
:
return
False
driver.implicitly_wait(
60
)
time_start
=
time.time()
driver.get(
'https://www.163.com/'
)
# driver.find_element_by_id('js_love_url').click()
WebDriverWait(driver,
2
,
0.5
).until(button())
time_end
=
time.time()
print
(
'access time is : '
, time_end
-
time_start)
time.sleep(
2
)
driver.quit()
总结
1、Selenium可以采取三种等待,最智能的为显性等待WebDriverWait()
2、隐性等待和显性等待同时存在时,取两者中最长的等待时间为有效等待时间
3、显性等待中的until(method())的method()为可调用方法,可以自己定义,也可以用匿名函数等方法,这个我们以后细谈
4、隐性等待设置一次,即贯穿整个脚本始终,强制等待则必须在每个需要等待之处设置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律