显性等待
webdriver等待某个条件成立则继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)
webdriver 中提供了WebDriverWait()显示等待方法
还可以利用is_displayed()实现显示等待
from selenium import webdriver
from time import sleep, ctime
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
print(ctime())
for i in range(10):
try:
el = driver.find_element_by_id("kw22")
# is_displayed():判断元素是否可见
if el.is_displayed():
break
except:
pass
sleep(1)
else:
print("time out")
print(ctime())
driver.quit()
执行结果如下:
Tue Sep 10 14:47:30 2019
time out
Tue Sep 10 14:47:41 2019
2.隐式等待
webdriver中的implicitly_wait()方法可用来实现隐式等待。
from time import ctime
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Firefox()
# 设置隐式等待10s
# 1.这10s并非固定等待时间,它并不影响脚本的执行速度。
# 2.它会等待页面上的所有元素
# 3.当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,则以轮询的方式不断地判断元素是否存在
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
print(ctime())
driver.find_element_by_id("kw22").send_keys("selenium")
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
执行结果为:
Tue Sep 10 15:58:03 2019
Message: Unable to locate element: [id="kw22"]
Tue Sep 10 15:58:13 2019