一、场景
我们在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间。
二、强制等待
1、利用time模块的sleep方法来实现,最简单粗暴的方法。
2、不管浏览器是否加载完成,都强制等待5s,时间一到,就会执行下面的代码,不建议使用这种等待方式,因为严重影响代码的执行速度
import time
from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()
# 打开百度网页
driver.get("https://www.baidu.com")
# 定位输入框输入内容
driver.find_element("id","kw").send_keys("测试工程师")
# 等待5s
time.sleep(5)
#退出浏览器
driver.quit()
三、隐性等待
设置一个隐性等待时间10s,如果在这个时间内,网页加载完成,就会执行下一步操作,否则一直等到超时,然后再执行下一步操作,这种等待方式也会存在一个弊端,程序会一直等待整个页面加载完成,直到超时,但是有时候我们需要的哪一个元素,已经加载完成了,只是页面其他元素加载比较慢,我仍要等待所有的元素加载完成才会执行下一步。特点:全局设置,设置一次就够了
import time
from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()
# 打开百度网页
driver.get("https://www.baidu.com")
# 隐性等待10s
driver.implicitly_wait(10)
# 定位输入框输入内容
driver.find_element("id","kw").send_keys("中国")
# 定位百度一下 点击按钮
driver.find_element('id','su').click()
# 点击搜索结果页的超文本链接,跳转新窗口
driver.find_element("xpath","//a[text()='中国政府网']").click()
# 等待5s
time.sleep(5)
#退出浏览器
driver.quit()
四、显性等待
1、上面提到了隐性等待存在的弊端,如果想等自己想要的元素被加载出来就执行下一步操作,这个时候就用到显性等待了
2、显性等待需要用到WebDriverWait,配合该类的unitl()和unitl_not()方法来使用
3、timeout=10---设置超时时间,poll_frequency=0.5---每隔多秒检测一次,可不传,有默认值。
4、还需要导入一个类expected_conditions,来使用他里面的定位元素方法。
5、TimeoutException 超时会抛出超时异常
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
# 启动浏览器
driver = webdriver.Chrome()
# 打开百度网页
driver.get("https://www.baidu.com")
# # 隐性等待10s
# driver.implicitly_wait(10)
# 定位输入框输入内容
driver.find_element("id","kw").send_keys("中国")
# 定位百度一下 点击按钮
driver.find_element('id','su').click()
# 初始化一个等待器
wait = WebDriverWait(driver,timeout=10,poll_frequency=0.5)
wait.until(expected_conditions.element_to_be_clickable(("xpath","//a[text()='中国政府网']")))
# 点击搜索结果页的超文本链接,跳转新窗口
driver.find_element("xpath","//a[text()='中国政府网']").click()
# 等待5s
time.sleep(5)
#退出浏览器
driver.quit()