selenium学习之元素等待(四)

——为什么要设置元素等待:

  目前大多数web应用程序都是使用AJAX和JavaScript开发,每次加载一个网页,包括静态网页和动态网页,也就是加载各种HTML标签和JS文件。在网页中进行元素定位时,有可能打开了网页但是元素未加载出来,这时进行元素定位可能会出现错误。所以,设置元素等待(等待元素加载完成再去定位)是非常有必要的。

(1)隐式等待(相当于全局变量)

  隐式等待会告诉webdriver等待一段时间后查找元素。默认等待时间为0,一旦设置了隐式等待,它会对整个webdriver周期起作用。如果在规定时间内,整个网页都加载完成,就执行下一步,否则抛出异常。

        缺点:无论需要定位的元素是否被加载完成,都会等待整个网页完全加载出来。

1 from selenium import webdriver
2 
3 driver = webdriver.Chrome()    # 创建有界面的浏览器对象
4 driver.implicitly_wait(10)    # 设置隐式等待时间为10秒
5 driver.get("//www.baidu.com/")    # 请求页面
6 input = driver.find_element_by_id("kw")    # 根据id值定位输入框

 

(2)显示等待(推荐    相当于局部变量)

  显示等待只对指定元素有效,不再是对整个webdriver周期起作用。根据需要定位的元素来设置显示等待,无需等待整个网页加载完成,节省加载时间。(只需要等待定位元素加载完成)

设置显示等待的方法:

    WebDriverWait(driver, 超时时间,调用频率,可忽略的异常).until(要采用的方法,超时情况下返回信息)

  调用WebDriverWait方法时,大多情况下只需要设置前两个参数:第一个参数时申明的浏览器对象;第二个参数时设置的最大显示等待时间。调用频率默认0.5s,可忽略的异常默认NoSuchElementException。

  excepted_conditions是selenium中的一个模块,包含一系列用于判断的条件类,一共26个类。其中presence_of_element_located((tuple))

传入参数是一个tuple,用于定位元素。

 

 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By    # 用于定位元素
 3 from selenium.webdriver.support.wait import WebDriverWait    # 用于设置显示等待
 4 from  selenium.webdriver.support import expected_conditions as EC    # 用于判断定位元素是否被加载完成
 5 
 6 driver = webdriver.Chrome()    # 创建有界面的浏览器对象
 7 driver.get("//www.zhihu.com/explore")    # 请求页面
 8 # 设置元素等待实例,最多等待10s,每隔0.5s查看条件是否成立
 9 wait = WebDriverWait(driver, 10)
10 input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
11 button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
12 print(input, button)

 

 

——如果不设置元素等待,可以使用强制等待(调用time模块的sleep方法):

        缺点:无论网页、元素是否被加载完成,都会等待指定时间。

 1 from selenium import webdriver
 2 import time
 3 
 4 driver = webdriver.Chrome()    # 创建有界面的浏览器对象
 5 driver.get("//www.baidu.com/")    # 请求页面
 6 input = driver.find_element_by_id("kw")    # 根据id值定位输入框
 7 input.send_keys("动物")    # 输入搜索关键字
 8 time.sleep(3)    # 强制等待3秒
 9 input.clear()    # 删除输入内容
10 input.send_keys("孔雀")    # 重新输入搜索关键字
11 button = driver.find_element_by_id("su")    # 根据id值定位搜索按钮
12 button.click()   # 点击
13 driver.close()    # 关闭页面

 

总结:

(不推荐)强制等待:无论网页、定位元素是否加载完成,都必须等待设置的时长;

(不推荐)隐式等待:无论定位元素是否加载完成,都必须等待整个网页加载完成;

(推荐)   显示等待:只需要等待定位元素加载完成。