我们为什么需要等待?因为浏览器要进行数据的传输,需要时间,就像我们打开网页一样,需要等待它加载完所有的页面元素,我们才进行操作或点击等。为了我们页面的稳定性,这个等待是必不可少的
selenium里面给我们提供了三个等待方法:
1.强制等待sleep
2.隐性等待.implicitly_wait()
3.显性等待 WebDriverWait().until()/until_not (重点讲)
1.强制等待 sleep
导入impor time 在代码里面是time.sleep(*),这里的 * 是已秒来计算,假如你输入的1,那么就是等待1秒,输入0.5,那么就是强制等待0.5秒
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com") # 静态页面加载完成
time.sleep(2) # 等待两秒,执行下一步操作
driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()
2.隐性等待.implicitly_wait()
隐性等待也称之为全局变量。一般放在请求url之后,只需要写一次就行了。 这也是秒计算
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com") # 静态页面加载完成
driver.implicitly_wait(30) #隐性等待30秒,
driver.find_element_by_xpath('//div[@id="u1"]//a[@class="lb"]').click()
元素元素可见时,直接点击,要是30秒内元素不可点击,那等待30秒。30秒过后,元素还是不可点击,那就会报错。
3.显性等待 WebDriverWait().until()/until_not()
显性等待称之为 智能等待。
智能等待:明确的条件(元素可见、元素存在、元素可用等),
表达式:WebDriverWait(驱动程序,等待时间).until(条件)until_not(条件)
原理:时间+条件。打个比方:在规定的时间内,元素要是可见/存在/可用,那就点击。要是元素在规定的时间外,没有可见/存在/可用的话,那就会报错: TimeoutException
那什么是元素可见、元素存在、元素可用呢?
元素存在(html里存在,能找到)
元素可见(存在并且可见-看得见大小-可见才可操作)
元素可用(可见之后,才有可用的可能性、只读/不可点击)
我们需要导入
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #命名为EC,因为名字太长了
from selenium.webdriver.common.by import By
代码:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #命名为EC,因为名字太长了
from selenium.webdriver.common.by import By
# 浏览器会话的开始
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
locator = (By.XPATH,'//div[@id="u1"]//a[@class="lb"]')
#等待30秒,元素可见就点击
WebDriverWait(driver,30).until(EC.visibility_of_element_located(locator)) #visibility_of_element_located -- 元素可见
driver.find_element_by_xpath('//div[@id="u1"]//a[@class="lb"]').click()
在工作中,我们用到最多的是显性等待,三个等待假如用到一个py文件里,是互不影响的。
扩展:为什么driver.get为什么不需要等待操作?
因为在python的代码里面,.get()访问浏览器是一直等到页面元素加载完后,才进行操作,只有.get()这个方法里面才会有这样的机制