一、前言

我们在定位元素的时候往往会碰到元素加载慢的情况,如果元素没有加载出来而进行点击操作的话,是无法点击的。我们前面一直用time.sleep()方法进行页面等待的,其中这种方法就是元素等待的一种,这节课我们主要讲一下所有元素等待的方式,这也是面试中常问的知识点。

二、学习目标

1.强制等待

2.隐性等待

3.显性等待

三、知识点

1.【强制等待】

第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),不管是元素加没加载出来,都必须等xx时间。不过不建议总用这种等待方式,太死板,严重影响程序执行速度。

  • 语法:
time.sleep(3)
  • 代码示例:
# 导入webdriver
import time
from selenium import webdriver
#获取驱动路径
driver_path = './chromedriver.exe'
#创建一个浏览器对象
driver = webdriver.Chrome(executable_path=driver_path)
#设置全屏
driver.maximize_window()
#请求
driver.get('http://sahitest.com/demo/waitFor.htm')

#点击Click me按钮
driver.find_element("xpath",".//input[@value='Click me']").click()
#强制等待3秒
time.sleep(3)
#获取输出文本
text = driver.find_element("id","id2").text
print(text)

2.【隐性等待】

隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢。

  • 语法:
driver.implicitly_wait(5)
  • 代码示例:
# 导入webdriver
import time
from selenium import webdriver
#获取驱动路径
driver_path = './chromedriver.exe'
#创建一个浏览器对象
driver = webdriver.Chrome(executable_path=driver_path)
#设置全屏
driver.maximize_window()
#请求
driver.get('http://sahitest.com/demo/waitFor.htm')

#点击Click me按钮
driver.find_element("xpath",".//input[@value='Click me']").click()
#隐式等待
driver.implicitly_wait(5)
#获取输出文本
text = driver.find_element("id","id2").text
print(text)

3.【显性等待】

显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException异常。

  • 语法:
WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator))
  • 代码示例:
# 导入webdriver
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#获取驱动路径
driver_path = './chromedriver.exe'
#创建一个浏览器对象
driver = webdriver.Chrome(executable_path=driver_path)
#设置全屏
driver.maximize_window()
#请求
driver.get('http://sahitest.com/demo/waitFor.htm')

#点击Click me按钮
driver.find_element("xpath",".//input[@value='Click me']").click()
#隐式等待
locator = ("id","id2")
WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator))
#获取输出文本
text = driver.find_element("id","id2").text
print(text)