一、场景

我们在做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()