等待机制
因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3)
,睡几秒,也就是设置线程等待,等这个标签加载出来之后,再去使用。这么着虽然简单,但是相对死板,因为我们不知道这个标签什么时候加载出来,就大概写死睡个几秒,这可以,但如果这个标签在极短的时间内就加载出来了,而你还在睡.......
显示等待机制
实例
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC #判断
from selenium.webdriver.support.ui import webdriverwait # 显式等待
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
wait = webdriverwait(driver, 10, 0.5)
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Na_years")
driver.find_element_by_id("su").click()
wait.until(EC.presence_of_element_located((By.LINK_TEXT, 'Na_years - 博客园'))).click()
#EC判断页面是否加载完成,加载完成就打开
time.sleep(3)
driver.quit()
参数
selenium提供了
webdriverwait类实现等待机制。该类接收4个参数来指定等待机制。
from selenium import webdriver
from selenium.webdriver.support.ui import webdriverwait
driver = webdriver.Chrome()
webdriverwait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=None)
- driver,浏览器驱动
- timeout,最长超时时间,单位(秒)
- poll_frequency,轮询检测时间,也就是每隔多少时间检测一次,默认是0.5秒
- ignored_exceptions,超时后的异常信息,默认抛出NoSuchElementException
方法
- until(self, method, message=''),method为需要提供的驱动程序,直到返回True,用的较多。
- until_not(self, method, message=''),method为需要提供的驱动程序,直到返回False
上面用到的method驱动程序为expected_conditions
重命名后的EC
,并调用其presence_of_element_located
方法判断指定元素是否存在。
expected_conditions
模块提供了各种判断:
presence_of_element_located
判断某个元素是否被加到了dom树里,并不代表该元素一定可见presence_of_elements_located
判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
隐示等待机制
与显式等待不同的是,隐式等待我们可以直接通过浏览器驱动对象调用,并且用法也相对简单:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(time_to_wait=10) # 只需要一个等待超时时间参数
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Na_years")
driver.find_element_by_id("su").click()
print(driver.title)
driver.find_element_by_link_text("Na_years - 博客园").click()
time.sleep(3)
driver.quit()
implicitly_wait
等待时间单位为秒,如上例所示,我们指定了10秒。需要注意的是,隐式与显式等待有明显的区别,隐式等待应用于全局,每当使用driver
驱动找某个元素时,隐式等待机制就会被触发(导致测试速度变慢),如果元素存在,则继续执行,否则,它将以轮询的方式判断元素是否定位成功,直至等待超时,抛出错误NoSuchElementException
。而显式等待则只是指定某(些)个元素是否存在时执行。
休眠机制
使用Python提供的休眠机制(也就是time模块),这没啥可说的,睡就完了,想在哪等就在哪等.......
import time
time.sleep(1)
在等待机制的选择上,我们可以在三种等待机制中灵活选择:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。