赞
踩
上节讲了关于元素交互的几个基础操作。然后我们在不断的模拟用户交互的时候,有时会遇到一些问题。比如,点击刷新按钮后,页面刷新较慢,刷新的过程中,代码无法识别到元素,产生相关的报错。
这种场景我们通常是采用“等待”的方式去完成的。
这里我们介绍三种等待方式:
所谓强制等待,就是指定一个时间,我们去固定这个时间等待,等待时间完成后,再进行下一步。
比如这里的 time.sleep()方法。
这个是为了方便我截图,在完成交互后,等待2s,展示页面,再去关闭会话。
上面介绍的强制等待呢,在某些场景是不太好用的。
比如一个页面刷新,可能要1-10s,你不知道它每次到底多少秒,为了保证脚本顺利跑完不报错,你可能会设置成最大值10s。那么就会导致脚本的运行效率极低,因为你每次都是按最大等待时长去进行等待的。
这里官方提供了2种等待方式——显式等待、隐式等待,可以在元素刷新出现后,停止等待,直接运行接下来的操作。
WebDriverWait()
它允许您的代码暂停程序执行,或冻结线程,直到满足通过的 条件 。
这个条件会以一定的频率一直被调用,直到等待超时。
默认检测频率为0.5s,默认抛出异常为:NoSuchElementException。
- from selenium.webdriver.support.wait import WebDriverWait
-
- WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
-
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常
配合until()方法使用
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
- from selenium import webdriver
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.common.by import By
- WebDriverWait(driver, 20).until(EC.visibility_of_element_located(locator))
这里的visibility_of_element_located ,指元素存在且可见
三、隐式等待
implicitly_wait()
设置的全局等待,对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
driver.implicitly_wait(10)
设置全页面超时时间为10秒
(警告: 不要混合使用隐式和显式等待。这样做会导致不可预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。